프로그래밍/ETC

[Nginx] SSE 통신할 때, Connection Timeout..

문제상황

로컬에서 잘 되던 연결이 서버에 배포를 하고 테스트를 하니 클라이언트가 받지를 못하고 Connection Timout이 나는 것이다.. 

딱히 특별한 에러로그도 없어서 왜이러나 하고 이것 저것 찾아본 결과 

Nginx 쪽에서 문제가 있던 것을 알 수 있었다. 


원인

현재 클라이언트와 WAS 사이에는 프록시 서버로 Nginx 웹 서버를 사용하고있는데, 

Nginx는 기본적으로 Upstream으로 요청을 보낼 때, HTTP/1.0 버전을 사용한다.

 

연결을 위해서는 Http버전은 1.1 , Connectoin:keep-alive로 통신을 해야한다.

클라이언트에서 백엔드서버로 요청을 할 때에는 맞게 보내지만  Nginx에서 백엔드 WAS 프록시하여 요청을 전달할 때는

HTTP/1.0 버전을 사용하고 Connection:close 헤더로 바꿔서 보내는 것이었다. ( HTTP/1.0의 기본 연결 상태가 Close)

SSE 는 keep-alive 상태여야 하기 떄문에 Nginx에서 SSE 연결을 닫아버려 동작하지 않았던 것이다.


해결

Nginx 서버 설정에서 요청을 프록시할 때, HTTP 버전을 1.1로 명시해주고,

Connection 헤더를 삭제 (1.1 defualt 설정 사용)해주는 설정을 추가해주면된다.

proxy_http_version 1.1;
proxy_set_header Connection '';

 

728x90