<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;
}