You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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误判实例不健康)。
  • 查看目标组的实例状态:在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 nginx
    
    确保服务没有报错,状态是active (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用,这个一般默认开放)。
  • 子网的网络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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:51:53