본문 바로가기
데브옵스

NGINX와 SSE를 함께 사용하는 경우 주의점

by __Minnie_ 2024. 3. 1.

프로젝트에서 실시간 알림을 위해서 sse를 사용하고 있었습니다.

기존에는 로컬 환경에서만 돌리다가, 클라우드 서버로 옮기면서 프록시 서버로 nginx를 연동하였습니다.

프록시 서버용으로 nginx를 적용하는 순간 sse 연결이 정상적으로 생성되지 않는 문제가 발생하였습니다.

그렇게 인터넷 검색을 통해서 찾아본 결과 sse를 nginx와 연동을 할 때는 아래 두가지 사항을 유의해야 한다고 합니다. 

 

1) connection 

Nginx는 upstream으로 요청을 보낼 때 기본적으로 Http 1.0을 사용하며, connection: close 헤더를 사용한다고 합니다. 그러나 sse의 경우, 연결이 지속되어야 하는데, nginx에서 지속 연결을 막아버리기 때문에 연결이 되지 않았던 것입니다.

 

이를 변경하기 위해서는 nginx.conf 혹은 conf 설정 파일에서 location 블록에 아래 설정을 입력해주어야 합니다.

proxy_set_header Connection ''
proxy_http_version 1.1

  

2) proxy buffering

이렇게만 설정을 해주었더니 연결은 되는 것 같은데 클라이언트 쪽에서 데이터를 제대로 받질 못했습니다. 서버에서는 분명히 메세지를 보냈지만, 클라이언트에서는 수신을 하지 못했고, 연결이 끊길 때쯤 서버에서 보냈던 메시지를 한번에 수신하는 현상을 발견하였습니다. 인터넷 검색을 해본 결과, 이 문제는 proxy buffering 때문이라고 합니다. 아래는 nginx 공식 문서에서 발췌한 내용입니다. 

프록시 버퍼링은 NGINX에서 기본적으로 활성화되어 있습니다. 프록시 버퍼링은 NGINX가 서버로부터 받은 응답을 내부 버퍼에 저장하고 전체 응답이 버퍼링될 때까지 클라이언트에 데이터 전송을 시작하지 않는다는 것을 의미합니다. 

 

위 문서를 보면 nginx에서 서버로부터 받은 응답을 바로 전송하는 것이 아닌 응답을 모아뒀다가 추후에 전송을 한다는 것입니다. 이 설정 때문에, 서버에서는 메시지를 보냈지만 클라이언트에서는 받지 못하는 현상이 발생한 것입니다. 하지만, 그렇다고 이 설정을 전체 비활성화 해서는 안된다고 합니다. 정확한 이유는 모르겠지만, 이 설정을 다른 요청들에서도 꺼지면 성능상 좋지 안다고 합니다. 따라서, sse 요청에 대해서만 해당 설정을 꺼주시는 것이 좋습니다. 해당 설정을 끄기 위해서는 아래처럼 설정하시면 됩니다. 

X-Accel-Buffering: no