NGINX がリバースプロキシで Websocket 接続を自動的にアップグレードするようにする

NGINX がリバースプロキシで Websocket 接続を自動的にアップグレードするようにする

私はNGINXリバースプロキシの背後にいくつかのサービスを配置していますが、これはセットアップが簡単でしたが、Webソケットで問題が発生しました。単一のエンドポイントは、次の場所を指定するだけで十分です。

   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection "upgrade";

問題は、Websocket には多くのエンドポイントがあることです。また、私たちが知らなかった別の Websocket エンドポイントが存在するため、動作しない新しいものが次々と見つかります。

Upgradeクライアントが渡した場合にのみヘッダーを設定する方法はありますかConnection?サービス全体にこれらの2行を含めると、アップグレードが試行されます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 リクエストを処理し、Websocket を名前空間全体で機能させます。これが機能する理由は、$http_upgradeWebsocket 以外のリクエストでは が空であるためです。

関連情報