如何设置短周期缓存策略,针对404错误页面使用proxy_cache_valid?
- 内容介绍
- 文章标签
- 相关推荐
本文共计673个文字,预计阅读时间需要3分钟。
直接在 `proxy_cache_valid 指令中设置404状态码为单独的缓存时间,可以设置较短的缓存时间,从而防止恶意扫描或高频无效请求对后端的冲击。关键在于:
明确指定 404 的缓存有效期
在 location 块中启用缓存时,添加一行专用于 404 的规则:
proxy_cache_valid 404 1m;
这表示:只要后端返回了 404,Nginx 就会把整个 404 响应(含状态码和响应体)缓存 1 分钟。期间所有访问相同 URL 的请求,Nginx 直接从缓存返回,不再转发给后端。
常见组合写法示例:
-
proxy_cache_valid 200 302 10m;—— 正常响应缓存 10 分钟 -
proxy_cache_valid 404 30s;—— 404 响应只缓存 30 秒(更激进防刷) -
proxy_cache_valid any 1m;—— 其他所有状态码统一缓存 1 分钟(慎用,可能误缓存 5xx)
确保 404 响应可被缓存
Nginx 默认不会缓存 404 响应,必须满足两个前提:
- 后端实际返回的是标准 HTTP 404 状态码(不是 200 + 自定义文案)
- 后端响应头中未携带禁止缓存的指令,例如:
Cache-Control: no-store或Pragma: no-cache
若后端无法控制响应头,可在 Nginx 中强制忽略:
proxy_ignore_headers Cache-Control Expires;
配合 proxy_intercept_errors 实现闭环
如果后端返回 404 时还附带了较大体积的错误页(比如 HTML),建议同时开启错误拦截,避免把大页面也缓存下来:
- 启用:
proxy_intercept_errors on; - 定义:
error_page 404 = /custom_404.html;(注意等号,表示内部重写,不改变状态码) - 再为该自定义页配置极简响应(如纯文本或小图),并设置
proxy_cache_valid 404 1m;
这样既保持对外返回 404 状态码,又大幅降低缓存体积和传输开销。
验证与观察
配置生效后,可通过以下方式确认是否起作用:
- 用
curl -I http://your-domain.com/xxx查看响应头,首次应有X-Cache: MISS,再次访问应变为X-Cache: HIT - 检查 Nginx error log,确认无大量 upstream timeout 或 connection refused 日志(说明请求未打到后端)
- 使用
nginx -t && systemctl reload nginx重载,避免全量重启
本文共计673个文字,预计阅读时间需要3分钟。
直接在 `proxy_cache_valid 指令中设置404状态码为单独的缓存时间,可以设置较短的缓存时间,从而防止恶意扫描或高频无效请求对后端的冲击。关键在于:
明确指定 404 的缓存有效期
在 location 块中启用缓存时,添加一行专用于 404 的规则:
proxy_cache_valid 404 1m;
这表示:只要后端返回了 404,Nginx 就会把整个 404 响应(含状态码和响应体)缓存 1 分钟。期间所有访问相同 URL 的请求,Nginx 直接从缓存返回,不再转发给后端。
常见组合写法示例:
-
proxy_cache_valid 200 302 10m;—— 正常响应缓存 10 分钟 -
proxy_cache_valid 404 30s;—— 404 响应只缓存 30 秒(更激进防刷) -
proxy_cache_valid any 1m;—— 其他所有状态码统一缓存 1 分钟(慎用,可能误缓存 5xx)
确保 404 响应可被缓存
Nginx 默认不会缓存 404 响应,必须满足两个前提:
- 后端实际返回的是标准 HTTP 404 状态码(不是 200 + 自定义文案)
- 后端响应头中未携带禁止缓存的指令,例如:
Cache-Control: no-store或Pragma: no-cache
若后端无法控制响应头,可在 Nginx 中强制忽略:
proxy_ignore_headers Cache-Control Expires;
配合 proxy_intercept_errors 实现闭环
如果后端返回 404 时还附带了较大体积的错误页(比如 HTML),建议同时开启错误拦截,避免把大页面也缓存下来:
- 启用:
proxy_intercept_errors on; - 定义:
error_page 404 = /custom_404.html;(注意等号,表示内部重写,不改变状态码) - 再为该自定义页配置极简响应(如纯文本或小图),并设置
proxy_cache_valid 404 1m;
这样既保持对外返回 404 状态码,又大幅降低缓存体积和传输开销。
验证与观察
配置生效后,可通过以下方式确认是否起作用:
- 用
curl -I http://your-domain.com/xxx查看响应头,首次应有X-Cache: MISS,再次访问应变为X-Cache: HIT - 检查 Nginx error log,确认无大量 upstream timeout 或 connection refused 日志(说明请求未打到后端)
- 使用
nginx -t && systemctl reload nginx重载,避免全量重启

