nginx不主动按http过期时间清理缓存,而是依赖inactive参数自动删除2小时内未被访问的冷缓存;必要时可辅以cron清空整个缓存目录或用ngx_cache_purge模块精准清除指定资源。

Nginx 本身不提供定期检查并删除“过期”静态缓存文件的脚本功能,它的缓存清理是被动自治的——靠 inactive 参数自动回收冷数据,而不是按 HTTP 过期时间(如 Cache-Control 或 Expires 头)主动扫描删除。
所谓“定期清理过期缓存”,在生产中实际指:确保 Nginx 自身的 inactive 机制高效运行 + 必要时辅以安全、可控的外部清理手段。下面分三类实用方式说明:
✅ 核心方式:用 inactive 让 Nginx 自动清理冷缓存
这是最轻量、最可靠、零运维成本的方式:
-
inactive定义的是“最后一次被访问后,多久没再命中就可物理删除” - 它与
proxy_cache_valid(逻辑过期)无关,只看访问热度
示例配置(放在 http 或 server 块中):
proxy_cache_path /var/cache/nginx/static_cache levels=1:2 keys_zone=static_cache:20m max_size=500m inactive=2h # ⚠️ 关键:2小时内未被任何请求访问,即被自动删 use_temp_path=off;
? 比如一个
/css/app.css缓存项,即使proxy_cache_valid 200 7d,只要 2 小时内没人请求它,Nginx 的 cache manager 进程就会异步把它从磁盘删掉,并同步更新内存索引。
⚠️ 补充方式:用 cron 定期清空整个缓存目录(仅限可接受全量清除的场景)
适用于测试环境、内容高频更新的后台接口,或发布后需强一致性的情况:
创建清理脚本 /usr/local/bin/clean-nginx-cache.sh:
#!/bin/bash CACHE_DIR="/var/cache/nginx/static_cache" if [ -d "$CACHE_DIR" ]; then find "$CACHE_DIR" -mindepth 1 -delete 2>/dev/null echo "[$(date)] static_cache cleaned" >> /var/log/nginx/cache-clean.log fi
添加到系统定时任务(每天凌晨 2 点执行):
0 2 * * * /usr/local/bin/clean-nginx-cache.sh
❗ 注意:不要用
rm -rf $CACHE_DIR/*,而要用find ... -delete,避免误删keys_zone元数据目录;也不建议在服务运行中直接rm -rf整个缓存路径,否则可能破坏 Nginx 内部索引。
? 进阶方式:用 ngx_cache_purge 模块精准清除指定资源
适合需要“秒级下线某 CSS/JS/图片”的场景(如紧急修复、灰度发布):
-
确认已安装模块:
nginx -V 2>&1 | grep -o with-http-cache-purge-module
-
配置 purge 接口(注意 key 必须与原始缓存 key 完全一致):
location ~ ^/purge(/.*)$ { allow 127.0.0.1; deny all; proxy_cache_purge static_cache $scheme$host$1$is_args$args; } -
清除命令(立即生效,只删元数据,磁盘文件后续由
inactive回收):curl -X PURGE https://yourdomain.com/purge/css/app.css
? 提示:
proxy_cache_key应精简(推荐$scheme$host$request_uri),避免含$cookie_、$arg_等易变字段,否则 purge key 对不上,看似成功实则无效。
不复杂但容易忽略。











