私は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_upgrade
Websocket 以外のリクエストでは が空であるためです。