Route53+Elastic Load Balancer无响应但EC2实例正常的问题求助
兄弟,我帮你梳理下这个问题的排查思路,结合你描述的场景——Route53→HTTPS ALB→双EC2(Node.js+Nginx),直接访问EC2公网DNS正常但ALB返回503/504,大概率是健康检查、Nginx配置或者安全组的问题,咱们一步步来:
第一步:优先排查ALB的健康检查(503/504最常见诱因)
ALB返回503通常是目标实例被判定为不健康,504则是请求超时,先从这里入手:
- 检查目标组的健康检查配置:
- 如果现在用80端口(Nginx),健康检查的协议要设为
HTTP,端口选80,路径要对应你的应用能正常返回200的端点(比如/或者专门的健康检查路径/health)。 - 确认健康检查的响应码范围是
200-399,超时时间、间隔时间不要设置得太短(比如默认5秒超时,如果你的应用启动慢或者响应稍缓,会导致ALB误判实例不健康)。
- 如果现在用80端口(Nginx),健康检查的协议要设为
- 查看目标组的实例状态:在AWS控制台的目标组页面,看两个EC2实例的状态是
healthy还是unhealthy,如果是不健康,控制台会给出具体的失败原因(比如“连接超时”“响应码不符合要求”)。
第二步:验证Nginx的反向代理配置(当前80端口场景)
你直接访问EC2公网DNS正常,但通过ALB不行,说明Nginx可能没正确把ALB的请求转发到Node.js的9000端口:
- 打开Nginx的站点配置文件(通常在
/etc/nginx/sites-available/your-app.conf或者/etc/nginx/nginx.conf里的server块),确认配置是否正确:server { listen 80 default_server; listen [::]:80 default_server; server_name _; # 用通配符适配ALB过来的请求Host location / { proxy_pass http://localhost:9000; # 必须保留这些Header,否则Node.js可能无法正确处理请求 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } - 重启Nginx并检查状态:
确保服务没有报错,状态是sudo systemctl restart nginx sudo systemctl status nginxactive (running)。 - 在EC2内部测试本地80端口:执行
curl http://localhost:80,看是否能拿到和直接访问EC2公网DNS一致的API响应,如果不行,说明Nginx配置有问题,先把这个环节调通。
第三步:检查安全组与网络ACL的规则
网络权限是很容易忽略的点:
- ALB的安全组:
- 入站规则:允许来自
0.0.0.0/0和::/0的HTTPS(443)请求(因为用户要通过域名访问)。 - 出站规则:允许到EC2实例安全组的HTTP(80)请求(因为目标组是80端口)。
- 入站规则:允许来自
- EC2实例的安全组:
- 入站规则:允许来自ALB安全组的HTTP(80)请求(不要直接开
0.0.0.0/0的80,虽然能工作但不安全),同时允许本地回环(127.0.0.1)的9000端口(Nginx转发到Node.js用,这个一般默认开放)。
- 入站规则:允许来自ALB安全组的HTTP(80)请求(不要直接开
- 子网的网络ACL:
- 入站规则:允许443端口(到ALB)、80端口(到EC2)的流量。
- 出站规则:允许所有必要的出站流量(比如EC2到互联网的请求,用于安装依赖、Node.js调用外部服务等)。
第四步:回溯最初的9000端口场景(可选验证)
你之前不用Nginx时ALB返回504,大概率是:
- EC2安全组没有开放ALB安全组对9000端口的访问,导致ALB无法连接到Node.js服务,超时返回504。
- 健康检查路径错误:比如Node.js在9000端口的
/路径没有返回200,导致ALB判定实例不健康。
最后:借助日志精准定位
如果上面的步骤都没解决问题,就看日志找线索:
- ALB访问日志:在AWS控制台开启ALB的访问日志,存到S3桶里,下载后查看具体的请求记录,里面会显示目标实例、响应码、错误原因(比如
target-unhealthy)。 - Nginx日志:查看
/var/log/nginx/access.log,看有没有ALB发来的请求;查看/var/log/nginx/error.log,看有没有转发错误。 - Node.js应用日志:确认有没有收到Nginx转发的请求,有没有异常报错。
内容的提问来源于stack exchange,提问作者relentless-coder
相关产品推荐
相关产品推荐

