如何通过Nginx proxy_cache_valid指令设置特定404响应的缓存时间,以防止请求穿透?
- 内容介绍
- 文章标签
- 相关推荐
本文共计708个文字,预计阅读时间需要3分钟。
可以使用以下命令对404响应进行缓存,避免对相同路径的无效请求重复处理,减轻服务器压力:
明确配置 404 的缓存规则
proxy_cache_valid 默认只缓存 200、301、302 响应,404 不在默认列表中,必须手动指定:
- 在
location或server块中添加:proxy_cache_valid 404 1m;—— 表示将 404 响应缓存 1 分钟 - 可同时定义多个状态码,例如:
proxy_cache_valid 200 301 302 10m; proxy_cache_valid 404 30s; - 注意:缓存时间不宜过长(如超过 5 分钟),否则新资源上线后用户仍会持续收到旧的 404,影响可用性
确保缓存键能正确区分 404 请求
若 proxy_cache_key 中未包含完整 URI 或忽略查询参数,可能导致不同路径的 404 相互覆盖或误命中:
- 推荐使用较精确的 key,例如:
proxy_cache_key "$scheme$request_method$host$request_uri"; - 如果业务需区分参数(如
/api/item?id=123和/api/item?id=456),务必保留$args:proxy_cache_key "$scheme$request_method$host$request_uri$args"; - 避免使用过于宽泛的 key(如仅用
$uri),否则带参与不带参请求可能共用一个缓存项
配合 proxy_intercept_errors 启用错误页面接管
仅靠 proxy_cache_valid 404 不足以让 Nginx 缓存并返回 404——上游返回 404 时,Nginx 默认直接透传,不会进入缓存流程。必须启用错误拦截:
- 添加:
proxy_intercept_errors on; - 该指令允许 Nginx 将上游返回的 404 视为可处理的响应,进而触发缓存逻辑
- 注意:开启后,若未配置
error_page 404,Nginx 仍会返回默认 404 页面;但只要响应体被缓存,后续相同请求就会直接从缓存返回,无需再连上游
验证与调试技巧
部署后可通过日志和响应头确认缓存是否生效:
- 开启
log_format记录缓存状态,例如:log_format cache '$remote_addr - $upstream_cache_status ...';
查看日志中是否出现MISS(首次请求)、EXPIRED(过期重查)、HIT(命中缓存 404) - 用
curl -I检查响应头:
命中缓存的 404 会带X-Cache: HIT(自定义 header)或Age头非零值 - 临时将缓存时间设为 10s,用两次 curl 间隔 5s 测试是否第二次直接返回(无 upstream 日志)
本文共计708个文字,预计阅读时间需要3分钟。
可以使用以下命令对404响应进行缓存,避免对相同路径的无效请求重复处理,减轻服务器压力:
明确配置 404 的缓存规则
proxy_cache_valid 默认只缓存 200、301、302 响应,404 不在默认列表中,必须手动指定:
- 在
location或server块中添加:proxy_cache_valid 404 1m;—— 表示将 404 响应缓存 1 分钟 - 可同时定义多个状态码,例如:
proxy_cache_valid 200 301 302 10m; proxy_cache_valid 404 30s; - 注意:缓存时间不宜过长(如超过 5 分钟),否则新资源上线后用户仍会持续收到旧的 404,影响可用性
确保缓存键能正确区分 404 请求
若 proxy_cache_key 中未包含完整 URI 或忽略查询参数,可能导致不同路径的 404 相互覆盖或误命中:
- 推荐使用较精确的 key,例如:
proxy_cache_key "$scheme$request_method$host$request_uri"; - 如果业务需区分参数(如
/api/item?id=123和/api/item?id=456),务必保留$args:proxy_cache_key "$scheme$request_method$host$request_uri$args"; - 避免使用过于宽泛的 key(如仅用
$uri),否则带参与不带参请求可能共用一个缓存项
配合 proxy_intercept_errors 启用错误页面接管
仅靠 proxy_cache_valid 404 不足以让 Nginx 缓存并返回 404——上游返回 404 时,Nginx 默认直接透传,不会进入缓存流程。必须启用错误拦截:
- 添加:
proxy_intercept_errors on; - 该指令允许 Nginx 将上游返回的 404 视为可处理的响应,进而触发缓存逻辑
- 注意:开启后,若未配置
error_page 404,Nginx 仍会返回默认 404 页面;但只要响应体被缓存,后续相同请求就会直接从缓存返回,无需再连上游
验证与调试技巧
部署后可通过日志和响应头确认缓存是否生效:
- 开启
log_format记录缓存状态,例如:log_format cache '$remote_addr - $upstream_cache_status ...';
查看日志中是否出现MISS(首次请求)、EXPIRED(过期重查)、HIT(命中缓存 404) - 用
curl -I检查响应头:
命中缓存的 404 会带X-Cache: HIT(自定义 header)或Age头非零值 - 临时将缓存时间设为 10s,用两次 curl 间隔 5s 测试是否第二次直接返回(无 upstream 日志)

