讓 NGINX 自動升級反向代理中的 websocket 連接

讓 NGINX 自動升級反向代理中的 websocket 連接

我有幾個服務放在 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 請求來說是空的。

相關內容