最有效方式是按状态码分设缓存时间:301缓存7天、302缓存2分钟;200响应按资源分级,JS/CSS缓存1年、HTML仅10秒;404缓存1分钟、5xx缓存30秒;且需配置proxy_cache_path、proxy_cache及合理cache_key。

直接按状态码分设缓存时间是最有效的方式。Nginx 不会自动区分 301、302、200 或 404 的缓存策略,必须显式用 proxy_cache_valid 单独配置,否则容易出现重定向反复回源、错误页缓存过久等问题。
为 301 和 302 设置不同缓存时长
301(永久重定向)语义上承诺长期有效,适合缓存较长时间,比如 7 天;302(临时重定向)则需短周期,如 2 分钟,避免掩盖上游服务的临时变更。
- 必须分开写两行:
proxy_cache_valid 301 7d;和proxy_cache_valid 302 2m; - 不能合并进
proxy_cache_valid 301 302 2m;或依赖any规则,否则 301 可能被覆盖或走默认 fallback - 若上游返回带
Cache-Control: no-cache的 302,还需加proxy_ignore_headers Cache-Control;才能让缓存生效
对 200 响应按资源类型分级缓存
200 是常规成功响应,但静态资源差异大:JS/CSS 文件若含哈希名可长期缓存,HTML 则需频繁验证。
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 哈希命名的 JS/CSS:设
proxy_cache_valid 200 1y;(一年),配合合理proxy_cache_key包含$args(如有参数) - 普通图片或字体:可用
proxy_cache_valid 200 30d; - HTML 页面:建议
proxy_cache_valid 200 10s;或更短,并搭配proxy_cache_use_stale error timeout updating;提升可用性
别忽略 404 和 5xx 错误响应的缓存价值
缓存 404 能防止爬虫或恶意探测反复压垮后端;缓存 5xx 可在故障期间维持基础响应能力。
-
proxy_cache_valid 404 1m;:避免同一不存在路径被高频请求 -
proxy_cache_valid 500 502 503 504 30s;:短时兜底,缓解雪崩风险 - 注意:这些缓存只在
proxy_cache已启用且响应未被Set-Cookie或Cache-Control: private阻止时才生效
确保缓存真正起作用的三个前提
光写 proxy_cache_valid 不够,它只是“有效期”指令,实际缓存是否写入、是否命中,还取决于底层支撑。
- 必须有
proxy_cache_path定义缓存区(含keys_zone),并在location中用proxy_cache zone_name显式启用 - 响应需满足可缓存条件:默认仅缓存 GET/HEAD 请求,且不能含
Cache-Control: no-cache/no-store/private、Set-Cookie等头(必要时用proxy_ignore_headers忽略) - 缓存键要精准:
proxy_cache_key $scheme$host$request_uri$args;比默认值更稳妥,尤其当重定向或资源路径依赖查询参数时

















