这似乎现在不起作用。我在亚马逊ELB后面使用带有NodeJS的Faye。当我打开HTTPS时,连接将不再被代理。我在这里发现了一个没有答案的问题:https://forums.aws.amazon.com/message.jspa?messageID=283293。有人能做到这一点吗?除了运行我自己的HAProxy实例之外,还有其他工作吗?
根据我们自己的测试,我确认,在TCP/SSL上配置ELB,而不是在HTTP/HTTPS上配置,可以使用WebSockets。缺点有两个:
1) 正如arturnt已经指出的,你不可能变得固执。
2) 您将失去检索客户端身份的能力。WebSocket服务器看到的原始IP将始终是ELB,并且与HTTP/HTTPS配置不同,不会向请求添加X-Forwarded-For标头。
2013年7月更新 :亚马逊刚刚增加了对代理协议的支持,解决了上述第2个缺点。使用代理协议,即使ELB工作在TCP级别,而不是HTTP级别,也会添加包含客户端原始IP的标头。完整详细信息:http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-proxy-protocol.html
更新2016年8月 :亚马逊刚刚宣布了新的AWS应用程序负载均衡器,它支持第7层的WebSocket(以及HTTP/2.0和基于内容的路由)。看见https://aws.amazon.com/it/blogs/aws/new-aws-application-load-balancer/
它不起作用,ELB的HTTP(s)代理不理解websocket请求,至少目前是这样,而且我不知道何时/是否计划这样做。
不过,我不确定HAProxy是否完全必要。应该可以将SSL终止符(例如stud/stunnel)放在与nodejs服务器相同的实例上,并通过这种方式。然后,您可以保留ELB,但将其置于TCP模式。
显然,每个实例都有SSL开销,但从长远来看,这可能比将SSL卸载到ELB更好(尤其是基于用户对ELB SSL性能的评论)。
James回答后,我做了更多的研究,最终选择了TCP路由,不确定与使用ELB的HTTP隧道相比是否有任何缺点(考虑到我不需要粘性)。好的是,你不需要做stud/stunnel,因为ELB为你提供了这一点。因此,NodeJS/Faye在端口8000:上侦听的最终ELB设置
Secure TCP Forward (443) -> Local (8000)
TCP Forward 80 -> Local(8000)
您可以使用ApplicationLB来很好地支持websocket。我刚刚在ALB:上实现了一些技巧后,在我们最新的项目中实现了这个想法
- 在所有相关SG上打开80端口
- 使NodeJS在80上运行
- 启用NodeJS响应http-80请求(NodeJS将http请求升级到后端的websocket)
- 使ALB目标组检查http-80&正确的ping路径
- 在ALB:
http80->http80, https443->http80
上创建侦听器 - 在ALB:
http80->target group, https443->target group
上创建侦听器规则 - 在中启用http粘性