Nginx proxy_cache不支持原生目录级清除,但可通过OpenResty的Lua模块实现模拟:动态生成前缀匹配的cache key批量purge,或设proxy_cache_bypass跳过缓存,再配合shared_dict运行时开关控制。

在 Nginx 中,proxy_cache 本身不支持按目录批量清除(比如清空 /api/v1/ 下所有缓存),但结合 Lua 脚本可实现“模拟目录级 purge”的精准控制——本质是动态生成匹配该目录前缀的所有 cache key,并逐个触发 purge 或跳过 proxy_cache。这不是原生功能,而是通过 OpenResty 的 Lua 模块在请求入口处做前置干预。
确认环境已支持 Lua 和 proxy_cache_purge
必须使用 OpenResty(或手动编译 Nginx + ngx_http_lua_module + ngx_http_proxy_cache_purge_module)。验证方式:
- 执行
nginx -V 2>&1 | grep -E 'lua|cache-purge',应同时出现with-http-lua-module和with-http-cache-purge-module - 若缺失,推荐直接安装 OpenResty(默认集成两者),避免模块冲突
用 Lua 解析请求路径并构造批量 purge 列表
proxy_cache_purge 只接受单个 URI,但可通过 Lua 遍历常见变体(如带/不带尾斜杠、含标准参数等),再用 ngx.location.capture 内部发起多个 PURGE 请求:
⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
- 在
location ~ ^/purge-dir(/.*)$中捕获目标目录,例如/purge-dir/api/v1/ - 用 Lua 提取目录前缀:
local prefix = ngx.var[1] or "/" - 预定义常见参数组合(如分页、排序)或从日志/配置中加载白名单路径模板
- 对每个候选 URI(如
prefix .. "users"、prefix .. "posts?page=1"),调用ngx.location.capture("/internal_purge", { method = ngx.HTTP_PURGE, args = { uri = candidate_uri } })
更稳妥的做法:用 Lua 绕过缓存而非删除
比起反复 purge,更高效的是让匹配目录的请求直接跳过缓存——适合发布后“软生效”场景:
- 在
location /中添加access_by_lua_block - 判断
ngx.var.uri:match("^/api/v1/"),命中则设ngx.var.skip_cache = "1" - 对应配置
proxy_no_cache $skip_cache和proxy_cache_bypass $skip_cache - 这样后续请求不再读/写该目录下任何缓存,等同于“逻辑清除”
配合共享字典实现缓存生命周期管理
若需保留部分缓存但临时禁用某目录,可用 lua_shared_dict 做运行时开关:
- 在 http 块声明:
lua_shared_dict dir_purge_state 1m; - 提供一个管理接口(如
POST /admin/flush-dir)将目录前缀写入字典,设置 TTL(如 300 秒) - 在主 location 中检查:
local state = ngx.shared.dir_purge_state:get(prefix),为 true 时强制 bypass - 无需 reload 配置,秒级生效,且自动过期恢复










