与nginx的Meteor WebSocket握手错误400

时间:2013-06-09 22:54:41

标签: node.js nginx meteor

我设法在我的基础设施(Webfactions)上部署meteor。 该应用程序似乎工作正常但我的应用程序启动时在浏览器控制台中出现以下错误:

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

4 个答案:

答案 0 :(得分:50)

WebSockets速度很快,您不必(也不应该)禁用它们。

此错误的真正原因是Webfactions使用nginx,并且nginx配置不正确。通过设置proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $connection_upgrade;来了解correctly configure nginx to proxy WebSocket requests的方法:

# 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;
  }

}

这是基于David Weldon's nginx config的改进的nginx配置。安德鲁·毛已达到very similar configuration

请记住还要将HTTP_FORWARDED_COUNT环境变量设置为应用前面的代理数量(通常为1)。

答案 1 :(得分:8)

如果您在浏览器控制台中收到此错误客户端,则可以放心地忽略它 - 这意味着您的托管不支持websockets,而meteor将回退使用长轮询

部署到heroku或没有websockets的任何其他平台的meteor应用程序将得到相同的错误


更新: 从meteor 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.

答案 2 :(得分:1)

关于SEO:失败的websocket(代码400)也阻止Phantomjs获得一个不错的页面加载(并且不会被终止)。

就我而言,Dan的新Nginx配置可以防止websockets失败并让Phantomjs加载页面。

答案 3 :(得分:0)

在使用AWS Elastic Load Balancer时,我在搜索此错误时发现了这一点。设置环境变量有效,但更好的解决方案是在ELB上使用TCP协议而不是HTTPS。 FYI。