我有一个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 *;
}
}
字符串
看起来我总是向代理到Node.js服务器的请求添加Upgrade
和Connection
头,即使我不想升级:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
型
第一行看起来像是将“Upgrade”头设置为$http_upgrade,从请求中传递过来。我假设如果请求中没有传递这个头,那么“Upgrade”将被设置为null
(或等效值),这将没有效果。对吗?
3条答案
按热度按时间webghufk1#
我发现它在实践中也工作得很好,尽管at least one user有一个问题。
这一行:
字符串
因为
$http_upgrade
来自于客户端发送的标头,所以如果客户端没有请求升级,它就不会被沿着。由于某些原因,似乎没有一个等效的
$http_connection
变量,但您可以使用map
创建一个,即official solution:型
wxclj1h52#
什么都没有发生。很好。我使用相同的nginx块代理graphql http端点和ws端点。
zazmityj3#
对我来说,它的工作:
字符串
我的项目在一个docker-compose文件上,我在一个default.conf.tpl文件中设置了Nginx的配置,然后将其复制到容器中的/etc/nginx/default.conf.tpl。另外我使用的是nginxinc/nginx-unprivileged:1.25.3-alpine容器。