Java & Spring

[Nginx] event-stream(SSE), WebSocket의 지속 연결

ju_young 2024. 5. 31. 16:17
728x90

문제

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]

728x90