Nginx 代理 websocket:升级到 websocket 后是否需要关闭与后端的连接?

Nginx 代理 websocket:升级到 websocket 后是否需要关闭与后端的连接?

根据我在 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 连接。

相关内容