web-dev-qa-db-fra.com

Meteor WebSocket poignée de main 400 avec nginx

J'ai réussi à déployer météore sur mon infrastructure (Webfactions). L'application semble fonctionner correctement, mais l'erreur suivante apparaît dans la console du navigateur au démarrage de l'application:

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

17
gpasse

Les WebSockets sont rapides et vous n'avez pas (et ne devriez pas) les désactiver.

La cause réelle de cette erreur est que Webfactions utilise nginx et que celui-ci n'a pas été configuré correctement. Voici comment configurer correctement les requêtes WebSocket de nginx sur les requêtes WebSocket , en définissant proxy_set_header Upgrade $http_upgrade; et proxy_set_header Connection $connection_upgrade;:

# 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;
  }

}

Il s’agit d’une configuration améliorée de nginx basée sur nginx config de David Weldon. Andrew Mao a atteint une configuration très similaire .

N'oubliez pas de définir également la variable HTTP_FORWARDED_COUNT environment sur le nombre de serveurs mandataires situés devant l'application (généralement 1).

48
Dan Dascalescu

si vous recevez cette erreur côté client dans la console du navigateur, vous pouvez l'ignorer en toute sécurité. Cela signifie que votre hébergement ne prend pas en charge les websockets et que météore aura recours à une longue interrogation.

les applications de météores déployées sur heroku ou sur toute autre plate-forme sans Websockets obtiendront la même erreur


update: à partir de meteor v0.6.4, vous pouvez maintenant définir la variable d'environnement DISABLE_WEBSOCKETS pour empêcher cette tentative si vous savez qu'elle va échouer.

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

Concernant le référencement: le websocket défaillant (code 400) empêche également Phantomjs d’obtenir un pageload décent (et ne se termine pas).

Dans mon cas, la nouvelle configuration Nginx de Dan empêche la défaillance des websockets et permet à Phantomjs de charger la page.

1
Rien Daamen

Vous avez trouvé ceci dans ma recherche de cette erreur lors de l'utilisation d'AWS Elastic Load Balancer. La définition de la variable d'environnement fonctionne, mais la meilleure solution consiste à utiliser le protocole TCP sur le ELB au lieu du protocole HTTPS. FYI.

0
jazzed