2013-03-04 3 views
15

nginxはプロキシウェブソケットをサポートしていますが、ウェブスロットを使用するURIに適用される別のロケーションブロックを使用せずにこれを行う方法に関する情報は見つかりませんでした。nginxリバースプロキシウェブソケット

私は、このアプローチのいくつかのバリエーションを推薦一部の人々を見てきました:

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が「アップグレード」に設定されることを望んでいませんが、これらのproxy_set_header行は、Webソケットが動作するために必要です。なぜnginxは元のUpgrade/Connectionヘッダを転送しないのですか?

私はこれで実験し、nginxのプロキシUpgradeヘッダをせず、「閉じる」2つのproxy_set_headerラインなしで実行している場合は、「アップグレード」からのConnectionヘッダを変更することを発見しました。それらを使用すると、WebSocket以外のリクエストに対してもConnectionは「アップグレード」されていますが、これも悪いことです。

感謝:)

答えて

12

は、理由だけではなく、元のアップグレード/接続のヘッダを転送nginxのではないでしょうか? official documentationから

「アップグレード」は、ホップバイホップヘッダであることから、それが

RFC 2616を参照してください、プロキシクライアントからサーバに渡されていません。


私は例もあり、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 requesのための 'アップグレード' ですts、これも悪いです。

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

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