WebSocket 완전 정복 · 3부. 심화: 확장, 인프라, 운영, 보안 · 16편 중 14편
이전 편: 13편 — 백프레셔와 흐름 제어
12편과 13편이 서버 안에서 연결을 다루는 이야기였다면, 이번 편은 연결이 서버에 닿기까지 지나는 길입니다 — Nginx와 로드밸런서, 그리고 서버가 올라탄 OS가 WebSocket에 거는 제약을 설정과 수치 단위로 봅니다.
Nginx — Upgrade는 hop-by-hop 헤더다
Upgrade/Connection은 hop-by-hop 헤더라 기본 전달되지 않으므로 명시 설정 필요.
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream ws_backend {
server 10.0.0.11:8080;
server 10.0.0.12:8080;
}
server {
listen 443 ssl;
server_name app.example.com;
location /ws {
proxy_pass http://ws_backend;
proxy_http_version 1.1; # Upgrade는 HTTP/1.1 필요
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 3600s; # 기본 60s: 유휴 연결이 끊김
proxy_send_timeout 3600s;
}
}타임아웃을 늘려도 하트비트는 유지. 경로상 다른 장비(방화벽, 클라우드 LB, 회사 프록시)도 각자의 유휴 타임아웃이 있습니다.
로드밸런서 — L7과 L4
L7은 Upgrade 지원 + 유휴 타임아웃 조정 가능해야 함. L4는 문제 적지만 클라이언트 IP 보존에 PROXY protocol 필요할 수 있음.
OS 한계
- 연결 1개 = 파일 디스크립터 1개.
ulimit -n기본 1024인 경우가 많음 →EMFILE. systemdLimitNOFILE, Docker--ulimit nofile로 상향. - 프록시→백엔드 연결은 에페메랄 포트(기본 약 28,000개)가 백엔드 IP:포트당 상한. 백엔드 IP/포트 다중화 또는
net.ipv4.ip_local_port_range확장.
메모리 산정
커널 소켓 버퍼 + 라이브러리 객체 + 앱 상태. 1만 연결을 붙이고 RSS 실측이 가장 정확.
Node.js 특성
단일 이벤트 루프 → 무거운 동기 작업이 전체 연결을 멈춤. CPU 작업은 워커 스레드/별도 서비스로. 멀티코어는 다중 프로세스 + 백플레인.
더 깊이
- 풀스택 개발자를 위한 네트워크 10장 — 인프라 구성요소: 프록시, 로드밸런서, CDN, 게이트웨이: CDN부터 리버스 프록시까지 요청이 지나는 전체 경로입니다. 이 편의 Upgrade 헤더와 유휴 타임아웃이 그 경로의 어느 화살표 위에서 걸리는지 보입니다.
- 풀스택 개발자를 위한 인프라 3강 — 웹서버와 리버스 프록시: 같은 Nginx 설정을 파일 단위로 직접 써 보는 실습 편입니다.
map블록이server가 아니라http컨텍스트에 있어야 한다는 점도 거기서 다룹니다.