nginx正向代理默认仅启动时解析域名,ip变更后会连接失败;需配合resolver指令(如resolver 8.8.8.8 valid=30s)与变量化proxy_pass(如http://$host$request_uri)实现动态dns刷新,https则须启用proxy_connect模块支持。

Nginx 正向代理本身不内置 DNS 缓存刷新机制,当目标网站 IP 变更时,若配置中硬编码了 IP 或依赖静态解析,就会出现“代理仍连旧 IP、连接失败或超时”的问题。核心在于:Nginx 默认对 proxy_pass 中的域名只做一次解析(启动时),后续不自动更新。
要解决目标站 IP 动态变更导致的代理失效,关键不是“清缓存”,而是让 Nginx 每次请求都重新解析域名,或至少定期刷新 DNS 缓存。
✅ 使用 resolver 指令配合变量化 proxy_pass
这是最常用且有效的方案。需满足两个条件:
- 在
location块中使用变量(如$host)构造proxy_pass; - 配置
resolver并设置合理的valid时间。
server {
listen 3128;
resolver 8.8.8.8 valid=30s; # 每30秒刷新一次DNS缓存
location / {
# 关键:用 $host + $request_uri 动态拼接目标地址
proxy_pass http://$host$request_uri;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
⚠️ 注意事项:
-
resolver必须写在server或location块内(不能只放在http块顶层); -
valid=30s表示 DNS 解析结果最多缓存 30 秒,到期后下次请求会重新查 DNS; - 若目标站用 HTTPS,需额外支持
CONNECT方法(见下文补充); -
$host来自客户端Host请求头,确保客户端发送的 Host 头准确(浏览器/工具默认携带)。
✅ 对 HTTPS 网站:启用 proxy_connect 模块(需编译支持)
标准 Nginx 不支持正向代理 HTTPS 流量(即 CONNECT 隧道)。若要代理 HTTPS 站点(如 https://example.com),必须:
- 确保 Nginx 编译时启用了
--with-http_proxy_connect_module(官方未默认包含,常见于 OpenResty 或定制版); - 单独配置
CONNECT处理逻辑:
server {
listen 3128;
resolver 8.8.8.8 valid=30s;
# 处理 CONNECT 请求(HTTPS 隧道)
proxy_connect;
proxy_connect_allow all;
proxy_connect_timeout 10s;
proxy_connect_read_timeout 10s;
proxy_connect_send_timeout 10s;
# 处理普通 HTTP 请求(仍走动态解析)
location / {
proxy_pass http://$host$request_uri;
proxy_set_header Host $host;
}
}
? 提示:很多企业环境只允许 HTTP 正向代理,HTTPS 则受限于中间人风险或策略,默认被拦截。确认业务是否真需代理 HTTPS,否则优先走 HTTP+
resolver方案更轻量稳定。
❌ 不推荐的做法(常见误区)
-
把 IP 写死在
proxy_pass http://1.2.3.4:80→ 完全无法应对 IP 变更; -
仅靠
proxy_cache_valid清理响应缓存 → 这里问题不在响应缓存,而在 upstream 地址解析固化; -
用
set $upstream "xxx.com"+proxy_pass http://$upstream但没配resolver→ 变量写法无效,Nginx 启动时仍只解析一次。
? 验证是否生效
- 修改目标域名的 DNS 解析(例如本地 hosts 或换一个测试域名,人为切换 IP);
- 发起请求,观察 Nginx error 日志是否有
no resolver defined或host not found; - 查看
resolver是否命中:开启error_log /path/to/log info;,可看到类似DNS resolved xxx.com to 203.208.x.x的日志,且每隔valid秒重复出现,说明刷新正常。
不复杂但容易忽略











