← posts/b.log()

blog92@web:~$ cat posts/websocket-14-infrastructure-proxy-lb-os.md

NETWORK2 min read

WebSocket 완전 정복 14편 — 인프라: Nginx, 로드밸런서, 그리고 OS 한계

Upgrade와 Connection이 hop-by-hop 헤더라 기본 전달되지 않는다는 사실에서 출발해 Nginx 설정을 줄 단위로 읽고, L7과 L4 로드밸런서의 차이, 파일 디스크립터와 에페메랄 포트라는 OS 한계, 메모리 산정과 Node.js 단일 이벤트 루프의 특성을 다룹니다.

WebSocket 완전 정복 · 3부. 심화: 확장, 인프라, 운영, 보안 · 16편 중 14편

이전 편: 13편 — 백프레셔와 흐름 제어

12편과 13편이 서버 안에서 연결을 다루는 이야기였다면, 이번 편은 연결이 서버에 닿기까지 지나는 길입니다 — Nginx와 로드밸런서, 그리고 서버가 올라탄 OS가 WebSocket에 거는 제약을 설정과 수치 단위로 봅니다.

Nginx — Upgrade는 hop-by-hop 헤더다

Upgrade/Connection은 hop-by-hop 헤더라 기본 전달되지 않으므로 명시 설정 필요.

nginx
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. systemd LimitNOFILE, Docker --ulimit nofile로 상향.
  • 프록시→백엔드 연결은 에페메랄 포트(기본 약 28,000개)가 백엔드 IP:포트당 상한. 백엔드 IP/포트 다중화 또는 net.ipv4.ip_local_port_range 확장.

메모리 산정

커널 소켓 버퍼 + 라이브러리 객체 + 앱 상태. 1만 연결을 붙이고 RSS 실측이 가장 정확.

Node.js 특성

단일 이벤트 루프 → 무거운 동기 작업이 전체 연결을 멈춤. CPU 작업은 워커 스레드/별도 서비스로. 멀티코어는 다중 프로세스 + 백플레인.

더 깊이

COMMENTS (…)

댓글을 불러오는 중이에요.

NEW COMMENT0 / 1000
⌘↵ 전송

blog92@web:~$ cd ..