Development/NGINX

NGINX SSE 연결 Pending 발생시 해결방법

ANTEGRAL 2022. 8. 10. 00:12
반응형

발단

SSE를 사용하는 서비스를 사용하는 서비스를 백엔드 서버측에서 가동하고,

NGINX를 통한 Reverse Proxy 설정 후 재시작 하였다.

하지만, 페이지는 잘 불러왔지만, 서버측에서 SSE 연결시 메시지를 전송하지 않는 문제가 발생하였음.

해결 방법

config의 server 블록에 다음을 추가하여 해결하였음.

proxy_http_version 1.1;

원인

SSE를 사용하는 서비스에 대응하는 NGINX Configuration

HTTP 연결은 HTTPS 연결로 301 moved permanently 리다이렉트 시켰으므로 무시한다.

본론으로 들어가자면, 일단 https 연결임을 가정할때, SSE 연결은 위 proxy_http_version 1.1; 부분을 빼면 다시 작동하지 않게 된다.

This model is the default model used in HTTP/1.0 (if there is no Connection header, or if its value is set to close). In HTTP/1.1, this model is only used when the Connection header is sent with a value of close.
출처: Mozilla

기본적으로, NGINX는 proxy_http_version 를 따로 설정하지 않는다면 대상 서버에 HTTP/1.0으로 연결을 시도하게 된다. 하지만, HTTP/1.0은 Connection 헤더가 존재하지 않거나, 본 Header의 값이 close로 설정된 경우 단기 커넥션 (Short-lived connections)으로 연결이 수립된다.

왜 문제가 발생하였는가?

1. NGINX 서버는 원본 서버와 연결시에HTTP/1.0을 사용하고, Connection Header 없이 연결을 수행하였다.

2. 하지만 이와 같은 상황은 단기 커넥션 (Short-lived connections)으로 연결되므로,

3. SSE는 단기 커넥션 (Short-lived connections)을 사용하였을때, 서버측에서 메시지를 전송하지 못하기 때문에, 다음과 같은 문제가 발생하였던 것이다.

 

결과적으로 완벽한 해결책을 생각하여, 다음과 같은 여러 해결책을 내놓았다.

프록시 서버와 원본 서버의 연결 수행에...

1. HTTP/1.0 사용시, Connection Header의 값을 비워둔다 (proxy_set_header Connection "";을 NGINX Configuration에 삽입하는 것).

2. HTTP/1.1 사용시, Connection 헤더를 설정하지 않는 것.

반응형