我将几个服务置于 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 请求为空。