본문 바로가기
Q&A해결2026년 6월 9일1분 읽기

nginx 뒤 WebSocket이 1분쯤 지나면 끊깁니다 — 502/연결 종료

소
소켓도현
조회 306댓글 2

실시간 알림용 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

김김영삼4개월 전

업그레이드 헤더는 맞게 넣으셨고, 끊기는 주범은 proxy read/send timeout(기본 60초)입니다. WebSocket은 idle 구간이 길 수 있는데, 그 시간 동안 데이터가 없으면 nginx가 업스트림 연결을 닫아버립니다.


location /ws {
proxy_pass http://app;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;

proxy_read_timeout 3600s; # idle 허용 시간↑
proxy_send_timeout 3600s;
}

다만 timeout만 늘리는 건 반쪽입니다. 애플리케이션 레벨 ping/pong heartbeat(20~30초 간격)를 같이 두세요. 그래야 ① 죽은 연결을 빨리 감지하고 ② 중간 장비(L4/LB)들의 idle 종료도 함께 막습니다.


// ws 서버: 30초마다 ping, pong 없으면 terminate
const iv = setInterval(() => {
wss.clients.forEach(c => {
if (!c.isAlive) return c.terminate()
c.isAlive = false; c.ping()
})
}, 30000)

502가 섞여 나는 건 업스트림이 먼저 닫은 연결로 nginx가 쓰려다 실패하는 경우가 많은데, heartbeat로 연결 상태를 맞추면 같이 줄어듭니다.

소소켓도현(guest)4개월 전
read_timeout 늘리고 30초 heartbeat 넣으니 몇 시간째 안 끊깁니다. 502도 사라졌고요. 감사합니다!
Ctrl+Enter로 등록