为404状态码单独设置短缓存时间(如proxy_cache_valid 404 30s)可有效防御恶意扫描,nginx缓存“找不到”结果并快速返回,避免请求穿透后端。

直接在 proxy_cache_valid 指令中为 404 状态码单独设置较短的缓存时间,是防止恶意扫描或高频无效请求冲击后端的有效手段。关键在于:它不缓存真实内容,而是缓存“找不到”这个结果本身,让 Nginx 快速返回 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 响应,必须满足两个前提:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 后端实际返回的是标准 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重载,避免全量重启










