proxy_cache_purge直接删除缓存文件及内存索引,不修改状态;状态变化(如hit→miss)是后续请求因缓存缺失自然产生的结果,其生效前提是purge key与原始cache_key严格一致,并需验证文件级删除与响应头变化。

proxy_cache_purge 不改变缓存状态,它直接删除对应 key 的缓存实体文件和内存索引。所谓“状态变更”(如从 HIT 变为 MISS)是删除后的自然结果,而非 purge 指令本身触发的状态流转。
缓存状态由请求行为决定,不是 purge 修改的
缓存状态(HIT、MISS、EXPIRED、STALE 等)由 Nginx 在处理每个请求时实时判断并写入 X-Upstream-Cache-Status 或自定义响应头(如 X-Cache-Status)。purge 操作本身不返回状态,也不参与请求响应流程——它只是一个服务端内部的清理动作。
- 执行
curl -X PURGE http://example.com/purge/path后,Nginx 查找匹配 key 的缓存项并彻底移除 - 下一次对
/path的普通 GET 请求,因缓存已不存在,必然返回MISS - 若后端响应成功且符合
proxy_cache_valid规则,则新缓存被写入,后续请求才可能命中HIT
精准 purge 依赖缓存 key 完全一致
能否“生效”,关键在于 purge location 中构造的 key 是否与原始缓存 key 严格一致。任何差异(如参数顺序、大小写、编码、尾部斜杠)都会导致找不到目标缓存,看似“没变化”,实则未删成功。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 原始缓存 key 示例:
httpsGETexample.com/article?id=123&lang=zh - 错误 purge 写法:
proxy_cache_purge my_cache "$scheme$request_method$host$uri";(漏掉$args,无法匹配带参 URL) - 正确写法:
proxy_cache_purge my_cache "$scheme$request_method$host$request_uri";($request_uri包含完整路径+参数)
常见误判“状态没变”的原因
用户观察到 purge 后仍返回 HIT 或 EXPIRED,通常不是 purge 失效,而是以下情况:
-
多个缓存区共存:purge 指定了
my_cache,但实际请求使用的是static_cache,key 被存到了别处 -
缓存 key 设计含动态变量:如包含
$cookie_user或$http_x_forwarded_for,不同用户/代理请求生成不同 key,purge 只清了其中一个 -
purge 请求未被允许:IP 不在
allow列表内,Nginx 返回 405 或 403,根本未执行清理 -
缓存尚未写入完成:刚 purge 后立刻发 GET 请求,而上一个请求还在写缓存(尤其开启
proxy_cache_lock时),可能短暂看到 STALE 或 HIT
验证 purge 是否真正生效的方法
不要只看响应头,要结合日志与文件系统确认:
- 启用
log_format cache '$upstream_cache_status $request_uri';,查 access log 中该 URI 后续是否出现MISS - 检查缓存目录:
find /var/cache/nginx/proxy_cache -name "$(echo "httpsGETexample.com/path" | md5sum | cut -d' ' -f1)",应无结果 - 用
curl -I http://example.com/path多次请求,连续观察X-Cache-Status是否稳定为MISS→HIT(说明旧缓存已清,新缓存可建)










