使用带有弹性beanstalk,nginx和node.js的websocket的问题

时间:2014-11-12 09:33:09

标签: node.js nginx websocket elastic-beanstalk sockjs

我正在尝试在EB上使用sock.js部署node.js应用程序。 Websockets在没有代理的情况下工作正常使用nginx代理时发生ws连接问题。我有.ebextensions / .config文件:

files:
  "/etc/nginx/conf.d/wssproxy.conf":
    mode: "000644"
    owner: root
    content: |
      map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
      }
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;

Websockets不起作用,但是nginx错误日志说:

在上游读取时上游过早关闭连接,客户端:83.219.138.215,服务器:,请求:“POST x / XXXXX / 432 / 2l4e2j6v / xhr_streaming HTTP / 1.1”,上游:“http://xxx.0.0.1:8081/XXXXX/432/2l4e2j6v/xhr_streaming”,主机:“XXXXXX。 elasticbeanstalk.com“,推荐人:”http://XXXXXX.elasticbeanstalk.com/

1 个答案:

答案 0 :(得分:0)

这可能是由于您的负载均衡器未确定性地将请求映射到第7层(HTTP)和第4层(websockets)上的上游服务器。您会注意到,您提供的错误消息表明您正在使用xhr-streaming,它可以在第7层上运行。我猜测如果您强制使用websocket协议或只是HTTP轮询这些错误将会变为更加一致,但它们不会消失。

这里有一些可能解决方案的更详细解释。不幸的是,它们实施起来非常烦人。以下问题涉及socket.io,但由于您使用sockjs,理想的解决方案实现given sockjs' use of server-specific IDs in HTTP polling request paths要容易得多。

Node socket.io on load balanced Amazon EC2

如果可以在ELB上使用确定性负载平衡方法,例如IP或HTTP路径散列,所有这些问题都将消失。