如何让 Nginx 在 proxy_pass 时每次都重新解析 DNS(动态域名)?

Nginx 默认在启动时解析 proxy_pass 的域名并缓存。运行时按有效期重新解析(不会每请求发送 DNS 查询):用 resolver 指令指定 DNS 服务器(valid 控制缓存时长),并把后端域名放进变量再 proxy_pass $变量。本文给出完整配置与坑点。

最佳实践
如何让 Nginx 在 proxy_pass 时每次都重新解析 DNS(动态域名)?封面

核心做法:Nginx 对写死在 proxy_pass 里的域名只在启动/reload 时解析一次并缓存**。要让动态域名按缓存有效期在运行时重新解析:①配 resolver <DNS服务器IP> valid=30s;;②把域名赋值给变量 set $backend "动态域名";,然后 proxy_pass http://$backend;。变量形式可按 resolver 规则运行时解析;支持相应 resolve 参数的 upstream 是另一种方式。**

完整配置

http {
    resolver 223.5.5.5 119.29.29.29 valid=30s;   # DNS 服务器与缓存时长

    server {
        listen 80;

        location / {
            set $backend "dynamic.example.com";
            proxy_pass http://$backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}
  • valid=30s:DNS 结果的缓存时间,按域名实际 TTL 与变更频率权衡(太短增加 DNS 压力,太长变更生效慢)
  • ipv6=off:仅在确实需要禁用 IPv6 查询时使用,域名只有 A 记录本身不要求关闭 AAAA 查询

为什么必须用变量

proxy_pass http://dynamic.example.com;     # ❌ 启动时解析一次,IP 变了 Nginx 不知道
set $b "dynamic.example.com";
proxy_pass http://$b;                       # ✅ 运行时按 resolver 规则解析,缓存有效时不每请求发 DNS 查询

这是 Nginx 的既有行为:字面量 upstream 在配置加载期解析,变量是运行时解析的一种方式;新版本也可用 upstream server 的 resolve。

配套坑点

  1. resolver 必须显式指定:Nginx 不读 /etc/resolv.conf;内网场景指向内网 DNS
  2. 解析失败时的行为:域名暂时解析不出会返回 502,要有心理准备与告警
  3. ** upstream 块场景**:upstream 里的 server 域名同样启动期解析;开源版自 1.27.3 起支持 server 的 resolve 参数,需配置 resolver 和 upstream 共享 zone;旧版另行选择变量或相应商业能力
  4. valid 会覆盖 DNS 响应 TTL,不是两者取小;未设 valid 时按响应 TTL 缓存

适用场景

云厂商 CLB 域名(IP 会变)、容器平台动态服务名、DDNS 动态公网域名等后端 IP 不固定的反代场景。

出现 502 时,先按同一请求时间检查 error.log,区分名称解析失败与连接失败。集中排查多台代理时,可按观测云 DataKit 日志采集说明接入错误日志,保留代理主机和上游名称,避免只凭 502 总量归因。

常见问题(FAQ)

Q:valid 设 5s 会不会把 DNS 打爆?
A:运行时 resolver 会缓存结果,但不能假定普通变量解析缓存跨 worker 共享;DNS 压力还取决于 worker 数、域名数量和有效期,应测量后设置。

Q:能直接用系统的 systemd-resolved 吗?
A:可以指向 127.0.0.53,但要注意容器/不同网络命名空间里该地址不可达。

Q:商业版有更优雅的方案吗?
A:NGINX Plus 以及开源版 1.27.3+ 的 upstream server 支持 resolve 参数(配共享 zone 和 resolver),按 DNS TTL 自动更新 upstream 成员,不用变量 hack。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台