在使用nginx作反向代理时遇到一个问题,目标域名的IP已经变了,但是请求的还是老的IP,导致不能正常代理,需要重启下nginx或者重启下代理才可以,反向代理的缓存是关着的。
这个问题可能由以下原因导致:
问题原因
-
Nginx DNS缓存
Nginx默认在启动时解析proxy_pass中的域名,并缓存IP直至重启,即使系统DNS更新,Nginx仍使用旧IP。 -
缺失resolver配置
未显式配置resolver指令时,Nginx依赖系统DNS且不主动刷新解析结果。 -
系统DNS缓存
操作系统或网络层可能缓存旧DNS记录,影响Nginx获取新IP。
解决方案
- 配置Nginx动态DNS解析
在Nginx配置中添加resolver指令并结合变量使用proxy_pass,强制Nginx按指定间隔刷新DNS。
操作步骤:
打开宝塔面板中的Nginx反向代理配置文件(通常位于/www/server/panel/vhost/nginx/proxy/*.conf
)。
在server块内添加resolver和变量,示例:
server {
resolver 8.8.8.8 1.1.1.1 valid=30s; # 使用Google和Cloudflare的DNS,30秒刷新
set $target_host example.com; # 定义变量存储目标域名
location / {
proxy_pass http://$target_host; # 使用变量传递域名
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 其他代理配置...
}
}
valid=30s
表示每30秒重新验证DNS记录。
必须将域名赋值给变量(如$target_host),否则resolver不生效。
- 清除系统DNS缓存
执行命令刷新系统DNS缓存(根据系统类型选择):
Ubuntu/Debian:
sudo systemctl restart systemd-resolved
sudo systemd-resolve --flush-caches
CentOS/RHEL:
sudo systemctl restart nscd
通用方法:
修改/etc/resolv.conf
临时更换DNS服务器(如nameserver 8.8.8.8)。
- 重载Nginx配置
无需重启服务,通过以下命令应用配置:
sudo nginx -s reload
- 验证配置
执行nginx -T
检查配置是否正确。
使用curl -v
目标域名或dig 目标域名
确认解析结果已更新。
监控Nginx日志,观察是否正常转发:
tail -f /www/wwwlogs/nginx_error.log
附加建议
避免硬编码IP:确保proxy_pass始终使用域名而非IP。
防火墙检查:确认新IP未被防火墙拦截(如宝塔面板安全组、iptables)。
TTL设置:若目标域名DNS记录的TTL过长,联系DNS提供商调整为较短值(如300秒)。
通过以上步骤,Nginx将定期刷新DNS解析,确保IP变更后自动生效,无需手动重启服务。