nginx通过upstream动态解析后端服务需满足三要素:http块顶层配置resolver并设valid缓存时间、upstream中server行末尾加resolve、nginx版本≥1.19.9;同时需配合健康检查与dns变更验证,确保运行时按需解析并响应ip变更。

实现 Nginx 通过 upstream 动态解析后端服务,核心是让 Nginx 在运行时按需解析域名、自动感知 IP 变更,而非仅在启动时固化地址。这适用于容器漂移、滚动发布、云主机弹性伸缩等场景,关键在于 resolver + resolve 组合,并辅以合理容错机制。
启用 DNS 动态解析(基础条件)
从 Nginx 1.19.9 起,开源版原生支持动态 DNS 解析,无需编译额外模块:
- 在
http块顶层声明resolver,指定 DNS 服务器和缓存有效期,例如:resolver 1.1.1.1 8.8.8.8 valid=30s; - 在
upstream中每个server行末尾紧接resolve,不能换行或加空格:upstream api_backend { server api-svc.default.svc.cluster.local:8080 resolve; } -
valid=30s是本地强制缓存时间,不是 DNS 记录 TTL;建议按后端变更频率设定:云环境用 10–30s,K8s ClusterIP 用 60s,SLB 或 CDN 回源可用 300s
验证是否真正生效
配置正确不等于动态解析已运行,需确认三点同时满足:
- 执行
nginx -v确认版本 ≥ 1.19.9 - 重载后观察 error.log:
tail -f /var/log/nginx/error.log | grep "resolving",应出现类似resolving "api-svc.default.svc.cluster.local", resolver: 1.1.1.1:53 - 手动触发一次 DNS 变更(如更新 CoreDNS 配置),等待
valid时间后,用curl -I查看响应头中X-Upstream-Addr(需提前自定义log_format)是否更新为新 IP
搭配健康检查与故障转移
DNS 解析本身有延迟和失败风险,必须叠加基础容错能力:
- 每个
server后加上max_fails=2 fail_timeout=15s,快速隔离临时不可达节点 - 在
location或upstream中配置:proxy_next_upstream error timeout http_502 http_504;proxy_next_upstream_tries 3; - 慎用
backup:若设 backup 节点,它也必须带resolve,否则可能长期指向过期 IP
局限与适用边界
该方案轻量易用,但也有明确限制:
- 不主动探活——DNS 解析成功不代表服务可用,需依赖后端自身健康检查或配合
ngx_http_upstream_check_module(需额外编译) - 不感知注册中心状态——无法像 Consul/Nacos 那样根据服务健康标记(passing/critical)自动剔除节点
- 适合实例 IP 频繁变化但域名稳定的场景(如 Kubernetes Headless Service、云厂商 SLB 域名),不适合需权重、元数据、灰度路由等复杂调度逻辑的微服务治理











