我正在尝试设置一个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 回答
你有群集你的NodeJS实例吗?例如,如果使用SocketIO,则应使用群集会话存储 . 实际上,我目前也正在研究在Vertx之上运行的SockJS .
背后的问题是亚马逊ELB过去不会尊重任何前锋(与HTTP之上的Sticky Session相反),这意味着可以在任何集群的节点上转发通过TCP级别的连接 . 是的,一个tcp Channels 可以 . 但是像SocketIO这样的框架更多地支持会话(WebSockets中不存在)和多个传输层(http,轮询,套接字等) .