Соединение Meteor WebSocket с "ws://.../websocket" не выполнено: Ошибка при рукопожатии WebSocket: Неожиданный код ответа: 400

Я новичок в таких вещах, как Meteor.JS, и задавался вопросом об этой ошибке. Я начал тестовый проект (с помощью кнопки click meter), и он работает, но затем я иду в консоль и вижу WebSocket connection to 'ws://shibe.ninja/sockjs/243/5gtde_n9/websocket' failed: Error during WebSocket handshake: Unexpected response code: 400 Я не знаю, как это исправить. Благодаря

Ответ 1

Я сам столкнулся с этой проблемой, но у меня уже были настроены заголовки прокси-сервера, и он все еще не работал. Но, по-видимому, Cloudflare вызывает проблемы. Вот отличная статья на эту тему: https://meteorhacks.com/cloudflare-meets-meteor

Насколько я нашел, существует три решения:

Вариант 1: Используйте Enterprise CloudFlare, поддерживающий сокеты.

Вариант 2: Отключить веб-узлы Meteor, что повлияет на вашу производительность, поскольку оно возвращается обратно для использования sock.js в качестве замены. Для этого просто установите среду метеоров следующим образом:

export DISABLE_WEBSOCKETS=1

Вариант 3: В Cloudflare создайте субдомен ddp для websocket (ddp.yourdomain.com), а затем отключите Cloudflare в новом субдомене. После этого установите среду метеоров следующим образом:

export DDP_DEFAULT_CONNECTION_URL=http://ddp.example.com

После этого моя конфигурация nginx нуждалась в некоторых настройках, так как теперь это стало настройкой перекрестного происхождения (CORS). Это моя новая конфигурация nginx:

map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}

server {
  listen 80 proxy_protocol;
  listen [::]:80 proxy_protocol;

  server_name mydomain.com ddp.mydomain.com;

  ## This allows the CORS setup to work
  add_header Access-Control-Allow-Origin 'http://example.com';

  ## This hides the CORS setup from the Meteor server
  ## Without this the header is added twice, not sure why?
  proxy_hide_header Access-Control-Allow-Origin;

  ## Idealy the two options above should be disabeled,
  ## Then use this one instead, but that caused issues in my setup.
  # proxy_set_header Access-Control-Allow-Origin 'http://example.com';

  location / {
    proxy_pass http://localhost:3000;
    proxy_set_header Host $host; # pass the host header
    proxy_set_header Upgrade $http_upgrade; # allow websockets
    proxy_set_header Connection $connection_upgrade;
    proxy_set_header X-Real-IP $remote_addr; # Preserve client IP
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_http_version 1.1;

    # Meteor browser cache settings (the root path should not be cached!)
    if ($uri != '/') {
      expires 30d;
    }
  }
}

Наконец, не забудьте перезапустить nginx.

Ответ 2

Может быть, немного поздно, но в случае, если вы все еще придерживаетесь этого. У меня такая же проблема при развертывании приложения и использовании nginx в качестве прокси.

location / {
     proxy_pass http://127.0.0.1:3000;
     proxy_http_version 1.1;
     proxy_set_header Upgrade $http_upgrade;
     proxy_set_header Connection "Upgrade";
}

Проверьте также документы nginx здесь: http://nginx.com/blog/websocket-nginx/