我有幾個服務放在 NGINX 反向代理後面,設定起來很簡單,但我遇到了 websockets 的問題。單一端點很簡單,可以指定一個位置,其中包括
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
問題是有很多帶有 websocket 的端點。我們不斷發現不起作用的新東西,因為還有另一個我們不知道的 websocket 端點。
有沒有辦法僅在客戶端通過時設定Upgrade
和標頭?Connection
如果我在整個服務中包含這兩行,它會嘗試升級每一個連接,而不僅僅是 websocket。
答案1
剛剛遇到了同樣的問題,並且正在與 nginx 配置中的 if 語句作鬥爭並實現了這些指令:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
不要做任何事除非客戶端設定一個Upgrade
標頭。
因此,您不必為每個 websocket 端點新增特定Location
指令,而是可以建立一個全域指令:
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 請求來說是空的。