`X-Accel-Buffering` 헤더는 Nginx에서 프록시된 응답의 버퍼링을 제어합니다. `X-Accel-Buffering: no`로 설정하면 Nginx는 해당 응답을 버퍼링하지 않고 즉시 클라이언트로 전달합니다. 이는 Server-Sent Events(SSE)와 같이 실시간 데이터 전송이 필요한 경우에 유용합니다.
어제 django-pyhub-ai 라이브러리를 서버에 배포해서 활용하고 있는 데, SSE(Server Sent Events) 타입의 HTML 메시지가 잘려 전송되는 문제가 발생했습니다. 이로 인해 의도치 않은 동작과 코드 노출이 나타났습니다.
SSE 응답으로 아래와 같은 코드가 전송되어야 합니다:
<script>
console.log('hello sse');
</script>
그러나 실제로는 다음과 같이 두 번에 나뉘어 전송되었습니다:
첫 번째 전송:
<script>
console.log
두 번째 전송:
('hello sse');
</script>
이로 인해 자바스크립트가 정상적으로 실행되지 않고, 코드가 그대로 화면에 출력되는 문제가 발생했습니다.
문제를 확인하기 위해 다음 사항들을 점검했습니다:
Gunicorn/Uvicorn 문제 여부 : 로컬 환경에서는 동일한 문제가 재현되지 않았습니다.
Nginx 버퍼링 설정 : 원인은 Nginx의 버퍼링 기능 때문이었습니다. Nginx가 SSE 응답을 중간에 버퍼링하면서 데이터가 잘려 전송되었습니다.
proxy_buffering off;
response['X-Accel-Buffering'] = 'no'
댓글