nginx 如果我在不打算升级到WebSocket连接的HTTP请求中包含“Upgrade”和“Connection”头,会发生什么?

cgvd09ve  于 5个月前  发布在  Nginx
关注(0)|答案(3)|浏览(75)

我有一个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服务器的请求添加UpgradeConnection头,即使我不想升级:

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";


第一行看起来像是将“Upgrade”头设置为$http_upgrade,从请求中传递过来。我假设如果请求中没有传递这个头,那么“Upgrade”将被设置为null(或等效值),这将没有效果。对吗?

webghufk

webghufk1#

我发现它在实践中也工作得很好,尽管at least one user有一个问题。
这一行:

proxy_set_header Upgrade $http_upgrade;

字符串
因为$http_upgrade来自于客户端发送的标头,所以如果客户端没有请求升级,它就不会被沿着。
由于某些原因,似乎没有一个等效的$http_connection变量,但您可以使用map创建一个,即official solution

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;
    }
}

wxclj1h5

wxclj1h52#

什么都没有发生。很好。我使用相同的nginx块代理graphql http端点和ws端点。

zazmityj

zazmityj3#

对我来说,它的工作:

server {
    listen 80;

    location / {
        proxy_pass http://name-of-the-container:9000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade \$http_upgrade\;
        proxy_set_header X-Real-IP \$remote_addr\;
        proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for\;
        proxy_set_header X-Forwarded-Proto \$scheme\;
        proxy_set_header Connection "Upgrade";
    }
}

字符串
我的项目在一个docker-compose文件上,我在一个default.conf.tpl文件中设置了Nginx的配置,然后将其复制到容器中的/etc/nginx/default.conf.tpl。另外我使用的是nginxinc/nginx-unprivileged:1.25.3-alpine容器。

相关问题