proxy_cache_valid 为指定http状态码设置缓存有效期,需置于location或server块中,支持多状态码与时间单位,any匹配未显式声明的状态码但优先级最低;缓存还依赖请求方法、响应头等条件。

在 macOS 下使用 Nginx 做反向代理时,proxy_cache_valid 指令用于控制不同 HTTP 状态码的响应缓存时长。它不直接“限制”状态,而是为指定状态码设置缓存有效期——只有匹配的状态码响应才会被缓存,且仅在此时间内有效。
proxy_cache_valid 的基本用法
该指令必须放在 location 或 server 块中,语法为:
proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; proxy_cache_valid 500 502 503 504 10s; proxy_cache_valid any 1m;
说明:
- 每行可指定多个状态码(空格分隔)和一个时间值(支持
s、m、h、d) -
any是通配符,匹配所有未显式声明的状态码,但优先级最低 - 若某响应状态码未被任何
proxy_cache_valid行覆盖,则不会被缓存(即使开启了缓存)
常见误区与注意事项
容易忽略的关键点:
-
缓存前提不止是状态码:Nginx 默认只缓存
GET和HEAD请求;且响应头中不能有Cache-Control: no-cache、no-store、private,或Set-Cookie(除非显式配置proxy_ignore_headers) -
200 不代表一定可缓存:比如后端返回
Cache-Control: no-cache,即使写了proxy_cache_valid 200 1h,该响应也不会进缓存 - 4xx/5xx 缓存需谨慎:缓存错误响应可能掩盖问题,建议仅对临时性错误(如 502/503)设短时间缓存(如 10–30 秒),避免用户长时间看到错误页
调试缓存是否生效
在 macOS 上快速验证:
- 添加日志记录缓存行为:
log_format cache '$remote_addr - $upstream_cache_status $cache_status';,再在access_log中启用该格式 - 请求后检查响应头:
X-Proxy-Cache: HIT或MISS(需在location中加add_header X-Proxy-Cache $upstream_cache_status;) - 查看缓存目录(默认
/usr/local/var/nginx/cache)是否有对应文件生成(注意权限,macOS 上常因 sandbox 或权限导致写入失败)
macOS 特定配置建议
使用 Homebrew 安装的 Nginx(路径通常为 /usr/local/etc/nginx/)时:
- 确认
proxy_cache_path指向的目录存在且 Nginx worker 进程有读写权限(如sudo chown -R $(whoami):staff /usr/local/var/nginx/cache) - 若启用 SSL 代理,确保
proxy_ssl_*相关参数正确,否则部分 HTTPS 后端响应可能因证书校验失败而无法缓存 - macOS 默认无 SELinux,但要注意 SIP(系统完整性保护)不影响 Nginx 自身,但可能限制某些自定义路径的写入,建议缓存路径留在
/usr/local/var/下











