AWS实例上Nginx报host not found in upstream错误频繁宕机如何解决
根因定位
你遇到的报错[emerg] host not found in upstream "nlb-url"核心触发逻辑如下:
- Nginx默认对upstream配置块、proxy_pass中直接写入的域名,仅会在进程启动/重载配置时执行一次DNS解析,后续运行过程中不会主动更新解析结果
- AWS NLB的域名属于动态解析资源,官方默认DNS TTL为60秒,对应的后端IP会随着扩缩容、故障切换等场景动态变更,一旦IP更新后Nginx持有的旧解析记录失效,就会抛出上述错误,导致进程异常退出,返回503错误
- 你每次重启Nginx后服务恢复,是因为重启阶段Nginx会重新触发DNS解析,拿到NLB最新的有效IP,属于临时修复,等到下一次NLB IP变更后问题会复现
修复方案
- 第一步:配置Nginx动态解析规则
在Nginx的http配置块中添加resolver配置,指定DNS服务器地址和解析有效期,适配AWS NLB的TTL特性:
http { # 填写你AWS VPC的默认DNS服务器,一般为VPC网段首地址+2,例如VPC是10.0.0.0/16则DNS为10.0.0.2,也可填公共DNS如8.8.8.8 resolver 10.0.0.2 valid=60s; resolver_timeout 10s; # 你的原有upstream配置保持不变即可 upstream your_upstream_name { server 你的NLB域名; } }
如果你的NLB域名是直接写在proxy_pass配置中,需要调整为变量写法强制触发动态解析:
server { location / { set $nlb_addr 你的NLB域名; proxy_pass http://$nlb_addr; } }
- 第二步:配置Nginx进程异常自动恢复
修改Nginx的systemd服务配置,添加自动重启策略,避免进程崩溃后服务长时间不可用:
- 编辑配置文件
/usr/lib/systemd/system/nginx.service,在[Service]段添加如下配置:
Restart=always RestartSec=5
- 执行命令
systemctl daemon-reload && systemctl restart nginx使配置生效
- 验证方式:配置完成后手动执行
nginx -t检查配置语法是否正确,重载配置后观察24小时以上确认不再复现宕机问题
附件参考
Nginx运行状态截图:
内容的提问来源于stack exchange,提问作者Sabreen Salama
相关产品推荐
相关产品推荐


