不停服清空数十GB Nginx反向代理缓存的关键是分批异步删除、利用inactive自动淘汰机制及ngx_cache_purge定向清除,避免I/O飙升和502错误;需先确认缓存路径与使用状态,再执行安全清理。

不停服清空数十GB Nginx 反向代理缓存,关键在于避开全量删除锁、避免 I/O 飙升拖垮服务,同时确保清理动作可验证、可中断、不误删。直接 rm -rf 整个目录虽快,但容易引发磁盘 IO 峰值、Nginx 工作进程卡顿甚至 502 错误——这不是“不停服”,只是没关进程而已。
确认缓存路径与使用状态
先查清楚缓存到底在哪、是否正在被写入,避免清理时干扰活跃请求:
- 运行
grep -r "proxy_cache_path" /www/server/nginx/conf/(宝塔默认路径)或nginx -T 2>/dev/null | grep proxy_cache_path,找到真实路径,例如/www/server/nginx/proxy_cache - 用
lsof +D /www/server/nginx/proxy_cache检查是否有 Nginx 进程正打开缓存文件;若输出为空,说明当前无写入中文件,可安全清理 - 执行
du -sh /www/server/nginx/proxy_cache确认实际占用,排除 symbolic link 或挂载点干扰
分批异步删除(推荐用于大容量缓存)
一次性删几十GB会打满磁盘IO,导致响应延迟上升。改用 find 分片+休眠方式,把压力摊平:
- 在宝塔终端或 SSH 中运行以下命令(替换为你的真实缓存路径):
find /www/server/nginx/proxy_cache -type f -print0 | head -z -n 10000 | xargs -0 rm -f && sleep 0.1 - 把它包装成循环脚本,例如每批删1万个文件、停100毫秒:
while [ $(find /www/server/nginx/proxy_cache -type f | wc -l) -gt 0 ]; do find /www/server/nginx/proxy_cache -type f -print0 | head -z -n 10000 | xargs -0 rm -f; sleep 0.1; done - 执行前建议先测试:把
rm -f换成echo,看列出的是否全是缓存文件,防止路径误配
利用 Nginx 自带的 inactive 自动淘汰机制
如果缓存配置中已设 inactive=XXm(如 inactive=30m),Nginx 本身就会定期扫描并移除长时间未被访问的缓存项。这无需人工干预,且完全不影响服务:
- 检查你的
proxy_cache_path行是否含inactive参数,例如:proxy_cache_path /www/server/nginx/proxy_cache levels=1:2 keys_zone=mycache:10m max_size=50g inactive=45m use_temp_path=off; - 只要该参数存在,Nginx worker 进程会在空闲时自动清理过期条目,相当于后台“静默释放”
- 若未设置,可临时添加并重载配置:
nginx -s reload,无需重启,立即生效
配合 purge 模块做定向清除(适合需保留部分缓存场景)
如果你只希望清掉某几个接口或页面的缓存(比如刚上线的 API 版本),而不是全盘清空,ngx_cache_purge 是更精准、更轻量的选择:
- 确认模块已加载:
nginx -V 2>&1 | grep -o ngx_cache_purge,有输出即支持 - 在站点配置的
server块里加一段 purge location(注意限制访问来源):location ~ /purge(/.*) { allow 127.0.0.1; deny all; proxy_cache_purge mycache $scheme$host$1$is_args$args; } - 重载 Nginx 后,用 curl 触发清除:
curl -XPURGE http://yoursite.com/purge/api/v2/users,只删匹配路径,其余缓存毫发无损


















