根据我在 nginx 网站上看到的内容 https://www.nginx.com/blog/websocket-nginx/
他们给出的示例将关闭与后端的所有连接。这并不是我们在代理设置中真正想要的,强制在每个新客户端上重新打开与后端的连接。
http {
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream websocket {
server 192.168.100.10:8010;
}
server {
listen 8020;
location / {
proxy_pass http://websocket;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
}
}
}
但是升级到websocket后是否需要关闭连接?
我们不能改变地图以便它保持与后端的“keepalive”连接吗?(对于所有非 websocket 请求)
map $http_upgrade $connection_upgrade {
default upgrade;
# '' close;
'' '';
}
作为测试环境中的唯一用户,它似乎没有产生任何问题,但在生产中情况会一样吗?
答案1
这map
不会导致 websocket 连接关闭。
它实际上做的是检查Upgrade:
请求标头是否包含任何值。如果有,则返回upgrade
,然后将其作为标头传递给上游Connection: upgrade
。
close
仅当请求标头缺失时才会返回Upgrade:
。正常情况下不会发生这种情况,但如果发生这种情况,则无论如何都无法可靠地(或根本无法)与浏览器建立 websocket 连接。