Nginx可通过proxy_cache_valid按状态码分组设置缓存时间,如200/301/302缓存10分钟、404缓存30秒;但404缓存需满足返回标准404状态码且无Cache-Control:no-store或Set-Cookie,同时必须配置proxy_cache_path、proxy_cache及proxy_pass才能生效。

直接在 proxy_cache_valid 指令中按状态码分组设置时间,就能为 200、301、404 等不同响应分别控制缓存寿命。Nginx 默认只缓存 200/301/302,404 必须显式声明且满足前提条件才能生效。
基础写法:按状态码分组指定时间
在 location 或 server 块中添加多行配置:
-
proxy_cache_valid 200 301 302 10m;—— 正常成功和重定向响应缓存 10 分钟 -
proxy_cache_valid 404 30s;—— 404 响应单独缓存 30 秒(防刷常用) -
proxy_cache_valid 500 502 503 504 1m;—— 后端错误短时缓存,减轻雪崩风险
404 缓存必须满足的两个前提
仅写 proxy_cache_valid 404 30s 不够,Nginx 默认不缓存非 2xx/3xx 响应:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 后端返回的是标准 HTTP 404 状态码(不是 200 + 自定义文案)
- 后端响应头未带
Cache-Control: no-store或Set-Cookie;若无法控制后端,加这一行:proxy_ignore_headers Cache-Control Expires Set-Cookie;
缓存区与启用是硬性要求
以下三者缺一不可,否则所有 proxy_cache_valid 都不生效:
- 在
http块中已定义缓存区:proxy_cache_path /var/cache/nginx/levels=1:2 keys_zone=main_cache:10m inactive=5m max_size=1g; - 在当前作用域(如
location)启用了缓存:proxy_cache main_cache; - 确保
proxy_pass存在且能正常回源
进阶组合:提升容错与防刷效果
搭配使用可增强稳定性:
-
proxy_cache_use_stale error timeout updating http_404;—— 缓存过期时,若后端又出问题,仍可返回旧 404 -
proxy_intercept_errors on;+error_page 404 = @custom_404;—— 把大体积 HTML 错误页替换成轻量静态文件,再配proxy_cache_valid 200 10s;,更省资源 - 避免滥用
proxy_cache_valid any 1m;—— 可能误缓存敏感 5xx 或跳转,建议按需精确列举

















