(아래 첨부한 블로그의 개발자님과 동일한 상태)
내 기존 location 들 ,
location / {
proxy_pass http://아이피주소;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
웹소켓은 기본적으로 HTTP 프로토콜을 이용하여 그 연결을 끊지 않고 유지시켜주는 방식으로 동작하기 때문에 반드시 header에 websocket으로 upgrade한다는 것을 명시
아래를 추가
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
참고 블로그 :
https://andonekwon.tistory.com/69
나도 이처럼 아래 설정만 추가해주니 바로 에러가 사라졌다!
nginx의 설명은
=> http://nginx.org/en/docs/http/websocket.html
-by-hop headers including “Upgrade” and “Connection” are not passed from a client to proxied server, therefore in order for the proxied server to know about the client’s intention to switch a protocol to WebSocket, these headers have to be passed explicitly:
server {
...
location /chat/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
- "Upgrade" 및 "Connection"을 포함한 홉별 헤더는 클라이언트에서 프록시 서버로 전달되지 않으므로 !! 프록시 서버가 프로토콜을 WebSocket으로 전환하려는 클라이언트의 의도를 파악하기 위해, 헤더를 명시적으로 전달해야 한다.
조금 더 위의 내용을 정리해보자면,
클라이언트와 서버 간의 연결을 HTTP / 1.1에서 WebSocket으로 전환 하기 위해 HTTP / 1.1에서 사용 가능한 프로토콜 스위치 메커니즘
이 사용된다고 한다.
그러나 업그레이드는 hop-by-hop 헤더
이기 때문에 클라이언트에서 프록시 서버로 전달되지 않는다고 한다.
정방향 프록시(Forward Proxy)를 사용하면 클라이언트가 CONNECT 메서드를 사용 하여이 문제를 피할 수 있다.
그러나 클라이언트가 프록시 서버를 인식하지 못하고 프록시 서버에서의 특수 처리가 필요하므로 리버스 프록시에서는 작동하지 않습니다.
버전 1.3.13부터 nginx는 프록시 서버가 코드 101 (스위칭 프로토콜)로 응답을 반환하고 클라이언트가 요청의“업그레이드”헤더를 가지게 해준다.
위에서 언급 한 바와 같이, "업그레이드"및 "연결"을 포함한 홉별 헤더는 클라이언트에서 프록시 서버로 전달되지 않는다
프록시 서버가 클라이언트가 프로토콜을 WebSocket으로 전환하려는 클라이언트의 의도를 알 수 있도록하기 위해이 헤더를 명시적으로 전달해야 한다.
한 줄 요약 :
프로토콜을 WebSocket으로 전환하려는 클라이언트의 의도를 알 수 있도록하기 위해이 헤더를 명시적으로 전달해야 한다
Reverse Proxy는 클라이언트로부터의 요청을 받아서(필요하다면 주위에서 처리한 후) 적절한 웹 서버로 요청을 전송한다. 웹 서버는 요청을 받아서 평소처럼 처리를 하지만, 응답은 클라이언트로 보내지 않고 Reverse Proxy로 반환한다. 요청을 받은 Reverse Proxy는 그 응답을 클라이언트로 반환
https://brainbackdoor.tistory.com/113