我在端口 8080 上的 EC2 实例上有一个运行着的 node.js websocket 服务器。普通的 websocket 连接 ( ws://
) 工作正常,但是当我尝试建立安全连接 ( wss://
) 时,websocket 连接失败。
我意识到 wss 请求被发送到端口 443,所以我使用 ALB 将端口 443 上的请求转发到端口 8080。由于我对 AWS 还很陌生,我不知道我是否做得正确。以下是我所做的。
- Node.js 服务器在 EC2 实例中监听端口 8080。
- 这些是该 EC2 实例的入站安全规则
- 带有侦听器的应用程序负载均衡器
HTTPS: 443
它使用 HTTPS 协议将其转发到端口 8080 上的我的 EC2 实例。我还将 SSL 证书附加到 ALB。
我就是搞不清楚我做错了什么。如能得到任何帮助我将不胜感激。
更新:
- 我已经创建了两个安全组(ec2-sg 和 alb-sg)并对其进行配置,使得 ec2-sg 接收来自 alb-sg 的流量。
但是,我无法让它工作。目标组通过了健康检查,我启用了粘性会话,但 websocket 连接一直失败。以前可以正常工作的正常 ws 连接也停止工作了。这让我相信我搞砸了 ALB(因为它在没有负载平衡器的情况下工作)
更新 2:
我为负载均衡器启用了访问日志。以下是日志:
https 2021-10-08T08:55:39.157549Z app/alb-latest/3e73469ba9514449 167.94.138.60:32854 172.31.93.226:8080 -1 -1 -1 502 - 41 1215
"GET https://3.208.76.74:443/ HTTP/1.1" "-" ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 arn:aws:elasticloadbalancing:us-east-1:144045735746:targetgroup/ec2-8080-server/2cbf4f7eb51c201e
"Root=1-6160078b-606aed86364c5e3f7db627f1" "-" "arn:aws:acm:us-east-1:144045735746:certificate/53a04011-1ea7-4689-b6c6-a7372e42191d" 0 2021-10-08T08:55:39.156000Z
"forward" "-" "-" "172.31.93.226:8080" "-" "-" "-"
ALB 听众 我还为目标群组启用了群组级别粘性,为期 1 天
答案1
只需将我的评论复制并粘贴到答案中即可解决问题。
ALB SG 仅允许端口 8080 出站到另一个 SG。这意味着它将无法将响应发送到客户端,客户端将监听某个非 8080 的随机端口。最好的方法是删除出站规则并专注于入站规则 - 安全组是有状态的,因此出站规则不一定是必需的,并且会增加复杂性!