phpEnv 自带 Nginx 不支持 ngx_cache_purge,需下载匹配源码和兼容版模块静态编译;配置时必须严格统一 proxy_cache_key 与 purge 路径格式,否则清理失败。

phpEnv 自带的 Nginx 不含 ngx_cache_purge 模块,必须手动编译集成才能支持按 URL 精确清理缓存——直接删 /var/cache/nginx 会清空全部缓存,影响其他站点或接口,不推荐日常开发使用。
确认 phpEnv 的 Nginx 版本和源码路径
phpEnv 通常把 Nginx 安装在 /phpenv/nginx 或 /usr/local/phpenv/nginx,但不提供源码。你需要:
- 运行
phpenv nginx -v或/phpenv/nginx/sbin/nginx -v查看实际版本(比如nginx version: nginx/1.24.0) - 去 nginx.org/download 下载**完全匹配**的源码包(如
nginx-1.24.0.tar.gz),解压到临时目录(如/tmp/nginx-1.24.0) - 从 GitHub 下载兼容分支的
ngx_cache_purge(release/v2.5+支持 1.24+;别用 master 分支,它已废弃)
重新编译 Nginx 并替换 phpEnv 的二进制
phpEnv 的 Nginx 是静态链接、无动态模块支持的,--add-dynamic-module 无效,必须静态编译:
- 进入 Nginx 源码目录:
cd /tmp/nginx-1.24.0 - 执行 configure(关键:复用原 phpEnv 的编译参数,避免缺失模块):
./configure --prefix=/phpenv/nginx --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --add-module=/tmp/ngx_cache_purge-release-v2.5 - 运行
make && sudo make install——这会覆盖/phpenv/nginx/sbin/nginx - 验证是否成功:
/phpenv/nginx/sbin/nginx -V 2>&1 | grep cache_purge应输出cache_purge
配置 purge location 并对齐 proxy_cache_key
缓存 key 不一致会导致 purge 失效(返回 404 却实际没清掉),必须严格匹配:
立即学习“PHP免费学习笔记(深入)”;
- 在
http块中定义缓存区(示例):proxy_cache_path /phpenv/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=500m inactive=30m use_temp_path=off; - 在
server块中启用缓存,并显式写死proxy_cache_key(不要依赖默认值):proxy_cache_key $scheme$host$request_uri; - 新增独立
location块(不放在location /内):location ~ ^/purge(/.*)$ { allow 127.0.0.1; deny all; proxy_cache_purge my_cache $scheme$host$1; }
注意:$1 是正则捕获的路径部分,确保它和 proxy_cache_key 中的 $request_uri 范围一致(比如你缓存的是 /api/user/123,那么 curl -X PURGE http://localhost/purge/api/user/123 才能命中)。
开发时快速清理缓存的实操方式
不需要每次改 PHP 就重启 Nginx,用 PURGE 请求即可:
- 清首页:
curl -X PURGE http://localhost/purge/ - 清某个接口:
curl -X PURGE http://localhost/purge/api/v1/posts - 清带查询参数的 URL(需在
proxy_cache_key中包含$args):
若配置为proxy_cache_key $scheme$host$request_uri;,则curl -X PURGE "http://localhost/purge/api/v1/search?q=test"有效 - 返回
200表示 key 已从缓存中移除(不管原来是否存在);404表示未找到对应缓存项——这时要检查proxy_cache_key和 purge 的字符串是否真的一致
最易被忽略的是 proxy_cache_key 和 purge 构造字符串的隐式差异:比如默认 key 含 $is_args$args,但 purge location 里没带 $args,就会永远清不掉带参数的缓存。务必用 curl -I 请求一次目标 URL,再比对响应头里的 X-Cache 和你 purge 时拼的字符串。



















