nginx实现动态域名解析的关键,是让域名解析发生在请求阶段而非启动阶段,你可以用resolver指令配合变量proxy_pass,或者在新版开源nginx的upstream中直接使用resolve参数,也可以借助nginx Plus或第三方模块,从而在后端IP变化时无需reload即可自动更新。
很多运维同学都踩过这个坑:后端服务扩容、容器漂移或者云数据库切换IP后,nginx依然把请求打到旧地址,报502,原因很简单,nginx默认在启动时解析upstream里的域名,把IP缓存下来,之后DNS怎么变它都不管,下面从原理到配置,把几种主流方案讲清楚。
nginx动态域名解析怎么配置?先搞懂默认解析的坑
为什么域名变了nginx还在用旧IP
- nginx启动时解析
upstream中的域名,将结果缓存到内存。 - DNS记录的TTL变化、容器重建、云服务IP漂移,nginx都不会主动重新查询。
- 只有执行
nginx -s reload或重启,才会重新解析。 - 传统
proxy_pass http://backend;后面跟域名时,如果域名在upstream中定义,同样只在启动时解析一次。
业内专家指出,这种设计在静态服务器时代没有问题,但微服务和容器化普及后,后端地址频繁变化,动态解析就成了刚需,行业共识认为,解决思路无非两条:要么让nginx在运行时按需查询DNS,要么通过外部工具感知变化后触发reload。
动态解析的核心思路
- 让解析发生在请求阶段:使用
resolver指令指定DNS服务器,配合变量形式的proxy_pass,每次请求都会检查DNS缓存,过期后重新解析。 - 让upstream支持resolve:新版开源nginx(1.27.3+)和nginx Plus允许在
upstream的server指令后加resolve参数,配合zone共享内存,自动更新后端IP。 - 外部服务发现+模板

:用Consul、etcd、CoreDNS等感知变化,通过
consul-template生成配置文件并reload nginx。
nginx动态域名解析怎么配置?三种主流方案实操
新版开源版原生resolve(1.27.3+)
从nginx 1.27.3版本开始,开源版也支持在upstream中使用resolve参数,据NGINX官方文档,需要配合zone指令和resolver指令,配置示例:
http {
resolver 223.5.5.5 114.114.114.114 valid=30s ipv6=off;
upstream backend {
zone backend 64k;
server api.example.com:8080 resolve;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
zone定义共享内存区域,存储解析结果和状态。resolver指定DNS服务器,valid=30s表示30秒后重新解析。- 后端IP变化后,最长30秒自动生效,无需reload。
变量+resolver,全版本通用
如果你的nginx版本较老,或者用的是稳定版,可以用变量proxy_pass触发动态解析,配置示例:
server {
listen 80;
resolver 223.5.5.5 114.114.114.114 valid=10s ipv6=off;
location / {
set $backend "http://api.example.com:8080";
proxy_pass $backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
- 使用变量后,nginx会在每次请求时检查DNS缓存,过期后重新查询。
valid=10s控制缓存时间,太短会增加DNS压力,太长则更新不及时。- 注意:变量
proxy_pass无法使用upstream的keepalive连接池,高并发场景需评估性能。
nginx Plus与第三方模块
nginx Plus原生支持resolve,且提供健康检查、状态zone等企业级功能,配置与方案一类似,但无需担心版本限制,开源版还可以使用第三方模块

nginx-upstream-dynamic-servers,配置如下:
upstream backend {
dynamic_server api.example.com:8080;
resolver 223.5.5.5 valid=30s;
}
或者使用OpenResty的balancer_by_lua,在Lua脚本中动态选择后端,这类方案灵活但需要重新编译或引入额外组件。
开源版与Plus版动态解析区别:哪种方案更适合你
| 对比项 | 开源版(1.27.3+) | 开源版(旧版本) | nginx Plus |
|---|---|---|---|
| 原生resolve | 支持 | 不支持 | 支持 |
| 配置复杂度 | 低 | 中(变量方案) | 低 |
| 性能影响 | 小 | 每次请求检查缓存 | 小 |
| 健康检查 | 无 | 无 | 有 |
| 成本 | 免费 | 免费 | 商业授权 |
成本与性能权衡
- 开源版新版本已经能满足大部分动态解析需求,免费且配置简单。
- 变量方案兼容所有版本,但高并发下每次请求的DNS缓存检查会带来轻微开销,据统计,在QPS数万的场景下,额外CPU消耗在可接受范围内。
- nginx Plus收费,适合需要高级健康检查、实时监控和官方支持的企业。
- 第三方模块免费,但维护成本高,升级nginx时需重新编译。
容器环境下nginx动态解析后端域名怎么配
在Kubernetes中,Service的ClusterIP可能变化,或者你直接用Pod域名,此时nginx通常以Sidecar或Ingress Controller形式运行,配置要点:
- 获取CoreDNS地址:
kube-dns.kube-system.svc.cluster.local。 - 在nginx配置中设置
resolver指向CoreDNS,valid设为5-10秒。 - 使用变量
proxy_pass,
resolver kube-dns.kube-system.svc.cluster.local valid=5s; set $svc "http://my-service.default.svc.cluster.local:8080"; proxy_pass $svc;

- 如果使用nginx Ingress Controller,它通常已经内置了动态解析能力,只需配置
nginx.ingress.kubernetes.io/service-upstream: "true"等注解。 - 北京地区某电商平台的容器集群曾遇到Service IP变更导致502,改用变量+resolver后问题消失,上海地区某金融企业则通过Consul模板+reload,实现了更精细的流量切换。
动态解析需要额外付费吗?地域与DNS服务选择
动态解析本身不收费,nginx开源版和第三方模块都免费,可能产生费用的是DNS服务:
- 国内使用简米云DNS、酷番云DNS的内网解析,通常不额外计费。
- 海外使用AWS Route 53,按查询次数收费,但内网解析费用极低。
- 公共DNS如114.114.114.114、223.5.5.5免费,但解析延迟和稳定性需测试。
- 如果使用nginx Plus,则需要购买商业授权,价格按实例数计算。
地域方面,国内服务器建议优先使用本地DNS,避免跨地域查询延迟,海外服务器可以用8.8.8.8或1.1.1.1,华北、华东等地域的云内网DNS通常提供高可用,valid可以设短一些。
Q&A:nginx动态域名解析常见问题
nginx动态解析后为什么还是旧IP?
检查三个地方:一是resolver是否配置在正确的层级(http、server或location);二是valid时间是否过长,DNS缓存未过期;三是是否使用了变量proxy_pass,如果直接写域名而没有变量,nginx仍然只在启动时解析,如果用了upstream且没有resolve参数,也不会动态更新。
开源版nginx upstream支持resolve吗?
截至2026年,nginx开源版从1.27.3开始已支持在upstream的server指令中使用resolve参数,但必须配合zone指令,更早的稳定版(如1.24、1.26)不支持,需要升级或使用变量方案,nginx Plus则一直支持。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/923200.html


评论列表(2条)
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于参数的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!
@蓝smart506:这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是参数部分,给了我很多新的思路。感谢分享这么好的内容!