如何通过HTTPS / SSL获得Amazon的ELB与Web套接字配合使用?

这似乎没有正在工作。 我在Amazon ELB后面用了NodeJS的Faye。 当我打开HTTPS时,连接不能再被斡旋。 我在这里find了一个没有答案的问题: https : //forums.aws.amazon.com/message.jspa? messageID =283293 。 任何人都可以得到这个工作? 运行我自己的HAProxy实例之外有什么工作吗?

我确认,根据我们自己的testing,在TCP / SSL上configurationELB,而不是HTTP / HTTPS,使WebSockets的技巧。 缺点是两个:

1)正如arturnt所指出的那样,你不能粘性。

2)您将失去获取客户身份的能力。 您的WebSocket服务器看到的始发IP将始终是ELB,并且与HTTP / HTTPSconfiguration不同,不会将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 Application Load Balancer ,它支持第7层的WebSocket(以及HTTP / 2.0和基于内容的路由)。 请参阅https://aws.amazon.com/it/blogs/aws/new-aws-application-load-balancer/

这将不起作用,ELB的HTTP(S)代理不理解websocket请求,至less现在,我不知道什么时候/是否计划。

我不确定HAProxy是完全必要的。 应该可以将一个SSL终止符(例如stud / stunnel)放在与您的nodejs服务器相同的实例上并通过这种方式。 然后你可以保持ELB,但把它放在TCP模式。

很明显,每个实例都有SSL开销,但从长远来看,这可能比将SSL卸载到ELB(特别是基于用户对ELB的SSL性能的评论)更好。

在詹姆斯的回答之后,我做了一些更多的研究,最后到了TCP路由,不确定在使用ELB的HTTP隧道(考虑到我不需要粘性)方面有什么缺点。 好的是你不需要做stud / stunnel,因为ELB为你提供。 所以最后的ELB设置NodeJS / Faye正在端口8000监听:

Secure TCP Forward (443) -> Local (8000) TCP Forward 80 -> Local(8000) 

你可以使用Application LB来很好的支持websocket。 在ALB上实施了一些技巧之后,我在我们的最新项目中实现了这个想法:

  1. 在所有相关的SG上开放80个端口
  2. 使NodeJS在80上运行
  3. 启用NodeJS响应http-80请求(NodeJS将http请求升级到后端的websocket)
  4. 使ALB目标组检查http-80&正确的pingpath
  5. 在ALB上创build侦听器: http80->http80, https443->http80
  6. 在ALB上创build侦听器规则: http80->target group, https443->target group
  7. 启用HTTP粘性