25

nginxはWebSocketのプロキシをサポートするようになりましたが、WebSocketが使用されるURIに適用される個別のロケーションブロックがないと、これを行う方法に関する情報を見つけることができませんでした。

私はこのアプローチのいくつかのバリエーションを推奨する何人かの人々を見てきました:

location / {
    proxy_http_version 1.1;

    proxy_set_header    Upgrade     $http_upgrade;
    proxy_set_header    Connection  "upgrade";

    proxy_pass  http://host:port;
}

これは、標準のHTTPとWebSocketをプロキシする正しい方法でしょうか?

ブラウザが送信したものでない限り、UpgradeヘッダーやConnection設定は必要ありませんが、これらの行はWebSocketが機能するために必要です。upgradeproxy_set_header

なぜnginxは元のUpgrade/Connectionヘッダーを転送しないのですか?

これを試してみたところ、nginxはヘッダーをプロキシせず、2行なしで実行している場合はヘッダーをからUpgradeに変更することがわかりました。それらを使用すると、WebSocket以外のリクエスト用になりますが、これも悪いことです。Connectioncloseupgradeproxy_set_headerConnectionupgrade

4

1 に答える 1

25

なぜnginxは元のUpgrade/Connectionヘッダーを転送しないのですか?

公式ドキュメントから:「アップグレード」はホップバイホップヘッダーであるため、クライアントからプロキシサーバーに渡されません

RFC2616を参照してください。


ブラウザが送信したものでない限り、UpgradeヘッダーまたはConnectionを「upgrade」に設定したくありません。

例もあります:

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    ...

    location /chat/ {
        proxy_pass http://backend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
}

WebSocket以外のリクエストの場合、接続は「アップグレード」されますが、これも問題です。

Connectionヘッダーの意味を実際に知っていますか?RFCからの引用:このフィールドの接続トークンごとに、接続トークンと同じ名前のヘッダーフィールドをメッセージから削除します。

どのようにそれは悪いことができますか?

于 2013-03-04T09:46:36.693 に答える