본문 바로가기

Nginx

[Nginx] Nginx Websocket 리버스 프록시 설정

문제점

https, http 연결 모두 테스트 되었지만 wss로는 연결이 되지 않는 에러가 발생한다.

Error during WebSocket handshake: Unexpected response code: 504

 

원인

클라이언트와 서버간의 연결을 http -> websocket 으로 전환하기 위해서는 프로토콜 전환 메커니즘이 사용된다.

하지만 upgrade는 hop-by-hop 헤더이기때문에 클라이언트에서 서버로 다시 전달되지 않는다.

  • hop - 네트워크의 출발지와 목적지 사이에 위치한 경로 내에서 양 끝단을 포함한 모든 네트워크들의 다음 장비로 패킷이 이동하는것, 홉이 발생하는 수를 홉 카운트 라고 한다.
  • hop-by-hop - 프록시의해 재전송 되거나 캐시되지 않으며 다음 전달에 삭제되는 헤더

 

해결

이 때 Connection 헤더를 사용하여 문제를 해결할 수 있다. Connection 헤더로 upgrade를 다음 서버로 연결하여 전송이 가능하다.

그리고 전달된 Upgrede 헤더를 통해 프로토콜 스위치를 요청하면 클라이언트와 서버 사이의 Websocket 터널을 설정할 수 있다.

 

그러나 클라이언트에서는 이 Upgrade 와 Connect 를 포함한 홉 바이 홉 헤더를 서버로 전달하지 않기 때문에 프록시 서버에서 자체적으로 Websocket으로 프로토콜을 전환하려는 클라리언트의 요청에 다음과 같이 헤더를 명시적으로 작성해 주어야한다.

server {
    location / {
    	...
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";   
        ...
    }
}

 

 

 

*proxy_http_version 1.1; 참고 - https://brunch.co.kr/@alden/11