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

Nginx代理AWS ALB(私有子网)两周后出现504超时问题求助

问题排查与解决方案

核心现象回顾

私有子网部署2台API服务器,通过ALB路由;公有子网Web应用用Nginx反向代理到ALB,配置如下:

location /api  {
  proxy_pass $my-alb-address
}

初始运行正常,但每两周会出现Nginx proxy_pass返回504超时的问题——此时在Web服务器上直接curl ALB地址完全正常,重启Nginx后恢复,两周后问题复发。同时考虑通过VPC链接直接调用ALB,想确认可行性及解决方案。

可能原因及解决办法

1. Nginx长连接未正确回收,导致失效连接复用

Nginx默认会和后端(ALB)建立长连接,如果ALB的空闲连接超时时间比Nginx的短,或者Nginx连接池配置不合理,会出现Nginx还在复用已经被ALB关闭的连接,从而触发504。

解决配置:
在location /api块中添加以下参数,强制规范连接生命周期:

location /api {
  proxy_pass $my-alb-address;
  # 启用HTTP/1.1并禁用长连接复用,避免失效连接残留
  proxy_http_version 1.1;
  proxy_set_header Connection "";
  # 设置超时时间,避免请求挂起
  proxy_connect_timeout 30s;
  proxy_send_timeout 30s;
  proxy_read_timeout 30s;
  # 遇到错误时自动重试上游
  proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}

同时在Nginx的http块中调整连接池参数,避免耗尽:

http {
  worker_connections 1024;
  keepalive_timeout 65s;
  keepalive_requests 100; # 每个连接处理100次请求后自动关闭
}

2. Nginx缓存了ALB的旧DNS记录

ALB的IP地址可能会被AWS自动更换,但Nginx启动时会解析一次ALB域名并缓存,后续不会自动更新。这就导致Nginx请求到旧的失效IP,出现504;而curl每次都会重新解析DNS,所以能正常访问。

解决配置:
让Nginx定期重新解析ALB域名,在http块或location块中添加DNS解析配置:

location /api {
  proxy_pass http://$my-alb-address;
  # 使用公共DNS,每5分钟重新解析一次ALB域名
  resolver 8.8.8.8 1.1.1.1 valid=300s;
  resolver_timeout 5s;
}

注意:确保$my-alb-address是完整的域名(比如my-alb-123456789.us-east-1.elb.amazonaws.com),而非仅IP或不完整地址。

3. VPC链接(PrivateLink)的可行性

完全可行,且能从架构层面解决跨子网访问的稳定性问题:

  • 通过AWS PrivateLink创建VPC端点,让公有子网的Web服务器通过私有链路直接访问ALB,无需走公网,彻底避免DNS解析变化、公网波动等问题。
  • 配置步骤:在VPC控制台创建针对ALB的PrivateLink端点,确保公有子网的安全组允许访问该端点的端口,最后修改Nginx的proxy_pass为PrivateLink端点的DNS地址即可。

应急与排查建议

  • 问题出现时,优先查看Nginx错误日志(默认路径/var/log/nginx/error.log),日志里会明确显示是连接超时、连接被拒绝还是其他原因,能精准定位问题。
  • 若暂时无法彻底解决,可设置每周定时重启Nginx的脚本作为临时缓解,但这只是权宜之计,建议尽快从上述两个核心原因入手修复。

内容的提问来源于stack exchange,提问作者Đức Minh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 14:43:16