Nginx可通过proxy_cache_valid 404 1m显式缓存404响应,但需配合proxy_cache启用、proxy_ignore_headers忽略后端缓存头,并满足缓存区已定义等前提条件,否则默认不缓存非2xx/3xx状态码。

直接在 proxy_cache_valid 指令中明确指定 404 状态码及其缓存时间即可,无需额外模块或特殊条件。关键在于让 Nginx 在首次收到后端返回的 404 时主动缓存它,并控制好有效期,避免反复回源加重压力。
确认缓存区已定义且启用
确保已在 http 块中声明了缓存区(如 cache_one),并在 location 或 server 块中启用了该缓存:
-
proxy_cache cache_one;—— 必须显式开启,否则proxy_cache_valid不生效 -
proxy_cache_valid 200 301 302 10m;—— 这类正常响应默认可缓存,但 404 需单独写 -
proxy_cache_valid 404 1m;—— 明确为 404 设置 1 分钟缓存(可按需调整为 60s、300s 等)
注意 404 缓存的前提条件
Nginx 默认**不缓存非 2xx/3xx 响应**,所以仅写 proxy_cache_valid 404 1m 不够,还需满足以下任一条件:
- 后端响应头中包含
Cache-Control或Expires(如Cache-Control: public, max-age=60) - 配置
proxy_ignore_headers Cache-Control Expires Set-Cookie;—— 强制忽略后端的缓存控制指令,让 Nginx 完全按proxy_cache_valid执行 - 搭配
proxy_cache_use_stale error timeout updating http_404;可进一步提升容错性(比如缓存过期瞬间后端又挂了,仍可返回旧 404)
典型配置片段示例
以下为可直接复用的最小有效配置(放在 location 块内):
proxy_cache cache_one; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; # 关键:单独设置 404 缓存周期 proxy_cache_valid 500 502 503 504 30s; proxy_ignore_headers Cache-Control Expires; proxy_cache_use_stale error timeout updating http_404;
验证是否生效
通过 curl -I 查看响应头中的缓存标识:
- 首次请求不存在路径:响应头含
X-Cache-Status: MISS,且状态码为 404 - 1 分钟内再次请求相同路径:响应头变为
X-Cache-Status: HIT,仍为 404,但无后端日志记录 → 表明缓存已起作用 - 若始终是
MISS,检查后端是否返回了Cache-Control: no-store或Set-Cookie(会被默认拦截)


















