Подтвердить что ты не робот

Ошибка при попытке связаться с Meteor WebSocket 400 с nginx

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

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

4b9b3361

Ответ 1

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 на основе конфигурации David Weldon nginx. Эндрю Мао достиг очень похожей конфигурации .

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

Ответ 2

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

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


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

Ответ 3

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

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

Ответ 4

Обнаружено это в моем поиске этой ошибки при использовании AWS Elastic Load Balancer. Настройка переменной окружения работает, но лучшим решением является использование протокола TCP на ELB вместо HTTPS. FYI.