0

我正在尝试设置一个弹性负载均衡器,以将请求路由到运行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 传输,但老实说,我在这方面的经验很少,所以可能是完全错误的。

有谁知道我做错了什么?

提前致谢

4

1 回答 1

1

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

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

于 2013-11-20T20:25:29.407 回答