Nginx 1.6で静的ファイルを提供し、Node.js Webサーバーからのソケットトラフィックをsocket.ioでプロキシしようとしています。
これはnginx.confの関連部分です:
location /socket.io/ {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $Host;
}
ブラウザとNode.jsの間で完全に直接動作しますが、nginx 1.6でプロキシされた場合、socket.ioに時間がかかりすぎます。ハンドシェイクプロトコルには時間がかかりすぎますが、中断されないままにすると、数分後に最終的に動作を開始します。
Nginxによる静的ファイル配信は完全に機能します。
何が問題なのでしょうか?
更新:
ネットワークトラフィックを少し分析し、次の要求が約1分間続くことを確認しました(アップグレードが要求されたのはまさにその時です)。
Sec-WebSocket-Key: LhZ1frRdl+myuwyR/T03lQ==
Cookie: io=1-A7tpvwmoGbrSvTAAA5
Connection: keep-alive, Upgrade
Upgrade: websocket
....
予想される応答はcode 101および:
Connection: upgrade
Sec-WebSocket-Accept: HXx3KKJadQYjDa11lpK5y1nENMM=
Upgrade: websocket
...
代わりに、ブラウザは4を受け取ります:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost:8888
Connection: keep-alive
Content-Type: application/json
Server: nginx/1.6.2
Transfer-Encoding: chunked
更新2:
同じ設定がオフィスのコンピューターでも完全に機能することを確認しました。これは、自宅のコンピューターの問題だということです。とにかく、何が間違っているのかを正確に判断できると非常にいいでしょう。
実行中のサーバーで、ここで使用されているnginxの構成は次のとおりです。
# Requests for socket.io are passed on to Node on port 3000
location ~* \.io {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_Host;
proxy_set_header X-NginX-Proxy false;
proxy_pass http://localhost:3000;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
私が見たすべての例( Nginx docs 、 Nginx blog )は以下を使用します:
proxy_set_header Connection "upgrade";
すべての小文字の「アップグレード」に注意してください。あなたの例には大文字の「U」があります。たぶん試してみる価値があります。
Proxy_redirect offを忘れたかもしれません。
location / {
proxy_pass http://localhost:3000/;
include proxy_params;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}