Errore di handshake Meteor WebSocket 400 con nginx

Sono riuscito a distribuire meteor sulla mia infrastruttura (Webfactions). L’applicazione sembra funzionare correttamente ma durante l’avvio dell’applicazione viene visualizzato il seguente errore nella console del browser:

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

I WebSocket sono veloci e non devi (e non dovresti) disabilitarli.

La vera causa di questo errore è che Webfactions utilizza nginx e nginx non è stato configurato correttamente. Ecco come configurare correttamente nginx per le richieste proxy WebSocket , impostando proxy_set_header Upgrade $http_upgrade; e 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; } } 

Questa è una configurazione migliorata di nginx basata sulla configurazione di nginx di David Weldon . Andrew Mao ha raggiunto una configurazione molto simile .

Ricorda inoltre di impostare la variabile di ambiente HTTP_FORWARDED_COUNT sul numero di proxy di fronte all’app (solitamente 1).

se stai ricevendo questo errore lato client nella console del browser, puoi tranquillamente ignorarlo – significa che il tuo hosting non supporta websockets e meteor eseguirà il fallback usando invece il polling lungo

le app di meteor installate su heroku o su qualsiasi altra piattaforma senza websocket avranno lo stesso errore


aggiornamento: da meteor v0.6.4 è ora ansible impostare la variabile d’ambiente DISABLE_WEBSOCKETS per impedire che questo tentativo si verifichi se si sa che non riuscirà

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. 

Riguardo a SEO: il websocket in errore (codice 400) impedisce anche a Phantomjs di ottenere un pageload decente (e non viene terminato).

Nel mio caso, la nuova configurazione Nginx di Dan impedisce il malfunzionamento delle websocket e consente a Phantomjs di caricare la pagina.

Trovato questo nella mia ricerca di questo errore quando si utilizza AWS Elastic Load Balancer. L’impostazione della variabile di ambiente funziona, ma la soluzione migliore è utilizzare il protocollo TCP su ELB anziché HTTPS. FYI.