功能:将客户端和服务器之间的连接从HTTP/1.1转换为WebSocket
然而,值得注意的是:“Upgrade”是一个逐跳( hop-by-hop)报头,它并不能从客户端传递到代理服务器。使用转发代理,客户端可以使用CONNECT方法来规避这个问题。然而,使用反向代理不起作用,因为客户端不知道代理服务器,并且需要在代理服务器上进行特殊处理。
从1.3.13版本开始,nginx实现了一种特殊的操作模式,如果被代理服务器返回了一个带有代码101(交换协议)的响应,并且客户端通过请求中的“Upgrade”头请求协议切换,则允许在客户端和被代理服务器之间建立一个隧道。
如上所述,“Upgrade”和“Connection”不会从客户端传递到代理服务器,因此为了让代理服务器知道客户端将协议切换到WebSocket的意图,这些报头必须显式传递:
location /chat/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
一个更复杂的例子,在向代理服务器的请求中,“Connection”报头字段的值取决于客户端请求报头中“Upgrade”字段的存在:
http {
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
...
location /chat/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
默认情况下,如果代理服务器在60秒内没有传输任何数据,则连接将被关闭。这个超时时间可以通过proxy_read_timeout指令增加。或者,代理服务器可以配置为定期发送WebSocket ping帧来重置超时并检查连接是否仍然活跃。
nginx代理ws和wss,附全配置文件+WebSocket在线测试工具:http://wstool.js.org/
代理ws
#user nobody;
worker_processes 4;
events {
worker_connections 1024;
}
http {
map $http_upgrade $connection_upgrade{
default upgrade;
`` close;
}
server{
listen 8020;
location / {
proxy_pass http://192.168.2.135:5001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
}
连接时用
ws://ip:8020