必须先确认 proxy_cache_path 实际路径再清理,否则 rm -rf 会误删所有缓存;正确做法是用 nginx -T 查路径、按 levels 和 proxy_cache_key 的 MD5 哈希反推文件位置精准删除,或优先使用 ngx_cache_purge 模块。

proxy_cache_path 路径必须先确认清楚再写脚本
直接 rm -rf /var/cache/nginx/* 是最常见也最危险的操作——它会清掉所有 proxy_cache_path 和 fastcgi_cache_path 共用的父目录下全部缓存,不管是不是你当前要清理的那个 zone。更糟的是,如果多个站点共用同一级缓存根目录(比如都设为 /var/cache/nginx),一个脚本误跑就全崩。
正确做法是先查真实路径:sudo nginx -T 2>&1 | grep proxy_cache_path
输出类似:proxy_cache_path /data/nginx/proxy_cache levels=1:2 keys_zone=my_cache:50m max_size=20g inactive=1h;
这个 /data/nginx/proxy_cache 才是你脚本里该操作的根路径。
- 注意
levels=1:2表示文件实际散落在三级子目录中(如ab/cdefgh),脚本不能只删顶层目录 - 如果配置里用了变量(如
$hostname或$scheme),路径是动态生成的,得结合proxy_cache_key手动算哈希,或改用ngx_cache_purge避开文件系统操作 - 确保脚本运行用户(通常是
www-data或nginx)对缓存目录有读写权限,否则rm会静默失败
手动清理脚本必须按 key 哈希反推路径
Nginx 缓存文件名是 proxy_cache_key 的 MD5 哈希值,后缀带 .tmp 或无后缀;目录结构由 levels 决定。比如 levels=1:2 时,哈希 ab12cd34ef567890... 对应路径是 /data/nginx/proxy_cache/a/b1/ab12cd34ef567890...。
所以一个靠谱的清除脚本不是遍历删,而是根据 URL 反算 key、再转哈希、再拼路径:
- 用 Python 或 Bash 调用
md5sum计算$scheme$request_method$host$request_uri(必须和配置中proxy_cache_key完全一致) - 取哈希前 1+2 位做两级子目录:如
ab12cd...→a/b1 - 构造完整路径:
/data/nginx/proxy_cache/a/b1/ab12cd34ef567890...,再rm -f - 别忘了同时删对应的
.temp文件和.stale标记文件,否则可能残留脏数据
proxy_cache_purge 比脚本更安全、更推荐用于线上
手写脚本容易错位、漏删、权限失控,而 ngx_cache_purge 模块通过 HTTP PURGE 请求直接操作共享内存索引,秒级生效且不碰磁盘文件——这才是生产环境该用的方式。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
但前提是 Nginx 已编译该模块:nginx -V 2>&1 | grep -o ngx_cache_purge —— 无输出就得重编译,加上 --add-module=./ngx_cache_purge。
-
proxy_cache_purge的参数必须和proxy_cache_key严格一致,比如后者是"$scheme$request_method$host$request_uri",purge location 就不能漏掉$is_args$args - 权限控制必须收紧:
allow 10.10.5.0/24;+deny all;,禁止暴露在公网 - 测试命令:
curl -X PURGE http://example.com/api/data?version=2,返回200仅代表元数据删除成功,不代表磁盘文件已删(那是inactive后台进程的事)
FastCGI 缓存不能和 proxy_cache 混用同一个脚本
proxy_cache 和 fastcgi_cache 是两套完全独立的机制:缓存路径不同、key 生成逻辑不同、清理方式也不兼容。你写的 proxy_cache 清理脚本对 fastcgi_cache 无效,反之亦然。
查 fastcgi_cache_path 要单独执行:sudo nginx -T 2>&1 | grep fastcgi_cache_path
- 它的 key 默认是
$scheme$request_method$server_name$request_uri,和 proxy_cache 不同,哈希计算必须换公式 - 没有官方
fastcgi_cache_purge模块,只能手动删文件或停服务后清空目录 - 如果两个 cache 共享同一物理路径(比如都设为
/var/cache/nginx),脚本一跑,两者全灭——这是线上事故高发点

















