[AWS] Nginx에서 SSE(Server-Sent Events) 즉시 전송 설정하기

지쥬·2025년 8월 13일

AWS

목록 보기
2/4
post-thumbnail

1. 문제 상황

  • 서버에서 SSE(text/event-stream)로 로그를 실시간 전송하는 API가 있음.

  • 브라우저에서는 로그가 바로 안 뜨고 지연되거나, 아예 중간에 끊기는 현상 발생.


원인은 Nginx의 기본 버퍼링 / 압축 때문에 스트리밍이 즉시 전달되지 않음.


2. 해결 과정

1) 원인 분석

  • proxy_buffering이 기본 on → 버퍼가 다 찰 때까지 응답을 모아둔다.

  • gzip이 on → 압축 버퍼링이 추가로 발생.

=> SSE 특성상 한 줄 한 줄 즉시 전송이 중요한데, 이 두 옵션이 방해.

2) Nginx 설정 수정

  • /api/crawl/logs/stream 전용 location 블록을 만들고, 스트리밍 관련 옵션 추가.

  • 80 → 443 리다이렉트도 함께 반영.

# HTTP → HTTPS 리다이렉트
server {
    listen 80;
    server_name test.co.kr;
    return 301 https://$host$request_uri;
}

# HTTPS 서버
server {
    listen 443 ssl http2;
    server_name test.co.kr;

    ssl_certificate     /etc/letsencrypt/live/test.co.kr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/test.co.kr/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;

    # ★ SSE 전용 API
    location /api/crawl/logs/stream {
        proxy_pass         http://localhost: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_buffering           off;   # 버퍼링 금지
        proxy_request_buffering   off;
        proxy_cache               off;
        gzip                      off;   # 압축 금지
        add_header X-Accel-Buffering no always;

        proxy_read_timeout  3600s;
        proxy_send_timeout  3600s;
        chunked_transfer_encoding on;
    }

    # 일반 API 및 웹
    location / {
        proxy_pass         http://localhost:3000;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

3. 테스트

sudo nginx -t && sudo systemctl reload nginx
curl -i -N "https://test.co.kr/api/crawl/logs/stream?jobId=oy-xxxxxxxx"
  • 정상: 응답 헤더에 Content-Type: text/event-stream와 X-Accel-Buffering: no 확인

  • 본문이 data: 또는 :로 바로 전송됨

0개의 댓글