ECS Fargate部署Nest.js遇502 Bad Gateway错误,Target Groups状态正常
确认Target Group的流量转发配置:检查Target Group的「目标端口」是否确实设置为3000,同时确认转发协议与Nest.js服务一致(Nest.js默认是HTTP,不要误设为HTTPS)。健康检查端口正确不代表转发端口也正确。
验证Nest.js的监听地址:确保代码中监听的是
0.0.0.0而非localhost,比如启动代码应为app.listen(3000, '0.0.0.0')。如果只监听localhost,容器内部健康检查能通过,但外部LB无法访问。可以通过docker exec进入容器,执行curl <任务ENI_IP>:3000测试连通性。检查LB到任务的网络连通性:
- 用VPC Reachability Analyzer验证LB的侦听器端口到任务ENI的3000端口的连通性,排查路由表、NACL是否存在限制。
- 在容器内执行
tcpdump port 3000,然后从LB的IP发起请求,观察是否有数据包进入容器。
查看LB访问日志:启用负载均衡器的访问日志,查看日志中的
target_port、response_code、error_reason字段,明确是连接失败、超时还是目标返回了异常状态码。确认任务ENI的安全组配置:Fargate awsvpc模式下,任务的ENI会使用单独的安全组,需确保该安全组允许LB安全组的IP访问3000端口,不要仅依赖服务层面的安全组配置。
测试直接访问任务端点:在VPC内的EC2实例或bastion主机上,直接访问任务的ENI IP:3000。如果能正常返回,问题出在LB的侦听器或转发规则;如果不能,排查任务本身的网络配置或服务启动状态。
检查LB侦听器规则:确认HTTPS侦听器绑定了有效的SSL证书,转发规则指向了正确的Target Group,没有设置错误的路径匹配规则(比如误将所有请求转发到不存在的路径)。
内容的提问来源于stack exchange,提问作者glothos

