如何通过Nginx proxy_cache_valid指令设置特定404响应的缓存时间,以防止请求穿透?

2026-04-28 22:483阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计708个文字,预计阅读时间需要3分钟。

如何通过Nginx proxy_cache_valid指令设置特定404响应的缓存时间,以防止请求穿透?

可以使用以下命令对404响应进行缓存,避免对相同路径的无效请求重复处理,减轻服务器压力:

明确配置 404 的缓存规则

proxy_cache_valid 默认只缓存 200、301、302 响应,404 不在默认列表中,必须手动指定:

  • locationserver 块中添加:
    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 日志)
标签:NginxProxy

本文共计708个文字,预计阅读时间需要3分钟。

如何通过Nginx proxy_cache_valid指令设置特定404响应的缓存时间,以防止请求穿透?

可以使用以下命令对404响应进行缓存,避免对相同路径的无效请求重复处理,减轻服务器压力:

明确配置 404 的缓存规则

proxy_cache_valid 默认只缓存 200、301、302 响应,404 不在默认列表中,必须手动指定:

  • locationserver 块中添加:
    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 日志)
标签:NginxProxy