25

这似乎现在不起作用。我在 Amazon ELB 后面使用 Faye 和 NodeJS。当我打开 HTTPS 时,无法再代理连接。我在这里发现了一个未回答的问题:https ://forums.aws.amazon.com/message.jspa?messageID=283293 。任何人都能得到这个工作?除了运行我自己的 HAProxy 实例之外,还有其他工作吗?

4

4 回答 4

42

我确认,根据我们自己的测试,在 TCP/SSL 上配置 ELB,而不是 HTTP/HTTPS,使用 WebSockets 是成功的。缺点有两个:

1)正如arturnt已经指出的那样,你不能得到粘性。

2) 您将失去检索客户身份的能力。您的 WebSocket 服务器看到的原始 IP 将始终是 ELB 之一,并且与 HTTP/HTTPS 配置不同,不会将 X-Forwarded-For 标头添加到请求中。

2013 年 7 月更新:亚马逊刚刚增加了对Proxy Protocol的支持,它解决了上面的第 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/

于 2012-02-09T12:14:34.523 回答
10

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

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

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

于 2012-02-07T22:47:34.127 回答
4

在詹姆斯的回答之后,我做了更多的研究并最终选择了 TCP 路由,不确定使用 ELB 的 HTTP 隧道有什么缺点(考虑到我不需要粘性)。好消息是你不需要做螺柱/隧道,因为 ELB 为你提供了。因此,NodeJS/Faye 在端口 8000 上侦听的最终 ELB 设置:

Secure TCP Forward (443) -> Local (8000)
TCP Forward 80 -> Local(8000)
于 2012-02-08T01:23:28.557 回答
1

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

  1. 在所有相关 SG 上打开 80 端口
  2. 让 NodeJS 在 80 上运行
  3. 启用 NodeJS 响应 http-80 请求(NodeJS 将在后端将 http 请求升级到 websocket)
  4. 让 ALB 目标组检查 http-80 和正确的 ping 路径
  5. 在 ALB 上创建侦听器:http80->http80, https443->http80
  6. 在 ALB 上创建侦听器规则:http80->target group, https443->target group
  7. 启用 http 粘性
于 2016-08-25T09:02:32.877 回答