让 NGINX 自动升级反向代理中的 websocket 连接

让 NGINX 自动升级反向代理中的 websocket 连接

我将几个服务置于 NGINX 反向代理之后,这很容易设置,但我遇到了 websockets 问题。单个端点很简单,只需指定一个位置,其中包括

   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection "upgrade";

问题是有许多带有 websocket 的端点。我们不断发现新的不工作的东西,因为还有另一个我们不知道的 websocket 端点。

有没有办法只在客户端传递时设置Upgrade和标头?如果我为整个服务添加这两行,它会尝试升级Connection每一个连接,而不仅仅是 websockets。

答案1

刚刚遇到了同样的问题,并且正在与 nginx 配置中的 if 语句作斗争,并实现了这些指令:

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

什么也不要做除非客户端设置了一个Upgrade标题。

因此,您不必Location为每个 websocket 端点添加特定的指令,而是可以创建一个全局指令:

server {
  listen          443 ssl;
  server_name     my-server.example
  location / {
    proxy_pass http://local-service.example/;
    proxy_http_version 1.1;
    proxy_read_timeout 86400s;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

  }
}

此代理可代理任何 HTTP 请求,并使 websockets 适用于整个命名空间。它之所以有效是因为$http_upgrade对于非 websocket 请求为空。

相关内容