스킬.잇다
guide

SSE(Server Sent Events) 전송 문제 해결하기 (Feat. Nginx 설정)

Nginx 뒤에 배치된 SSE 응답이 중간에 잘려 전송될 때, proxy_buffering과 X-Accel-Buffering 헤더로 해결하는 방법을 정리합니다.

나무 책상 위 구불구불한 코퍼 파이프와 활짝 열린 중앙 밸브를 통해 번트 오렌지·마멀레이드 빛 데이터 입자가 끊김 없이 흐르는 수채 일러스트 [코퍼 오렌지 악센트] — AI generated by gemini-3.1-flash-image-preview (약 127원)
나무 책상 위 구불구불한 코퍼 파이프와 활짝 열린 중앙 밸브를 통해 번트 오렌지·마멀레이드 빛 데이터 입자가 끊김 없이 흐르는 수채 일러스트 [코퍼 오렌지 악센트]
AI generated by gemini-3.1-flash-image-preview (약 127원)

어제 django-pyhub-ai 라이브러리를 서버에 배포해서 활용하고 있는데, SSE(Server Sent Events) 타입의 HTML 메시지가 잘려 전송되는 문제가 발생했습니다. 이로 인해 의도치 않은 동작과 코드 노출이 나타났습니다.

📦 원본 아카이브: 이 글은 과거 pyhub.kr에서 운영하던 Recipe 시리즈의 글을 복원한 것입니다. 원본 URL(/recipe/EaVrv6nz6GoAJ/)로 접근하더라도 이 페이지로 자동 연결됩니다.

문제 상황

SSE 응답으로 아래와 같은 코드가 전송되어야 합니다:

<script>
console.log('hello sse');
</script>

그러나 실제로는 다음과 같이 두 번에 나뉘어 전송되었습니다.

첫 번째 전송:

<script>
console.log

두 번째 전송:

('hello sse');
</script>

이로 인해 자바스크립트가 정상적으로 실행되지 않고, 코드가 그대로 화면에 출력되는 문제가 발생했습니다.

원인 분석

문제를 확인하기 위해 다음 사항들을 점검했습니다.

  • Gunicorn/Uvicorn 문제 여부: 로컬 환경에서는 동일한 문제가 재현되지 않았습니다.
  • Nginx 버퍼링 설정: 원인은 Nginx의 버퍼링 기능 때문이었습니다. Nginx가 SSE 응답을 중간에 버퍼링하면서 데이터가 잘려 전송되었습니다.

해결 방법

1. Nginx 버퍼링 비활성화 — 아래 설정을 추가하여 Nginx에서 프록시 버퍼링을 끌 수 있습니다.

proxy_buffering off;

2. SSE 응답 헤더 설정 — Nginx 공식 문서에 따르면, X-Accel-Buffering: no 응답 헤더를 통해 버퍼링 동작을 제어할 수 있습니다. SSE 타입의 HTMX 응답에서는 다음과 같이 헤더를 지정하는 것을 추천합니다.

response['X-Accel-Buffering'] = 'no'

X-Accel-Buffering 헤더는 Nginx에서 프록시된 응답의 버퍼링을 제어합니다. X-Accel-Buffering: no로 설정하면 Nginx는 해당 응답을 버퍼링하지 않고 즉시 클라이언트로 전달하기 때문에, Server-Sent Events(SSE)와 같이 실시간 데이터 전송이 필요한 경우에 유용합니다.

질문이나 의견이 있으시면 dev@itda.work 로 메일 주세요.