-
Notifications
You must be signed in to change notification settings - Fork 1
[BE] Nginx 로드 밸런싱 중 Socket bad Request 발생하는 현상
박진명 edited this page Dec 3, 2024
·
1 revision
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)
- [FE] 프론트엔드 기술스택
- [FE] 라이브러리 없이 차트 구현 이유
- [FE] Canvas API 사용방법
- [FE] 네비게이션 바 애니메이션 구현
- [FE] Socket.io 사용방법
- [FE] Tanstack Router에 대하여...
- [FE] Intl(Internationalization) API
- [FE] React Suspense 적용
- [FE] 한글 입력 방식의 유연성을 높인 검색 시스템 구현하기
- [BE] 백엔드 기술 스택
- [BE] SSE vs Socket.io
- [BE] Redis를 도입하게 된 계기
- [BE] ACG Rule을 활용한 Secure CI CD 파이프라인 구현
- [BE] Nginx 로드밸런싱을 통해 한국 투자 API 소켓 제한 극복
- [BE] 주가 지수 기능 개발 과정
- [BE] 매수 및 매도 기능 개발 과정
- [BE] 실시간 자산 조회 기능 개발 과정
- [BE] 단위 테스트
- [BE] redis를 이용한 한국투자 Open API 세션 관리
- [BE] 데이터베이스 인덱싱
- [FE] React에서의 DOM 요소 접근 (useRef vs getElementById)
- [FE] Outlet을 활용한 공통 레이아웃 관리
- [FE] react hooks가 특정 조건에서 실행되면 안되는 이유 & useQuery에 query function 매개변수가 undefined일 수도 있을 때 어떻게 해결할까
- [FE] cross‐domain 로컬 환경에서 cookie로 인증 처리하기 with vite proxy
- [FE] 크롬&사파리 Composition 차이
- [FE] useEffect 의존성 배열
- [BE] Naver Cloud Platform HTTPS 무응답 현상
- [BE] 한국투자 Open API에서 access token을 발급받지 못하는 문제
- [BE] 한국투자 Open API와 웹소켓 연결이 되지 않던 문제
- [BE] 한국투자 Open API 웹소켓 연결이 중단되는 문제
- [BE] 같은 주식 주문이 동시에 여러 번 체결되는 문제
- [BE] 한국투자 Open API Websocket 세션을 두 개에서 한 개로 변경하기
- [BE] Nginx 로드 밸런싱 중 Socket bad Request 발생하는 현상
- [BE] 매수/매도 체결 로직에 의해 redis pub/sub이 정상적으로 동작하지 않는 문제