在 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 Balancer 后面使用 Primus.io (websockets)