首页 文章

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

提问于
浏览
0

我正在尝试设置一个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地址切换到 balancer 器的IP地址时,它会失败,并且对node.js服务器的初始https请求不会返回任何内容 . 我认为这意味着无法 Build websocket转移,但说实话,我在这方面没什么经验,所以可能是完全错误的 .

有谁知道我做错了什么?

提前致谢

1 回答

  • 1

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

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

相关问题