우선 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으로 프로토콜을 전환하려는 것을 알아내려면 이 헤더들을 명시적으로 전달해줌으로써 해결할 수 있다.