문제
Nginx는 기본적으로 Upstream으로 요청을 보낼때 HTTP/1.0 버전을 사용한다. 따라서 Nginx에서 WAS로 요청을 보낼 때 HTTP/1.0을 사용하여 Connection: close
헤더를 사용하게 된다.
하지만 SSE(Server Side Event) 또는 WebSocket은 지속 연결이 필요하기 때문에 HTTP/1.0을 사용하게되어 Connection 요청 후 바로 끊기게된다.
해결
SSE(Server Side Event)
의 경우 다음과 같이 지속 연결이 될 수 있도록 Nginx에 Http Version과 Connection 헤더를 keep-alive
로 설정해주면 해결된다.
proxy_set_header Connection 'keep-alive';
proxy_http_version 1.1;
WebSocket
의 경우는 다음과 같이 Connection 외에 Upgrade
라는 헤더를 지정해주어야한다. 그리고 Connection은 upgrade
로 지정해주어야한다.
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_http_version 1.1;
Connection 헤더
Connection
헤더는 HTTP/1.1에서 연결 관리와 관련된 중요한 역할을 한다. 이 헤더는 클라이언트와 서버 간의 연결이 유지될지 아니면 닫힐지를 결정하는데 사용된다.
close
: 응답을 전송한 후 연결을 닫는다. HTTP/1.0의 기본 동작이며, 연결 당 한 번의 요청/응답을 처리한다.keep-alive
: 응답 후에도 연결을 유지한다. HTTP/1.1의 기본 동작이며, 어려 요청/응답을 같은 연결을 통해 처리할 수 있다.
Upgrade 헤더
Upgrade
헤더는 클라이언트가 서버에 현재 연결된 프로토콜을 다른 프로토콜로 업그레이드할 때 사용된다. 주로 HTTP/1.1에서 WebSocket으로의 업그레이드 요청에 사용된다.
값은 업그레이드를 원하는 프로토콜 이름을 입력하면 된다.
- 예:
Upgrade: websocket
테스트 결과
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_http_version 1.1;
위 설정으로 postman
을 통해 SSE, WebSocket 연결 요청을 시도해보았다.
SSE
먼저 SSE의 경우 Connection
헤더 값이 keep-alive
로 지정되었다.
WebSocket
그리고 WebSocket은 Upgrade=websocket
, Connection=Upgrade
로 지정된 것을 확인할 수 있었다.
[reference]