Nginx 的 http 块中配置 resolver 是为支持 upstream 动态域名解析,需配合 valid 缓存时间及 proxy_pass 直接使用域名或 upstream 中 resolve 指令(1.19.0+),且 resolver 必须为 DNS IP 地址、置于 http 或 server 块顶层。

Nginx 的 http 块中配置 resolver,主要是为支持 upstream 中使用动态域名(如服务发现场景、容器环境中的 DNS 名称)时,能定期刷新 DNS 解析结果。但要注意:Nginx 默认对 upstream 域名只做一次解析(启动时),除非显式启用动态解析机制。
resolver 必须在 http 块中声明
resolver 指令不能写在 upstream 或 location 块内,必须放在 http 或 server 块顶层(推荐放 http 块,全局生效)。例如:
http {
resolver 10.0.0.2 valid=30s;
# 其他配置...
}
这里 10.0.0.2 是 DNS 服务器地址;valid=30s 表示缓存解析结果 30 秒,超时后重新查询 —— 这是实现“动态解析”的关键参数。
upstream 中需配合 use_domain + resolve 指令(Nginx 1.19.0+)
仅配 resolver 不够。要让 upstream 域名真正动态解析,还需满足以下任一条件:
- 使用
proxy_pass http://domain.example.com(直接在 proxy_pass 中写域名),且该域名未被定义为 upstream;此时 Nginx 会自动用 resolver 解析,并遵守 valid 缓存策略。 - 若必须用 upstream 块,则从 Nginx 1.19.0 起支持
resolve参数:
upstream backend {
resolve domain.example.com valid=30s;
server domain.example.com:8080;
}
注意:server 行仍需写域名(不能写 IP),且 resolver 必须已在外层声明。
验证是否生效的常见方式
动态解析是否起作用,可通过以下方式确认:
- 修改 DNS 记录(如将域名指向新 IP),等待超过
valid时间后,检查 Nginx error log 是否出现resolving ...或resolved ... to日志; - 用
nginx -t不会触发解析,只有 reload 或首次启动时才初始化; - 若日志中频繁出现
no resolver defined,说明 resolver 缺失或位置错误; - DNS 服务器不可达时,Nginx 会沿用旧缓存直至超时,不会立即中断请求。
注意事项与常见陷阱
实际部署中容易忽略的细节:
-
resolver不支持 hostname(如resolver dns.local),必须是 IP 地址(可多个,空格分隔); - 容器环境(如 Kubernetes)中,推荐用宿主机 DNS 或 CoreDNS 的 ClusterIP(如
10.96.0.10),避免使用127.0.0.11(Docker 内置 DNS,在某些网络模式下不可达); - 不建议设置过短的
valid(如 1s),可能引发 DNS 查询风暴;30s–5m 是较稳妥范围; - HTTP/2 或 keepalive 连接可能复用旧连接,即使 DNS 已更新,已建立的长连接仍发往旧 IP —— 此属协议层行为,需结合
proxy_next_upstream或主动断连策略应对。










