발단
SSE를 사용하는 서비스를 사용하는 서비스를 백엔드 서버측에서 가동하고,
NGINX를 통한 Reverse Proxy 설정 후 재시작 하였다.
하지만, 페이지는 잘 불러왔지만, 서버측에서 SSE 연결시 메시지를 전송하지 않는 문제가 발생하였음.
해결 방법
config의 server 블록에 다음을 추가하여 해결하였음.
proxy_http_version 1.1;
원인
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 헤더를 설정하지 않는 것.