AWS NLB健康检查失败:Docker端口映射80:3000后目标实例异常
核心排查方向
NLB的TCP健康检查是直接连接EC2实例的主机80端口,而非容器内部端口。Apache正常说明主机80端口能正常响应,但Docker映射80:3000后出现问题,重点排查主机80端口的实际监听与连通性。
具体调试步骤
检查主机80端口监听状态
登录EC2实例,执行命令查看80端口的监听进程:ss -tulpn | grep :80正常情况下应该看到
docker-proxy或相关进程监听0.0.0.0:80或EC2私有IP:80。如果没有任何结果,说明Docker端口映射未生效;如果监听的是127.0.0.1:80,则NLB的外部请求无法访问。测试主机本地80端口连通性
在EC2实例内部直接访问80端口:curl -v localhost:80 # 或用telnet测试 telnet localhost 80如果连接失败,说明Docker映射的端口实际不通。此时需检查Node.js应用的监听地址:确保应用绑定的是
0.0.0.0:3000而非127.0.0.1:3000——后者仅允许容器内部访问,Docker代理无法转发外部请求到容器的3000端口。验证Docker容器端口配置
查看容器的端口绑定详情:docker inspect <你的容器ID或名称> | grep -A5 -B5 "PortBindings"确认输出中存在
"80/tcp": [{"HostPort": "80"}],同时查看NetworkSettings.Ports.3000/tcp的HostIp是否为0.0.0.0(允许所有IP访问)。查看NLB健康检查失败详情
登录AWS控制台,进入目标组页面,查看健康检查的失败原因:- 若为
Connection refused:主机80端口未正常监听或被阻止 - 若为
Timeout:需检查EC2实例的路由表、NACL(网络访问控制列表)是否允许NLB的健康检查流量(即使安全组全开,NACL可能有默认拒绝规则)
- 若为
检查主机iptables规则
Docker会自动添加iptables转发规则,执行以下命令查看是否存在异常:iptables -L DOCKER -n确认存在类似
ACCEPT tcp -- 0.0.0.0/0 172.x.x.x tcp dpt:3000的规则(172.x.x.x为容器私有IP),同时检查INPUT链是否允许80端口的入站流量。
内容的提问来源于stack exchange,提问作者cristian sierra

