Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何获得亚马逊';s ELB与HTTPS/SSL一起使用Web套接字?_Node.js_Amazon Ec2_Websocket_Amazon Elb - Fatal编程技术网

Node.js 如何获得亚马逊';s ELB与HTTPS/SSL一起使用Web套接字?

Node.js 如何获得亚马逊';s ELB与HTTPS/SSL一起使用Web套接字?,node.js,amazon-ec2,websocket,amazon-elb,Node.js,Amazon Ec2,Websocket,Amazon Elb,这似乎现在不起作用。我在亚马逊ELB后面用Faye和NodeJS。当我打开HTTPS时,连接就不能再被代理。我发现这里有一个问题没有回答:。有人能让它工作吗?除了运行我自己的HAProxy实例之外,还有什么其他的工作吗?它不会工作,ELB的HTTP(s)代理不理解websocket请求,至少现在是这样,我不知道何时/是否计划好了 但我不确定HAProxy是否完全必要。应该可以将SSL终止符(例如stud/stunnel)放在与nodejs服务器相同的实例上,并以这种方式通过。然后可以保留ELB,

这似乎现在不起作用。我在亚马逊ELB后面用Faye和NodeJS。当我打开HTTPS时,连接就不能再被代理。我发现这里有一个问题没有回答:。有人能让它工作吗?除了运行我自己的HAProxy实例之外,还有什么其他的工作吗?

它不会工作,ELB的HTTP(s)代理不理解websocket请求,至少现在是这样,我不知道何时/是否计划好了

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


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

在James的回答之后,我做了更多的研究,最终选择了TCP路由,不确定使用ELB的HTTP隧道是否有任何缺点(考虑到我不需要粘性)。好的是,你不需要做螺柱/特技,因为ELB为你提供了这一点。最后的ELB设置,其中NodeJ/Faye正在监听端口8000:

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

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

1) 正如arturnt已经指出的,您无法获得粘性

2) 您将无法检索客户端的标识。WebSocket服务器看到的原始IP将始终是ELB IP,并且与HTTP/HTTPS配置不同,不会向请求添加X-Forwarded-For头

2013年7月更新:亚马逊刚刚增加了对代理协议的支持,解决了上述第2个缺陷。使用代理协议,即使ELB在TCP级别而不是HTTP级别工作,也会添加包含客户端原始IP的头。详情如下:


2016年8月更新:亚马逊刚刚发布了新的AWS应用程序负载平衡器,它支持第7层的WebSocket(以及HTTP/2.0和基于内容的路由)。请参见

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

  • 打开所有相关SGs上的80端口
  • 使NodeJS在80上运行
  • 启用响应http-80请求的NodeJS(NodeJS将在后端将http请求升级到websocket)
  • 使ALB目标组检查http-80并更正ping路径
  • 在ALB上创建侦听器:
    http80->http80,https443->http80
  • 在ALB上创建侦听器规则:
    http80->target group,https443->target group
  • 在中启用http粘性

  • 缺点是粘性和ELB在当前选择的服务器返回错误时将请求转发到其他服务器的能力。WSS可以与第二个选项一起使用吗?…并且有…或上述模块当前处于活动状态。无法使用粘性会话使ELB无法与WebSocket一起有效使用它每次都需要连接到同一个实例,这是无法保证的。@loourr正确的,我希望看到它实际工作,因为我们从现在开始一直在尝试它……通常更希望在AWS ELB终止SSL,如果只是为了在一个地方轻松地执行证书续订。这还意味着潜在易受攻击的应用程序代码无法访问证书。当然,缺点是ELB和应用程序之间的通信是未加密的,但这可以通过VPC和强化的网络安全性来缓解。您是如何配置运行状况检查/ping路径以使其工作的?我最终创建了一个单独的HTTP端点,仅用于运行状况检查。根据“…运行状况检查不支持WebSocket”。@dskrvk您在哪里以及如何为运行状况检查设置端点?您是否正在为您的ALB运行nginx?我没有运行nginx的情况与此相同,现在我确定应该为健康检查提供什么文件以及应该使用什么响应?我只是在我的应用程序中创建了另一个侦听器(Node.js HTTP服务器),该侦听器以状态200和字符串“OK”响应(尽管主体可以为空)。它可以是任何真正的东西——要么是应用程序中定义的端点,要么是Apache或nginx Web服务器的配置块。