문제점
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
'Nginx' 카테고리의 다른 글
[Nginx] Websocket 일정시간 후 끊기는 문제 (2) | 2021.12.10 |
---|---|
[Nginx-ssl] 간단하게 Nginx에 SSL 인증 적용하기(with certbot) (0) | 2021.12.09 |
[Nginx] Nginx란, Nginx 와 Apache (0) | 2021.12.06 |