2013-06-09 19 views
12

Udało mi się wdrożyć meteor na mojej infrastrukturze (Webfactions). Aplikacja wydaje się działać prawidłowo, ale pojawia się następujący błąd w konsoli przeglądarki kiedy moja aplikacja uruchamia:Błąd usterki WebSocket Meteor WebSocket 400 z nginxem

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

+0

@DanDascalescu Czy powinienem edytować pytanie? – gpasse

Odpowiedz

43

WebSockets są szybkie i don” t muszą (i nie powinni) wyłączać ich.

Prawdziwą przyczyną tego błędu jest to, że Webfactions używa nginx, a nginx został nieprawidłowo skonfigurowany. Oto jak correctly configure nginx to proxy WebSocket requests, ustawiając proxy_set_header Upgrade $http_upgrade; i 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; 
    } 

} 

Jest to ulepszona konfiguracja nginx na podstawie David Weldon's nginx config. Andrew Mao osiągnął very similar configuration.

Pamiętaj, aby ustawić zmienną środowiskową HTTP_FORWARDED_COUNT na liczbę serwerów proxy przed aplikacją (zwykle 1).

+1

Dzięki Dan. Włącz websocket jest drogą do zrobienia. Również uaktualnij nginx do wersji 1.4 lub nowszej, aby uzyskać websocket. –

+0

Byłoby miło mieć to również dla Apache. – guaka

+0

@KasperSouren: w przeważającej większości przypadków Apache jest przesadny.Nie widzę powodu, aby z niego korzystać. Więcej na http://www.wikivs.com/wiki/Apache_vs_nginx –

8

jeśli otrzymaniu tego błędu po stronie klienta w konsoli przeglądarki, można go zignorować - oznacza to, że hosting nie obsługuje WebSockets i meteorów będzie Przenieś się za pomocą długiego odpytywanie zamiast

aplikacje meteorów wdrożonych do Heroku lub innej platformy bez WebSocket dostanie ten sam błąd


zmiana: jak z meteorytów v0.6.4 możesz teraz ustawić zmienną środowiskową DISABLE_WEBSOCKETS aby zapobiec występowaniu tej próby, jeśli wiesz, że zawiedzie

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. 
+2

ustawić na 1? eksportować DISABLE_WEBSOCKETS = 1? –

+1

robię DISABLE_WEBSOCKETS = true - całkiem pewna, że ​​jakaś wartość zadziała, biorąc pod uwagę meteor verbage - wystarczy ustawić jako zmienną środowiskową –

+0

dzięki, człowieku, idealnie. –

1

Dotyczy SEO: wadliwy websocket (kod 400) również uniemożliwia Phantomjs uzyskanie porządnego pageload (i nie zostaje zakończony).

W moim przypadku nowa konfiguracja Nginx od Dana zapobiega awarii stron internetowych i pozwala Phantomjs załadować stronę.

0

Znaleziono to podczas wyszukiwania tego błędu podczas korzystania z elastycznego systemu równoważenia obciążenia AWS. Ustawienie zmiennej środowiskowej działa, ale lepszym rozwiązaniem jest użycie protokołu TCP na ELB zamiast HTTPS. FYI.