<aside> 💡

웹소켓과 리버스 프록시를 함께 사용한다면 별도의 설정을 nginx.conf에 추가할 필요가 있다고 한다. 왜 그런 설정이 필요한 것이고, 또 설정을 추가하지 않으면 어떤 문제가 발생할까?

</aside>

웹소켓 연결 방식

클라이언트와 서버 간의 연결을 HTTP / 1.1에서 WebSocket으로 전환 하기 위해 HTTP / 1.1에서 사용 가능한 프로토콜 스위치 메커니즘이 사용된다고 한다.

웹소켓은 기본적으로 HTTP 프로토콜을 이용하고, 추가적으로 그 연결을 끊지 않고 유지시켜주는 방식으로 동작하기 때문에 반드시 http-header에 websocket으로 upgrade한다는 것을 명시해주어야 한다.

그런데 리버스 프록시 서버를 거치게 될 경우에는**“Upgrade” 및 “Connection”을 포함한 홉 바이 홉 헤더가 클라이언트에서 웹 어플리케이션 서버로 전달이되지 않는다.**

<aside> 💡

홉 바이 홉 헤더란? 패킷이 지나는 경로상의 모든 라우터가 검사해야 하는 옵션 정보를 전달하는 헤더이다.

</aside>

필요한 설정

결론적으로, 엔진엑스에 추가해야하는 설정은 아래와 같다.

location /api/play {
    rewrite ^/api(/.*)$ $1 break;  # /api를 제거하고 나머지 경로 유지
    proxy_pass <http://127.0.0.1:3000>;  # WebSocket 서버 주소
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 300s;  # 비활성 연결 유지 시간 연장
    proxy_send_timeout 300s;
}