nginx不支持按状态码触发不同清理逻辑,而是通过proxy_cache_valid控制各状态码缓存有效期、inactive统一回收冷数据、proxy_cache_key避免状态码混杂,结合外部手段实现差异化淘汰。

Nginx 本身不支持“按状态码触发不同清理逻辑”的主动行为——它没有状态码感知的清理调度器,也没有条件式 purge 指令。所谓“不同状态码对应不同的缓存清理逻辑”,实际是通过 缓存生命周期设计 + 缓存键控制 + 外部协同 实现的差异化淘汰效果,而非运行时动态判断状态码去删文件。
核心思路是:让不同状态码的响应进入缓存时,就天然具备不同的“存活窗口”和“可淘汰性”,最终在 inactive 机制下自然分层清理。
✅ 用 proxy_cache_valid 控制各状态码的逻辑过期时间
这是最直接、最可控的一环。Nginx 根据响应状态码决定该缓存项是否被返回、是否参与 stale 回源、以及何时进入“可淘汰候选队列”。
proxy_cache_valid 200 301 302 1h; # 正常内容缓存久些,抗波动 proxy_cache_valid 404 30s; # 404 缓存极短,防刷但不掩盖修复 proxy_cache_valid 500 502 503 504 20s; # 错误页短命,避免用户长期看到旧错误 proxy_cache_valid any 10s; # 兜底,防止漏掉未明确定义的状态码
⚠️ 注意:proxy_cache_valid 不是“清理指令”,而是“缓存资格判定”。它影响的是:
- Nginx 是否将该响应写入缓存(如 404 默认不缓,必须显式声明);
- 该缓存项在
inactive时间内是否仍可被返回(即使已过proxy_cache_valid,只要没超inactive,仍可能返回STALE); - 它间接决定了该缓存项“多久后彻底失去价值”,从而在
inactive扫描中更早被淘汰。
✅ 用 inactive 参数统一驱动冷数据自动回收
所有缓存项共用同一个 inactive 时限(比如 inactive=1h),但因访问频率和 proxy_cache_valid 差异,实际淘汰节奏不同:
- 一个被频繁访问的 200 缓存,哪怕
proxy_cache_valid 200 10m,只要每 50 分钟被命中一次,它就能一直留在磁盘上; - 一个
proxy_cache_valid 404 30s的条目,通常只在爬虫扫错路径时产生,几乎不会被再次访问 → 很快超出inactive窗口,被自动删除; - 同理,5xx 错误响应往往只在故障窗口内集中出现,之后归零访问 → 自然比 200 更快退出缓存。
所以,“不同清理逻辑”本质是:
→ 让 404/5xx 缓存天生“冷得快”,靠 inactive 机制优先清;
→ 让 200 缓存“热得久”,靠高频访问续命。
✅ 用 proxy_cache_key 避免状态码混杂导致的清理干扰
如果 key 中混入了 $status 或其他不稳定变量(如 $request_time、$cookie_xxx),会导致同一 URL 对不同状态码生成多个 key,造成:
- 404 缓存无法覆盖原 200 缓存(key 不同,不能互替);
- 清理某个 key 时,其他状态码版本残留,失去“统一路径清理”能力。
✅ 推荐做法:
- 不在 key 中显式包含
$status(Nginx 内部已按状态码区分存储行为); - 保持 key 稳定,例如:
proxy_cache_key "$scheme$request_method$host$uri$is_args$args";
- 这样,同一请求路径无论返回 200 还是 404,都走同一个 key → 后续 200 命中会自然覆盖旧的 404 缓存(取决于
proxy_cache_use_stale和proxy_cache_lock配置)。
✅ 手动清理时按状态码区分?需借助外部手段
Nginx 原生命令行或 proxy_cache_purge 模块 不识别状态码,只能按 URI 或 key 清理。
若真需“只清 404 缓存”,可行方案有:
- 在应用层配合:让后端对 404 响应加特定 header(如
X-Cache-Tag: notfound),再用第三方模块(如ngx_cache_purge的增强版或 OpenResty + Lua)解析 header 并标记缓存; - 日志分析 + 脚本清理:定期解析 access.log,提取返回 404 的 URI,再调用 purge 接口批量清理;
- 分区缓存:为不同状态码配置独立
keys_zone(如cache_200,cache_404),再分别设置inactive和清理入口 —— 但会增加配置复杂度与内存开销,一般不推荐。
不复杂但容易忽略











