使用AWS Application Load Balancer进行Websocket超时

时间:2017-06-20 14:26:45

标签: amazon-web-services docker websocket elastic-beanstalk

在使用Elastic Beanstalk环境中的Application Load Balancer尝试使用专门用于websockets的端口时,我遇到网关超时。

Web应用程序和websocket服务器保存在Docker容器中,应用程序运行正常,但wss://domain.com:8080将超时。

这是负载均衡器侦听器,使用wss的SSL证书。 Application Load Balancer Listeners

它指向的目标组是接受HTTP的“协议”(我已尝试过HTTPS)并将其转发到8080到EC2实例上。或者..它应该是。 (似乎不是应用程序负载均衡器上TCP的选项)。

我已经查看了应用程序负载均衡器日志,看起来它已到达目标组,但它与EC2实例的连接之间超时,我很难理解为什么。

目前所有AWS安全组都已在所有流量上打开,我检查了主机,发现端口已打开并被Nginx监听,Nginx将路由到正确的端口到docker容器: EC2 Host instance open port

docker ps也告诉我: docker ps

一旦进入容器,我就可以看到Websocket服务器正在监听端口: enter image description here

所以它不能是EC2实例本身,可以吗?是否存在通过ALB中的端口路由websockets的问题?

- 编辑 -

ALB的当前SG:

ALB

EC2实例SG: EC2

2 个答案:

答案 0 :(得分:2)

Websockets需要双向通信,确保连接到所有资源(EC2和ALB)的安全组允许入站和放大。所需端口上的出站通信。

答案 1 :(得分:0)

这里接受的答案似乎是“由于Websocket需要双向通信,因此EC2(Web服务器)和所需端口上的ALB入站和出站通信的开放安全组”。

这是不正确的,它解决问题的原因是偶然的。

让我解释一下:

“ Websockets需要双向通信...”-可以,但是TCP会话只能以一种方式打开-从客户端打开。

您不必为了使用Web套接字而允许来自EC2实例(Web服务器)的任何出站连接。

当然,ALB需要能够与EC2实例建立TCP连接。 但不适用于客户。为什么?好吧,ALB正在接受TCP连接(通常在端口80和443上)。它正在建立由客户端启动的TCP会话。然后,它尝试建立到ALB后面的Web服务器的新TCP会话。这应该在您决定让Web服务器监听的端口上完成。 ALB周围的安全组需要能够在此端口上与网络服务器建立出站连接。这就是“开放一切”工作的原因。它与“双向通信”无关。

您当然可以使用任何端口,但不需要 在负载均衡器或EC2上使用除80和443(例如8080)以外的任何其他端口。