web-dev-qa-db-ja.com

NginxでのMeteor WebSocketハンドシェイクエラー400

私はなんとか流星をインフラストラクチャ(Webfactions)に配備しました。アプリケーションは正常に動作しているようですが、アプリケーションの起動時にブラウザコンソールに次のエラーが表示されます。

WebSocket connection to 'ws://.../websocket' failed: Error during WebSocket handshake: Unexpected response code: 400

22
gpasse

WebSocketは高速であり、無効にする必要はありません(無効にする必要もありません)。

このエラーの本当の原因は、Webfactionsがnginxを使用していて、nginxが正しく構成されていないことです。 proxy_set_header Upgrade $http_upgrade;およびproxy_set_header Connection $connection_upgrade;を設定して、WebSocketリクエストをプロキシするようにnginxを 正しく構成する方法 は次のとおりです。

# we're in the http context here
map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}

# the Meteor / Node.js app server
server {
  server_name yourdomain.com;

  access_log /etc/nginx/logs/yourapp.access;
  error_log /etc/nginx/logs/yourapp.error error;

  location / {
    proxy_pass http://localhost:3000;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $Host;  # pass the Host header - http://wiki.nginx.org/HttpProxyModule#proxy_pass

    proxy_http_version 1.1;  # recommended with keepalive connections - http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_version

    # WebSocket proxying - from http://nginx.org/en/docs/http/websocket.html
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
  }

}

これは、 David Weldonのnginx config に基づいて改善されたnginx構成です。 Andrew Maoは 非常によく似た設定 に達しました。

また、 HTTP_FORWARDED_COUNT 環境変数をアプリの前のプロキシの数(通常は1)に設定することを忘れないでください。

58
Dan Dascalescu

ブラウザコンソールでこのエラークライアント側を受信して​​いる場合は、無視しても問題ありません。つまり、ホスティングがWebSocketをサポートしていないため、代わりにMeteorがロングポーリングを使用することになります。

herokuまたはWebSocketなしの他のプラットフォームにデプロイされたMeteorアプリは同じエラーを受け取ります


更新:meteor v0.6.4以降、環境変数DISABLE_WEBSOCKETSを設定して、失敗することがわかっている場合にこの試みが行われないようにすることができます

https://github.com/meteor/meteor/blob/devel/History.md

If you set the DISABLE_WEBSOCKETS environment variable, browsers will not attempt to connect to your app using Websockets. Use this if you know your server environment does not properly proxy Websockets to reduce connection startup time.
8
nate-strauser

SEOに関して:失敗したWebSocket(コード400)は、Phantomjsがまともなページロードを取得するのを防ぎます(そして終了しません)。

私の場合、Danの新しいNginx構成は、WebSocketの失敗を防ぎ、Phantomjsにページをロードさせます。

1
Rien Daamen

AWS Elastic Load Balancerを使用しているときにこのエラーを検索したところ、これが見つかりました。環境変数の設定は機能しますが、より良い解決策は、HTTPSの代わりにELBでTCPプロトコルを使用することです。

1
jazzed