proxy_cache_purge仅精确匹配key删除缓存,不判断是否过期;真正清理过期缓存需依赖inactive机制、proxy_cache_use_stale及谨慎的系统级find清理。

proxy_cache_purge 不能清理“过期”的缓存文件,它只做精确键匹配的主动删除——无论该缓存是否过期、是否还在有效期内、甚至是否根本不存在,只要 key 对得上,就删;对不上,就静默失败。
换句话说:
✅ 它清理的是“你指定的 URL 对应的缓存条目”;
❌ 它不扫描、不判断、不自动识别哪些文件已过期;
❌ 它和 proxy_cache_valid、Expires、Cache-Control 等过期逻辑完全无关。
为什么 purge 不等于“清过期”?
Nginx 的缓存过期是逻辑过期(logical expiration):
- 响应头带
Cache-Control: max-age=300,或配置了proxy_cache_valid 200 5m; - 5 分钟后,下次请求来时,Nginx 会认为这个缓存“该重新校验了”,但文件仍留在磁盘上;
- 它不会自动删,除非触发
inactive机制(比如 1 小时没被访问),或你手动purge。
所以,“过期缓存文件”在 Nginx 里其实长期“尸位素餐”,purge 只是你喊它“点名清除”,不是系统自动“扫墓”。
想真正清理过期缓存?得靠组合策略
✅ 设置 inactive 时间(最可靠、原生支持)
在 proxy_cache_path 中指定:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:10m inactive=30m max_size=2g;
- 表示:30 分钟内没被任何请求命中的缓存文件,会被 worker 进程自动 unlink 删除(物理清理);
- 这是唯一由 Nginx 自动执行的磁盘清理机制,无需模块、无需脚本、无需重启。
⚠️ 注意:
inactive判定依据是最后访问时间(atime),不是创建时间或过期时间。哪怕缓存已逻辑过期 2 小时,只要刚被 hit 过,就不会被删。
FastAPI Flask Proxy下载FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
✅ 配合 proxy_cache_use_stale updating 减少回源冲击
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
- 当缓存过期且正在后台更新时,仍可返回旧内容,避免大量请求同时击穿回源。
✅ 用 proxy_cache_purge 主动清理特定资源(精准可控)
例如清掉某个文章页及其带参变体:
location ~ ^/purge(/.*)$ {
allow 127.0.0.1;
allow 192.168.10.0/24;
deny all;
proxy_cache_purge mycache "$scheme$request_method$host$1$is_args$args";
}
调用方式:
curl -X PURGE https://example.com/purge/article/123 curl -X PURGE "https://example.com/purge/article/123?utm_source=mail"
- 关键:
$scheme$request_method$host$1$is_args$args必须和你proxy_cache_key完全一致,否则 purge 失效。
✅ 补充:系统级定时清理(慎用)
若 inactive 不够用(比如缓存命中极低,但又不想等太久),可用 find 清理陈旧文件:
# 先测试(不删) find /var/cache/nginx -type f -mmin +60 -print | head -20 # 确认无误后执行(建议加到 cron,且避开业务高峰) find /var/cache/nginx -type f -mmin +60 -delete
⚠️ 风险提示:
-
mtime是修改时间,不一定反映缓存生命周期; - 强制删可能删掉刚写入还没被 worker 收录的临时文件;
- 更安全的做法是让
inactive承担主力,find仅作兜底。
常见误区提醒
- ❌ 不存在
purger on或proxy_cache_path ... purger=on这类指令 —— Nginx 官方无此参数,配置会报错; - ❌
max_size触发的是 LRU 回收(按访问时间淘汰),不是按“是否过期”清理; - ❌
PURGE返回 200 ≠ 缓存已被删,可能是 key 不匹配、缓存不存在、或权限拒绝,务必验证响应头X-Cache-Status或查缓存目录; - ❌ 直接
rm -rf /var/cache/nginx/*风险极高,可能导致 worker 访问已删文件,出现502或日志警告。
不复杂但容易忽略。











