proxy_cache_valid 控制缓存响应的有效期(TTL),需在 location 或 server 块中配置,按状态码设置缓存时间,但依赖 proxy_cache_path、可缓存响应头及合理 cache key 等前提才能生效。

在 macOS 下使用 Nginx 做反向代理时,proxy_cache_valid 控制的是缓存响应的**有效期(TTL)**,它决定 Nginx 在多长时间内可直接返回缓存内容,而无需再次请求上游服务器。
proxy_cache_valid 的基本语法和作用范围
该指令必须写在 location 或 server 块中,不能出现在顶层 http 块(除非配合 proxy_cache_valid 的全局默认行为,但不推荐)。它的核心逻辑是:根据上游响应的状态码,设置对应缓存时间。
常见写法示例:
-
proxy_cache_valid 200 302 10m;→ 状态码为 200 或 302 的响应,缓存 10 分钟 -
proxy_cache_valid 404 1m;→ 404 响应也缓存 1 分钟(防止频繁探测不存在路径) -
proxy_cache_valid any 5m;→ 所有状态码统一缓存 5 分钟(兜底策略)
缓存有效期真正生效的前提条件
proxy_cache_valid 不是“一设就缓”,它依赖多个配套配置协同工作:
-
必须启用缓存区:通过
proxy_cache_path定义缓存存储路径和参数(如keys_zone),并在location中用proxy_cache zone_name指定使用哪个 zone -
响应需满足可缓存条件:默认情况下,Nginx 只缓存
GET/HEAD请求,且上游响应头中不能含Cache-Control: no-cache、no-store、private,也不能含Set-Cookie(除非显式用proxy_ignore_headers Set-Cookie忽略) -
缓存键(cache key)要合理:默认 key 是
$scheme$proxy_host$request_uri,若需区分用户或参数,需用proxy_cache_key自定义,否则不同用户的请求可能命中同一缓存
如何验证缓存是否按预期生效
最直接的方式是查看响应头和日志:
- 开启
add_header X-Cache-Status $upstream_cache_status;,响应中会出现HIT、MISS、EXPIRED等状态 - 检查 Nginx error log(开启
debug级别)可看到详细缓存决策过程,比如 “cached response expired” 或 “using cached response” - 用
curl -I http://localhost/path多次请求,观察X-Cache-Status和响应时间变化
容易被忽略的关键细节
几个实际部署中常踩的坑:
-
proxy_cache_valid设置的时间,是从响应被缓存那一刻起算,不是从首次请求开始;每次HIT不会重置 TTL - 即使设置了
proxy_cache_valid 200 1h,如果上游响应自带Cache-Control: max-age=60,Nginx 默认会以更短的那个为准(可通过proxy_ignore_headers Cache-Control覆盖) - macOS 上注意磁盘空间和权限:确保
proxy_cache_path指定的目录存在、Nginx worker 进程有读写权限,否则缓存写入失败,始终MISS

















