如何在 Nginx 配置中指定上游域名解析缓存时间?

文章导读
在 Nginx 中指定上游域名解析缓存时间,核心是在 http 块中配置 resolver 指令并添加 valid 参数,同时确保 proxy_pass 使用变量触发运行时解析。若配置不当,Nginx 可能仅在启动时解析一次域名,导致后端 IP 变更后无法生效。
📋 目录
  1. 核心配置原理
  2. 完整配置示例
  3. 日志级别调整指南
  4. 验证步骤
  5. 常见风险与注意事项
A A

在 Nginx 中指定上游域名解析缓存时间,核心是在 http 块中配置 resolver 指令并添加 valid 参数,同时确保 proxy_pass 使用变量触发运行时解析。若配置不当,Nginx 可能仅在启动时解析一次域名,导致后端 IP 变更后无法生效。

先说结论:通过 resolver 指令的 valid 参数控制缓存时长,但必须配合动态解析机制才能生效。

  • 适合:后端 IP 会变动、使用域名而非固定 IP 的上游场景。
  • 关键点:开源版 Nginx 建议使用 proxy_pass 变量方式,而非 upstream resolve 参数。
  • 验收:需将 error_log 级别调整为 info,修改 DNS 记录后观察日志是否有重新解析记录。

核心配置原理

Nginx 启动时会解析配置中的域名并缓存,后续请求直接使用 IP。若不配置 resolver 及 valid 参数,运行时不会重新查询 DNS。resolver 指令引入了异步 DNS 解析机制,valid 参数定义了缓存有效期,超时后才会发起新查询。

注意:要使解析在运行时生效,proxy_pass 的目标地址必须包含变量(如 $host 或自定义变量),否则 Nginx 会在启动阶段完成解析并缓存 IP,忽略 resolver 设置。

完整配置示例

以下是一个包含 http、server、location 块的完整配置片段,展示了如何设置 DNS 缓存时间及触发动态解析。

如何在 Nginx 配置中指定上游域名解析缓存时间?
http {
    # 配置 DNS 服务器,建议使用内网 DNS,避免公共 DNS 在网络策略限制下不可达
    # valid=30s 表示缓存有效期为 30 秒,过期后重新查询
    resolver 10.0.0.1 10.0.0.2 valid=30s ipv6=off;
    
    # 重要:调整日志级别以便观察解析过程,默认为 error 级别无法看到解析日志
    error_log /var/log/nginx/error.log info;

    server {
        listen 80;
        server_name example.com;

        location / {
            # 方式:使用变量触发运行时解析
            # 将域名赋值给变量,proxy_pass 使用变量即可触发 resolver 机制
            set $upstream_backend "backend.example.com";
            
            # 注意:proxy_pass 后不能带路径,否则变量解析可能异常
            proxy_pass http://$upstream_backend;
            
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

日志级别调整指南

默认情况下,Nginx 的 error_log 级别为 error,不会记录 DNS 解析过程。为了验证 resolver 是否生效,必须将日志级别调整为 info 或 notice。

在 nginx.conf 的 http 块或 server 块中添加:

error_log /var/log/nginx/error.log info;

修改后重载配置:nginx -s reload。验证完成后建议改回 warn 或 error 以减少日志量。

验证步骤

1. 查看解析日志:实时监听 error.log,观察是否有 resolving 字样。

如何在 Nginx 配置中指定上游域名解析缓存时间?
tail -f /var/log/nginx/error.log

若看到 resolver: ... resolving backend.example.com 说明正在发起 DNS 查询。

2. 修改 DNS 记录:等待 valid 设置的时间(如 30s)过期后,修改后端域名的 DNS 解析记录。

3. 确认新 IP 生效:再次发起请求,观察日志中 resolved 后的 IP 地址是否变更为新的 IP。

4. 辅助工具验证:使用 dig 命令确认本地 DNS 服务器已生效。

dig @10.0.0.1 backend.example.com

常见风险与注意事项

  • DNS 服务器选择:生产环境尽量避免直接使用 8.8.8.8 等公共 DNS,可能存在网络策略限制或延迟问题。建议配置内网 DNS 服务器地址,并确保 Nginx 服务器网络可达。
  • 开源版功能差异:upstream 块中 server 指令的 resolve 参数通常在 Nginx Plus 或特定编译版本中支持,开源版建议使用 proxy_pass 变量方式,兼容性更好。
  • 变量使用规范:proxy_pass 使用变量时,URL 中不能包含 URI 路径(如 http://$var/path),否则可能导致解析错误。路径应写在 location 中或通过 rewrite 处理。
  • 缓存时间权衡:valid 时间过短会增加 DNS 查询压力,过长会导致 IP 变更生效延迟。一般建议设置为 30s 至 5 分钟,根据业务变更频率调整。
  • 日志性能:info 级别日志量较大,验证完毕后请及时调回 error 或 warn 级别,避免磁盘 IO 压力。