如何使用HTTPS / SSL获得亚马逊的ELB以使用Web套接字?

时间:2012-02-07 22:22:06

标签: node.js amazon-ec2 websocket amazon-elb

现在似乎没有用。我在亚马逊ELB背后使用Faye和NodeJS。当我打开HTTPS时,连接无法再进行中断。我在这里找到了一个未回答的问题:https://forums.aws.amazon.com/message.jspa?messageID=283293。有人能够让这个工作吗?在运行我自己的HAProxy实例之外还有其他工作吗?

4 个答案:

答案 0 :(得分:42)

根据我们自己的测试,我确认在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 Application Load Balancer ,它支持第7层的WebSocket(以及HTTP / 2.0和基于内容的路由)。见https://aws.amazon.com/it/blogs/aws/new-aws-application-load-balancer/

答案 1 :(得分:10)

它不起作用,ELB的HTTP(S)代理至少现在不理解websocket请求,我不知道何时/是否有计划。

我不确定HAProxy是否完全必要。应该可以放置SSL终结器,例如stud / stunnel,与nodejs服务器在同一个实例上并通过这种方式传递。然后,您可以保留ELB,但将其置于TCP模式。

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

答案 2 :(得分:4)

在詹姆斯回答之后,我做了一些研究并最终进入TCP路线,不确定使用ELB的HTTP隧道(考虑到我不需要粘性)存在任何缺点。好处是你不需要做螺柱/ stunnel,因为ELB为你提供。所以NodeJS / Faye正在侦听端口8000的最终ELB设置:

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

答案 3 :(得分:1)

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

  1. 在所有相关的SG上打开80端口
  2. 使NodeJS在80
  3. 上运行
  4. 启用NodeJS响应http-80请求(NodeJS将http请求升级到后端的websocket)
  5. 使ALB目标组检查http-80&正确的ping路径
  6. 在ALB上创建侦听器:Watch
  7. 在ALB上创建侦听器规则:Visual Studio
  8. 中启用http粘性