Nginx 反向代理 WebSocket
在开发中遇到了,部分生产环境,Nginx
和 WebSocket
不在同一台服务的情况,可以通过 Nginx
做反向代理。
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
WebSocket
使用 ws
或 wss
的统一资源标志符,类似于 HTTP
或 HTTPS
,其中 wss
表示在 TLS 之上的 WebSocket
,相当于 HTTPS
了。
默认情况下,WebSocket
的 ws
协议使用 80
端口;运行在TLS之上时,wss
协议默认使用 443
端口。其实说白了,wss
就是 ws
基于 SSL 的安全传输,与 HTTPS
一样的道理。
如果你的网站是 HTTPS
协议的,那你就不能使用 ws://
了,浏览器会 block 掉连接,和 HTTPS
下不允许 HTTP
请求一样.
Nginx 配置支持 WSS
location /websocket {
proxy_pass http://127.0.0.1:xx;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
WebSocket
和 HTTP
协议不同,但是 WebSocket
中的握手和 HTTP
中的握手兼容,它使用 HTTP
中的 Upgrade
协议头将连接从 HTTP
升级到 WebSocket
,当客户端发过来一个 Connection: Upgrade
请求头时,Nginx
是不知道的,所以,当 Nginx
代理服务器拦截到一个客户端发来的 Upgrade
请求时,需要显式来设置 Connection
、Upgrade
头信息,并使用 101
(交换协议)返回响应,在客户端和代理服务器、后端服务器之间建立隧道来支持 WebSocket
。