실시간 알림용 WebSocket이 nginx를 거치면 1분쯤 지나 조용히 끊기거나 가끔 502가 납니다. 직접 앱에 붙으면(프록시 우회) 멀쩡합니다.
location /ws {
proxy_pass http://app;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
업그레이드 헤더는 넣었는데 왜 일정 시간 후 끊길까요?
환경: nginx 1.26, Node ws 서버
댓글 2
업그레이드 헤더는 맞게 넣으셨고, 끊기는 주범은 proxy read/send timeout(기본 60초)입니다. WebSocket은 idle 구간이 길 수 있는데, 그 시간 동안 데이터가 없으면 nginx가 업스트림 연결을 닫아버립니다.
다만 timeout만 늘리는 건 반쪽입니다. 애플리케이션 레벨 ping/pong heartbeat(20~30초 간격)를 같이 두세요. 그래야 ① 죽은 연결을 빨리 감지하고 ② 중간 장비(L4/LB)들의 idle 종료도 함께 막습니다.
502가 섞여 나는 건 업스트림이 먼저 닫은 연결로 nginx가 쓰려다 실패하는 경우가 많은데, heartbeat로 연결 상태를 맞추면 같이 줄어듭니다.