---
title: "SSE(Server Sent Events) 전송 문제 해결하기 (Feat. Nginx 설정)"
description: "Nginx 뒤에 배치된 SSE 응답이 중간에 잘려 전송될 때, proxy_buffering과 X-Accel-Buffering 헤더로 해결하는 방법을 정리합니다."
created_at: 2024-12-11
category: guide
tags: ["SSE", "Server Sent Events", "Nginx", "버퍼링", "Backend", "Django"]
published: true
---
어제 [django-pyhub-ai](https://github.com/pyhub-kr/django-pyhub-ai/blob/main/src/pyhub_ai/views/chat.py#L83) 라이브러리를 서버에 배포해서 활용하고 있는데, SSE(Server Sent Events) 타입의 HTML 메시지가 잘려 전송되는 문제가 발생했습니다. 이로 인해 의도치 않은 동작과 코드 노출이 나타났습니다.

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

## 문제 상황

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

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

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

첫 번째 전송:

```
<script>
console.log
```

두 번째 전송:

```
('hello sse');
</script>
```

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

## 원인 분석

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

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

## 해결 방법

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

```nginx
proxy_buffering off;
```

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

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

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