我正在尝试设置一个Elastic负载均衡器,以便将请求路由到运行带有sockjs的Primus.io的node.js服务器集群,以管理实时通信。
我已设置负载均衡器以使用以下配置进行侦听:
我的理解是,让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转移,但说实话,我在这方面没什么经验,所以可能是完全错误的。
有谁知道我做错了什么?
提前致谢
答案 0 :(得分:1)
您是否已对NodeJS实例进行了群集?例如,如果使用SocketIO,则应使用群集会话存储。实际上,我目前正在研究在Vertx之上运行的SockJS。
背后的问题是亚马逊ELB过去不会尊重任何前锋(与HTTP之上的Sticky Session相反),这意味着可以在任何群集的节点上转发通过TCP级别的连接。是的,一个tcp频道可以。但是像SocketIO这样的框架更多地支持会话(WebSockets中不存在)和多个传输层(http,轮询,套接字等)。