在 AWS Elastic Load Balancer 后面使用 Primus.io (websockets)

Posted

技术标签:

【中文标题】在 AWS Elastic Load Balancer 后面使用 Primus.io (websockets)【英文标题】:Using Primus.io (websockets) behind AWS Elastic Load Balancer 【发布时间】:2013-11-27 10:06:57 【问题描述】:

我正在尝试设置一个弹性负载均衡器,以将请求路由到运行 Primus.io 并使用 sockjs 管理实时通信的 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 地址切换到平衡器的 IP 地址时,它会失败,并且对 node.js 服务器的初始 https 请求没有返回任何内容。我认为这意味着无法建立 websocket 传输,但老实说,我在这方面的经验很少,因此可能完全错误。

有人知道我做错了什么吗?

提前致谢

【问题讨论】:

【参考方案1】:

你有集群你的 NodeJS 实例吗?例如,如果您使用 SocketIO,您应该使用集群会话存储。实际上,我目前也在研究在 Vertx 之上运行的 SockJS。

背后的问题是 Amazon ELB 不会尊重过去的任何转发(与 HTTP 之上的粘性会话相反),这意味着可以在任何集群的节点上转发通过 TCP 级别的连接。是的,一个 tcp 通道就可以了。但是像 SocketIO 这样的框架在支持会话(WebSocket 中不存在)和多个传输层(http、轮询、套接字等)方面做得更多。

【讨论】:

好的。我在使用 2 个 Vert.X + SockJS 实例的集群时遇到了同样的问题。似乎很好(浏览器正在建立套接字连接,并收到前 3-4 个 ping)。但随后连接是静默的。 谢谢...我仍然没有找到解决方案,可能需要设置另一个运行 Haproxy 的 EC2 实例来解决它。不好。 我目前正在使用基于 Vert.X verticles 的 SockJS 集群测试标准 ELB (TCP/SSL)。似乎工作,没有任何会话。基本上是无状态的,但是,我使用自生成的应用感知令牌来识别连接。

以上是关于在 AWS Elastic Load Balancer 后面使用 Primus.io (websockets)的主要内容,如果未能解决你的问题,请参考以下文章

无法让 https 在 Elastic Load Balancer (AWS) 上工作

AWS Elastic Load Balancing 和 Auto Scaling 之间的区别

aws创建Elastic Load Balancing

在 AWS Elastic Load Balancer 后面使用 Primus.io (websockets)

如何知道我是不是需要使用 AWS Elasticache 和 AWS Elastic Load Balancing?

Aws Elastic Load Balancing 安全组不允许入站调用