部署在AWS的Node应用(ALB、ASG、私有子网EC2)持续返回504错误
问题诊断与修复方案
可能的配置问题
以下是导致ALB返回504网关超时的核心配置问题:
1. ALB安全组冗余配置引发冲突
你创建互联网型ALB时,同时绑定了自定义NodeApiPublicLBSG和默认VPC安全组。默认安全组的入站规则仅允许同组内流量,会干扰ALB接收外部请求;另外,NodeApiPublicLBSG的出站规则大概率未明确放行到私有子网EC2实例4000端口的流量。
2. EC2实例安全组未限定放行端口
NodeApiPrivateInstanceSG仅设置允许来自NodeApiPublicLBSG的流量,但未指定放行4000端口,导致ALB的流量无法抵达EC2上的应用进程。
3. 目标组健康检查路径不匹配
你仅设置了目标组端口为4000,但未将健康检查路径指定为应用的/health端点。若使用默认路径(如/),可能触发健康检查失败,ALB会拒绝向该实例转发流量,最终导致超时。
4. 网络ACL(NACL)流量限制
自定义VPC的NACL默认拒绝所有流量,可能存在以下限制:
- 公有子网NACL未允许入站80/443端口(来自互联网)及出站4000端口(到私有子网CIDR)
- 私有子网NACL未允许入站4000端口(来自公有子网CIDR)及出站临时端口(1024-65535)(用于向ALB返回响应)
修复步骤
按以下顺序调整配置,逐一验证:
1. 修正ALB安全组配置
- 登录AWS控制台,进入「EC2 -> 负载均衡器」,找到目标ALB
- 在「安全组」标签页,移除默认VPC安全组,仅保留
NodeApiPublicLBSG - 编辑
NodeApiPublicLBSG的出站规则:添加一条规则,允许TCP 4000端口,目标为私有子网CIDR(10.0.128.0/18+10.0.192.0/18)
2. 更新EC2实例安全组入站规则
- 进入「EC2 -> 安全组」,找到
NodeApiPrivateInstanceSG - 编辑入站规则:添加一条规则,允许TCP 4000端口,来源为
NodeApiPublicLBSG的安全组ID
3. 调整目标组健康检查配置
- 进入「EC2 -> 目标组」,找到目标组
- 在「健康检查」标签页,将路径修改为
/health,确认端口为4000、协议为HTTP后保存 - 等待5-10分钟,查看「目标」标签页,确认所有EC2实例的健康状态为「健康」
4. 验证并修正网络ACL配置
- 进入「VPC -> 网络ACL」,分别检查公有子网和私有子网的NACL:
- 公有子网NACL:
- 入站:允许TCP 80/443(来源
0.0.0.0/0)、允许TCP 4000(来源私有子网CIDR) - 出站:允许TCP 4000(目标私有子网CIDR)、允许所有临时端口(1024-65535,目标
0.0.0.0/0)
- 入站:允许TCP 80/443(来源
- 私有子网NACL:
- 入站:允许TCP 4000(来源公有子网CIDR)
- 出站:允许所有临时端口(目标公有子网CIDR)、允许所有流量到NAT网关(确保实例能访问互联网)
- 公有子网NACL:
5. 确认ASG与目标组关联状态
- 进入「EC2 -> Auto Scaling Groups」,找到目标ASG,在「目标组」标签页确认关联正确
- 检查ASG创建的实例是否已成功注册到目标组,且健康状态正常
内容的提问来源于stack exchange,提问作者Wai Yan Hein
相关产品推荐
相关产品推荐

