맛추리 프로젝트에서 SSE를 사용하던 중 문제가 발생했고 이를 기반으로 정리했다.
Nginx 리버스 프록시 환경에서 SSE를 사용시 아래와 같은 설정이 요구된다.
location = /api/v1/realtime/events {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
proxy_cache off;
gzip off;
proxy_read_timeout 1h;
proxy_send_timeout 1h;
add_header X-Accel-Buffering no always;
}주요 설정 상세 설명
Nginx가 백엔드 응답을 모아서 보내지 않고 바로바로 클라이언트로 흘려보내야 하기에
프록시 서버에서 버퍼링을 사용하지 않는다.
proxy_buffering off;압축 과정에서 스트리밍 응답이 버퍼링될 수 있기에 SSE에서는 비활성화.
gzip off;백엔드에서 일정 시간 동안 데이터가 안오면 Ngnix가 연결을 끊기에 최소 하트비트 주기보다는 훨씬 길게 잡는다.
proxy_read_timeout 1h;Nginx 앞단에 있는 다른 네트워크 장비(또 다른 프록시, CDN 등)에게도 버퍼링을 하지 말고 바로 응답을 클라이언트로 넘기도록 강제 지시한다.
add_header X-Accel-Buffering no always;