WebSocket + Nginx(리버스 프록시)

코딩을 합시다·2023년 3월 14일
1

🤔 로컬 서버에서 잘되던 실시간 채팅이 Nginx를 사용한 뒤부터 안되는 문제가 생겼다.

우선 WebSocket의 방식을 알아보자

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

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

그런데 중계서버인 프록시를 거치게 될 경우에는

“Upgrade” 및 “Connection”을 포함한 홉 바이 홉 헤더가 클라이언트에서 프록시된 서버로 전달이되지 않는다.

정방향 프록시의 경우, 클라이언트는 CONNECT 메서드를 사용해서 이 문제를 우회할 수 있지만

역방향 프록시에서는 클라이언트가 프록시 서버를 인식하지 못하므로 이 방법을 사용할 수 없어 프록시 서버에서 특수한 처리가 필요하다.

버전 1.3.13부터 nginx는 프록시 서버가 코드 101 (스위칭 프로토콜)로 응답을 반환하고 클라이언트가 요청의“Upgrade”헤더를 가지게 해준다. #

이제 원리를 알았으니 코드를 작성해보자.

사실 코드 자체는 간단하다.
nginx.conf 파일에 아래의 코드를 추가해주면 해결!

                  location ~ /엔드포인트/ {
                      proxy_pass 서버 url 주소;
                      proxy_http_version 1.1;
                      proxy_set_header Upgrade $http_upgrade;
                      proxy_set_header Connection "upgrade";
                  }

ex)

  • /ws-stomp/는 본인의 Socket 엔드포인트를 작성해주자

  • 프록시된 서버에서 클라이언트가 WebSocket으로 프로토콜을 전환하려는 것을 알아내려면 이 헤더들을 명시적으로 전달해줌으로써 해결할 수 있다.

0개의 댓글