在 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 缓存时间及触发动态解析。
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 字样。
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 压力。