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

问题描述:

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

我确认,根据我们自己的测试,即在TCP/SSL配置ELB,而不是哦,HTTP/HTTPS,使得使用WebSockets的伎俩。缺点是两个:

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

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

UPDATE 2013年7月:亚马逊刚刚添加代理协议,这解决了上述缺陷数2支持。使用代理协议,即使在ELB工作在TCP级别而不是HTTP时,也会添加包含客户端始发IP的标头。全部细节:http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-proxy-protocol.html

UPDATE 2016年8月:亚马逊刚刚宣布了新的AWS应用负载平衡器,支持WebSocket的7层(以及HTTP/2.0和基于内容的路由)。请参阅https://aws.amazon.com/it/blogs/aws/new-aws-application-load-balancer/

+0

WSS可以与第二个选项一起使用吗? – whadar 2013-01-15 15:44:56

+1

...有[处理PROXY协议的模块](http://*.com/q/17981943/201952)。 – josh3736 2013-07-31 22:30:31

+0

...或上述模块的当前活动[fork](https://github.com/findhit/proxywrap)。 – jamix 2015-04-21 12:32:59

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

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

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

+1

HTTP粘性通常更希望在AWS ELB终止SSL,如果只让续订证书在一个地方容易地进行。这也意味着可能存在漏洞的应用程序代码无法访问证书。当然,缺点是ELB和应用程序之间的通信是未加密的,但这可以通过VPC和强化的网络安全来缓解。 – jokeyrhyme 2014-08-26 22:24:04

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

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

缺点是粘滞性和ELB将请求转发到其他服务器的能力,如果它选择的当前服务器返回错误。 – 2012-06-05 01:19:21

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

  1. 开放80端口上所有相关的SG
  2. 就80
  3. 启用的NodeJS响应HTTP-80要求运行的NodeJS(的NodeJS会升级HTTP请求在后端的WebSocket)
  4. 使ALB目标群体检查HTTP-80 &正确平路
  5. 上ALB创建听众:http80->http80, https443->http80
  6. CRE吃了ALB监听规则:http80->target group, https443->target group
  7. 启用
+1

你是如何配置健康检查/ ping路径为此工作? – BrokenGlass 2016-09-16 03:05:34

+0

我最终为健康检查创建了一个单独的HTTP端点。根据[文档](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/target-group-health-checks.html),“...健康检查不支持WebSockets”。 – dskrvk 2016-11-26 17:35:44

+0

@dskrvk您在哪里以及如何为您的健康检查设置了端点?你在为ALB运行nginx吗?我处于相同的情况下不运行nginx,现在确定我应该为健康检查提供哪些文件以及它应该如何响应? – jdog 2018-02-16 04:22:51