我有一个 Nginx 服务器块,用于代理对 node.js 服务器的请求。该服务器同时提供 HTTP 内容和 WS (websocket) 内容。是否可以在不应升级到 Websocket 连接的请求上添加升级标头?
即使用 Nginx 代理到服务 HTTP 和 WS 的 Node.js 服务器,使用单独的服务器块是一个好习惯吗?
这是我目前的 Nginx 服务器块:
server {
listen 443 ssl;
listen [::]:443;
server_name api.mysite.com;
ssl_certificate ...;
ssl_certificate_key ...;
ssl_dhparam ...;
ssl_protocols ...;
ssl_prefer_server_ciphers on;
ssl_ciphers ...;
location / {
proxy_pass http://localhost:5000;
proxy_buffering off;
proxy_redirect off;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
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-Host $server_name;
proxy_set_header Access-Control-Allow-Origin *;
}
}
看起来我总是在添加Upgrade
and Connection
请求的标头被代理到 Node.js 服务器,即使我不想升级:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
第一行看起来像是将“Upgrade”标头设置为从请求传递的 $http_upgrade。我假设如果请求中未传递此标头,则“升级”将设置为null
(或同等内容),这不会产生任何影响。那是对的吗?
我发现它在实践中也效果很好,尽管至少一名用户 https://serverfault.com/questions/974986/nginx-proxy-set-header-upgrade-slows-down-the-server有问题。
这行:
proxy_set_header Upgrade $http_upgrade;
实际上是在做你想做的事,因为$http_upgrade
来自客户端发送的标头。因此,如果客户端不请求升级,则不会传递。
由于某种原因,似乎没有等效的$http_connection
变量,但您可以使用以下命令创建一个变量map
, 哪一个是官方解决方案 http://nginx.org/en/docs/http/websocket.html:
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;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)