Skip to content

[BE] Nginx 로드 밸런싱 중 Socket bad Request 발생하는 현상 

박진명 edited this page Dec 3, 2024 · 1 revision

💣 문제 상황

image

Nginx를 통해 여러 docker에서 was를 실행하고 부하를 분산했지만 위와 같이 socket 연결에 대한 요청에 bad request 가 발생함을 알게 되었다.

✨ 해결 과정

이에 여러 방면에서 시도해보던 중에 sticky session에 대해서 알게 되었다.

round robin 방식을 통해 nginx에서 여러 서버에 부하를 분산하는 경우 HTTP Request, response 는 문제가 없지만 socket의 경우에 서버에 분산됨에 따라 session 관리에 문제가 발생하는 것을 확인하였다.

이에 로드 밸런싱 방식을 Round Robin에서 IP 해시 방식으로 바꿈으로서 특정 클라이언트는 항상 동일한 서버로 연결되도록 하여 세션을 유지할 수 있도록 하였다.

    upstream backend_servers {
        ip_hash;
        server juga-docker-be-1:3000 max_fails=3 fail_timeout=30s;
        server juga-docker-be-2:3000 max_fails=3 fail_timeout=30s;
        server juga-docker-be-3:3000 max_fails=3 fail_timeout=30s;
    }

클라이언트 IP에 따라 분산되어지는 요청

[27/Nov/2024:00:53:00 +0000] 182.219.66.189 - - - juga.kro.kr to: 172.18.0.6:3000: GET /socket.io/?EIO=4&transport=websocket&sid=39iV4Ph6uiqFMBIHAAEF HTTP/1.1 upstream_response_time 2323.415 msec 1732668780.083 request_time 2323.414 status: 101
[27/Nov/2024:00:57:05 +0000] 220.122.191.155 - - - juga.kro.kr to: 172.18.0.5:3000: GET /socket.io/?EIO=4&transport=websocket&sid=7DbV9pbfrCPJ1i_iAADt HTTP/1.1 upstream_response_time 420.965 msec 1732669025.156 request_time 420.965 status: 101
[27/Nov/2024:00:58:00 +0000] 220.122.191.155 - - - juga.kro.kr to: 172.18.0.5:3000, 172.18.0.6:3000: GET /socket.io/?EIO=4&transport=polling&t=6fki8qka HTTP/1.1 upstream_response_time 3.067, 0.001 msec 1732669080.503 request_time 3.069 status: 200
[27/Nov/2024:00:58:03 +0000] 220.122.191.155 - - - juga.kro.kr to: 172.18.0.5:3000, 172.18.0.6:3000: POST /socket.io/?EIO=4&transport=polling&t=6fmwvhpj&sid=sXwM4D5Us-ZB16SJAAFZ HTTP/1.1 upstream_response_time 3.052, 0.001 msec 1732669083.575 request_time 3.054 status: 200
[27/Nov/2024:00:58:03 +0000] 220.122.191.155 - - - juga.kro.kr to: 172.18.0.5:3000, 172.18.0.6:3000: GET /socket.io/?EIO=4&transport=polling&t=6fmwx487&sid=sXwM4D5Us-ZB16SJAAFZ HTTP/1.1 upstream_response_time 3.030, 0.003 msec 1732669083.577 request_time 3.034 status: 200
[27/Nov/2024:00:58:03 +0000] 220.122.191.155 - - - juga.kro.kr to: 172.18.0.5:3000, 172.18.0.6:3000: GET /socket.io/?EIO=4&transport=polling&t=6ezoii0q HTTP/1.1 upstream_response_time 33.137, 0.004 msec 1732669083.577 request_time 33.141 status: 200
[27/Nov/2024:00:58:03 +0000] 220.122.191.155 - - - juga.kro.kr to: 172.18.0.6:3000: GET /socket.io/?EIO=4&transport=polling&t=6fpa9l65&sid=sXwM4D5Us-ZB16SJAAFZ HTTP/1.1 upstream_response_time 0.100 msec 1732669083.693 request_time 0.100 status: 200
[27/Nov/2024:00:58:14 +0000] 220.122.191.155 - - - juga.kro.kr to: 172.18.0.5:3000, 172.18.0.6:3000: GET /socket.io/?EIO=4&transport=polling&t=6eh5omkr HTTP/1.1 upstream_response_time 67.975, 0.001 msec 1732669094.422 request_time 67.975 status: 200

👓 참고 자료

[[NW]로드밸런싱(Round Robin, hash)](https://uyfuyfuy-042.tistory.com/entry/NW%EB%A1%9C%EB%93%9C%EB%B0%B8%EB%9F%B0%EC%8B%B1Round-Robin-hash)

[[NCLOUD] 로드밸런서 Sticky Session 이란?](https://medium.com/brickmate-cloud/ncp-%EB%A1%9C%EB%93%9C%EB%B0%B8%EB%9F%B0%EC%84%9C-sticky-session-%EC%9D%B4%EB%9E%80-11615343bf59)

📜 개발 일지

⚠️ 트러블 슈팅

❗ 규칙

🗒️ 기록

기획
회의록
데일리스크럼
그룹 멘토링
그룹 회고

😲 개별 멘토링

고동우
김진
서산
이시은
박진명
Clone this wiki locally