在使用Elastic Beanstalk环境中的Application Load Balancer尝试使用专门用于websockets的端口时,我遇到网关超时。
Web应用程序和websocket服务器保存在Docker容器中,应用程序运行正常,但wss://domain.com:8080将超时。
它指向的目标组是接受HTTP的“协议”(我已尝试过HTTPS)并将其转发到8080到EC2实例上。或者..它应该是。 (似乎不是应用程序负载均衡器上TCP的选项)。
我已经查看了应用程序负载均衡器日志,看起来它已到达目标组,但它与EC2实例的连接之间超时,我很难理解为什么。
目前所有AWS安全组都已在所有流量上打开,我检查了主机,发现端口已打开并被Nginx监听,Nginx将路由到正确的端口到docker容器:
一旦进入容器,我就可以看到Websocket服务器正在监听端口:
所以它不能是EC2实例本身,可以吗?是否存在通过ALB中的端口路由websockets的问题?
- 编辑 -
ALB的当前SG:
答案 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)以外的任何其他端口。