正向代理中动态解析域名需将resolver置于server块内、设valid参数、配合变量proxy_pass;resolver不可放http顶层,proxy_pass必须含协议前缀且引用$http_host等变量,valid建议5–30秒并配resolver_timeout 3s。

正向代理中配置 resolver 实现域名动态解析,关键在于让 Nginx 在每次请求时都能重新查 DNS,而不是只在启动时解析一次。这要求 resolver 位置正确、参数完整,并配合变量化 proxy_pass 使用。
resolver 必须放在 server 块内,且紧邻 proxy_pass
正向代理不支持 upstream + resolve 模式(那是反向代理的用法),所以不能把 resolver 放在 http 块顶层指望它全局生效。它必须显式写在处理请求的 server 或 location 块里:
- ✅ 正确示例:
server {
listen 80;
resolver 114.114.114.114 8.8.8.8 valid=10s;
location / {
proxy_pass http://$http_host$request_uri;
}
} - ❌ 错误写法:把
resolver单独写在http块,location里没声明 —— 此时 Nginx 不会做运行时 DNS 查询,遇到域名直接报错或 fallback 失败
proxy_pass 必须使用变量,不能硬编码域名
正向代理的目标地址来自客户端请求头(如 $http_host),只有通过变量引用,Nginx 才会触发 resolver 解析逻辑:
-
必须包含协议前缀:写成
http://$http_host$request_uri,不能只写$http_host$request_uri,否则不识别为可解析 URL -
避免用
$host:它可能不含端口,导致 HTTPS 等带端口的请求转发失败;优先用$http_host,它保留原始 Host 头(含端口) - 如果需区分 HTTP/HTTPS,可用
$scheme://$http_host$request_uri,但要确保客户端发起的是标准 HTTP CONNECT 请求或已适配代理协议
valid 参数不可省略,建议设为 5–30 秒
没有 valid,Nginx 默认不缓存 DNS 结果,但实际行为是“每次请求都同步阻塞查询”,极易拖慢响应甚至触发 DNS 限流。加上 valid 后,它才真正启用本地缓存:
-
valid=10s:适合测试环境或 IP 频繁漂移的容器服务 -
valid=30s:生产推荐值,兼顾时效性与稳定性 - 不要设成
valid=5m或更长:正向代理常用于访问外部多变域名,过长缓存会导致故障恢复延迟
额外建议:加 resolver_timeout 并选可靠 DNS
默认 DNS 超时是 30 秒,太长会卡住整个请求。建议显式缩短:
- 添加
resolver_timeout 3s;到同一server块中,避免单次 DNS 故障拖累整体 - 优先选用内网 DNS(如 CoreDNS、dnsmasq)或国内公共 DNS(114.114.114.114、223.5.5.5),减少外网依赖和延迟
- 多个 DNS 地址空格分隔即可,Nginx 按顺序尝试,仅在网络连通失败时切换,不因 NXDOMAIN 等解析失败而跳转











