Ошибка рукопожатия Meteor WebSocket 400 с nginx

мне удалось развернуть meteor на моей инфраструктуре (Webfactions). Приложение, кажется, работает нормально, но я получаю следующую ошибку в консоли браузера при запуске моего приложения:

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

4 ответов


WebSockets быстры, и вам не нужно (и не следует) отключать их.

реальная причина этой ошибки заключается в том, что Webfactions использует nginx, а nginx был неправильно настроен. Вот как правильно настроить Nginx для прокси-запросов WebSocket, установив proxy_set_header Upgrade $http_upgrade; и 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;
  }

}

Это улучшенная конфигурация nginx на основе конфигурация nginx Дэвида Уэлдона. Андрей Мао достигочень похож конфигурация.

не забудьте также указать HTTP_FORWARDED_COUNT переменная окружения к числу прокси перед приложением (обычно 1).


Если вы получаете эту ошибку на стороне клиента в консоли браузера, вы можете смело игнорировать ее - это означает, что ваш хостинг не поддерживает websockets и meteor будет возвращаться к использованию длинного опроса вместо

метеорные приложения, развернутые на heroku или любой другой платформе без websockets, получат ту же ошибку


обновление: по состоянию на метеор 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.

Что касается SEO: неудачный websocket (код 400) также предотвращает Phantomjs для получения приличной загрузки страниц (и не прекращается).

в моем случае новая конфигурация Nginx от Dan предотвращает сбой websockets и позволяет Phantomjs загружать страницу.


нашел это в моем поиске этой ошибки при использовании AWS Elastic Load Balancer. Настройка переменной среды работает, но лучшим решением является использование протокола TCP на ELB вместо HTTPS. К ВАШЕМУ СВЕДЕНИЮ.