需构建“可识别、可限制、可审计”的缓存键与清除机制:确认proxy_cache_purge模块已编译启用;cache_key须包含$upstream_addr等后端标识;purge路径需携带backend参数并严格限制IP、token及速率;独立location配置,确保key与purge逻辑一致。

要让 Nginx 的 proxy_cache_purge 模块在生产环境安全、可控地清理特定负载均衡后端的缓存,核心不是简单开启模块,而是构建“可识别、可限制、可审计”的缓存键与清除机制。默认配置下 purge 是全局且无鉴权的,直接暴露会引发缓存雪崩或误删。
确认模块已编译并启用
Nginx 官方主线版本不内置 proxy_cache_purge,需确认你使用的是含该模块的发行版(如 nginx-plus)或自行编译时添加了 --add-module=../ngx_cache_purge。运行以下命令验证:
-
nginx -V 2>&1 | grep -o 'cache_purge'—— 应输出cache_purge -
nginx -t确保配置语法通过,避免因模块未加载导致启动失败
设计带后端标识的 cache\_key 与 purge 路径映射
负载均衡场景下,同一 URL 可能被不同 upstream 分发到不同后端,缓存内容实际不一致。必须让缓存键(cache_key)和 purge 请求路径都能体现后端上下文,否则 purge 会误删其他节点的缓存。
推荐做法:在 proxy_cache_key 中显式加入 $upstream_addr 或自定义 upstream 名称变量;同时约定 purge 接口路径携带后端标识参数,例如:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 缓存键配置:
proxy_cache_key "$scheme$request_method$host$uri$is_args$args|$upstream_addr"; - purge 请求示例:
curl -X PURGE "https://example.com/purge?uri=/api/user/123&backend=web-a" - 配合 map 指令将 backend 参数映射为 upstream 地址或标识,用于校验与构造 key
严格限制 purge 权限与来源
生产中绝不允许公网任意 IP 发起 PURGE 请求。必须叠加多层防护:
- 仅允许内网运维网段或跳板机 IP 访问 purge location,例如:
allow 10.10.5.0/24;<br>deny all;
- 强制 require 请求头(如
X-Purge-Token),并在 Nginx 中用map校验 token 值(建议 token 存于加密文件或通过 Lua 动态校验) - 对 purge 请求做速率限制,防暴力探测:
limit_req zone=purge_limit burst=2 nodelay;
使用独立 location + 安全 purge 配置
不要把 purge 指令放在主 server 块或通用 location 中。应单独定义一个受控入口,例如:
location ~ ^/purge(/.*)?$ {<br> allow 127.0.0.1;<br> allow 10.10.5.10;<br> deny all;<br> proxy_cache_purge my_cache "$scheme$request_method$host$1|$upstream_addr";<br>}- 注意:这里
$1是正则捕获的 URI 路径部分,确保与 cache_key 构造逻辑一致;|$upstream_addr保证 purge 时能精准匹配对应后端的缓存项 - 若需按 upstream 名称 purge(而非地址),可用
upstream_conf模块配合自定义变量,或借助 OpenResty 的 Lua 实现更灵活的 key 构造与匹配
不复杂但容易忽略:每次修改 cache_key 或 purge 规则后,旧缓存不会自动失效,需人工触发一次全量 purge 或等待 TTL 过期。上线前务必在预发环境完整走通 “写缓存 → 查缓存 → 发起带标识 purge → 验证命中率下降” 全链路。

















