web-dev-qa-db-ja.com

nginxを使用したSocket.io

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:

同じ設定がオフィスのコンピューターでも完全に機能することを確認しました。これは、自宅のコンピューターの問題だということです。とにかく、何が間違っているのかを正確に判断できると非常にいいでしょう。

18
Aleks

実行中のサーバーで、ここで使用されている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 docsNginx blog )は以下を使用します:

proxy_set_header Connection "upgrade";

すべての小文字の「アップグレード」に注意してください。あなたの例には大文字の「U」があります。たぶん試してみる価値があります。

1
Sam Bauers

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";
    }
0
Radu Toader