使用AWS Elastic Load Balancer背后的Primus.io(websockets)

时间:2013-11-14 11:52:18

标签: amazon-web-services websocket load-balancing amazon-elb

我正在尝试设置一个Elastic负载均衡器,以便将请求路由到运行带有sockjs的Primus.io的node.js服务器集群,以管理实时通信。

我已设置负载均衡器以使用以下配置进行侦听:

  • HTTPS 8084 - > HTTPS 8084(我的node.js服务器上使用的端口)
  • SSL 443 - > TCP 80

我的理解是,让websockets通过ELB工作的唯一方法是通过SSL-> TCP,因此上面的配置。

我已正确启用ELB的新代理协议,如下所述:

http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-proxy-protocol.html

当尝试从客户端连接到服务器时,最初会发送HTTPS请求,然后从我可以收集的内容中将其升级到websockets。但是当我将它发送到负载均衡器地址时,请求就会失败。

如果我将初始Primus连接请求发送到单个nodejs服务器的ip,如下所示:

var primus = new Primus('https://ip.address.of.single.server:8084');

正确返回请求并正确升级到websockets。

当我将ip地址切换到平衡器的地址时,它会失败,并且对node.js服务器的初始https请求不会返回任何内容。我认为这意味着无法建立websocket转移,但说实话,我在这方面没什么经验,所以可能是完全错误的。

有谁知道我做错了什么?

提前致谢

1 个答案:

答案 0 :(得分:1)

您是否已对NodeJS实例进行了群集?例如,如果使用SocketIO,则应使用群集会话存储。实际上,我目前正在研究在Vertx之上运行的SockJS。

背后的问题是亚马逊ELB过去不会尊重任何前锋(与HTTP之上的Sticky Session相反),这意味着可以在任何群集的节点上转发通过TCP级别的连接。是的,一个tcp频道可以。但是像SocketIO这样的框架更多地支持会话(WebSockets中不存在)和多个传输层(http,轮询,套接字等)。