需手动编译集成ngx_cache_purge模块,定义匹配的proxy_cache_path共享内存区,配置带ip白名单的/purge location并确保cache key一致,严格限制访问权限以保障安全。

要使用 ngx_cache_purge 模块在 Nginx 反向代理中提供特定缓存清除接口,核心是:编译时启用该模块、正确定义缓存区、配置可触发 purge 的 location,并严格控制访问权限。
确认 Nginx 已编译支持 ngx_cache_purge
该模块不是 Nginx 官方内置模块,需手动编译集成:
- 下载对应 Nginx 版本源码和 ngx_cache_purge 源码(注意版本兼容性,如 Nginx 1.20+ 推荐用 v2.5+)
- 重新编译 Nginx:
./configure --add-module=/path/to/ngx_cache_purge ... [其他选项],再执行make && make install - 验证是否加载成功:
nginx -V 2>&1 | grep -o 'cache_purge',有输出即表示已支持
定义 shared memory zone 并启用 proxy_cache
purge 功能依赖于 cache zone 的共享内存结构,必须显式声明且与 proxy_cache 配置匹配:
proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
-
keys_zone=my_cache:10m中的my_cache是唯一标识名,后续 purge 和 proxy_cache 都需引用它 -
use_temp_path=off强烈建议关闭,避免 purge 时因临时路径未同步导致失败 - 确保磁盘路径
/var/cache/nginx/proxy_cache存在且 Nginx worker 进程有读写权限
配置可清除缓存的专用 location
通过 location ~ /purge(/.*)? 类路径暴露清除接口,配合 proxy_cache_purge 指令实现按 key 清除:
location ~ /purge(/.*)? {
allow 127.0.0.1; # 仅允许本地或可信 IP
allow 192.168.1.0/24;
deny all;
<pre class="brush:php;toolbar:false;"><code>proxy_cache_purge my_cache "$scheme$request_method$host$1";</code>}
-
$scheme$request_method$host$1构成 cache key,需与后端实际使用的 proxy_cache_key 完全一致(常见如proxy_cache_key $scheme$host$request_uri) - 若后端 key 包含 cookie 或 header(如
$http_cookie),purge 时也需携带对应值,否则无法匹配 - 请求示例:
curl -X PURGE http://example.com/purge/foo/bar将清除http://example.com/foo/bar对应的缓存项
安全与调试注意事项
purge 接口本质是高危操作,务必做好防护和验证:
- 禁止开放给公网;使用 IP 白名单 + HTTP Basic Auth 双重限制更稳妥
- 开启
proxy_cache_lock on可避免并发回源,但 purge 不受 lock 影响,无需额外处理 - 清除后可通过
curl -I http://example.com/target查看响应头中的X-Cache: MISS或HIT判断是否生效 - 日志中若出现
cache file not found while purging,说明 key 不匹配或缓存尚未生成,需检查 key 构造逻辑











