用 proxy_cache 加速高频静态 JSON 的核心是精准命中、零抖动响应与安全降级;需按路径前缀或后缀精确启用,定制缓存键屏蔽干扰参数,分级设置有效期,并通过 X-Cache-Status 验证实效。

用 proxy_cache 加速高频查询的静态 JSON 文件,核心不是“全量缓存”,而是“精准命中 + 零抖动响应 + 安全降级”。这类文件通常体积小(几 KB)、读多写少、更新频率低(小时级或天级),但并发高、延迟敏感(如配置中心、地区列表、菜单数据)。直接套用通用缓存配置容易命中率低、回源打爆、或返回陈旧内容。
只对明确 JSON 路径启用缓存,拒绝泛匹配
避免用 location / 或模糊正则捕获所有请求。静态 JSON 一般有固定前缀或后缀,应显式限定:
- 按路径前缀:例如所有配置类 JSON 放在
/conf/下,配location ^~ /conf/ { ... } - 按后缀精确匹配:用
location ~* \.json$,但必须配合proxy_cache_bypass $args,防止带版本参数(如?v=20260526)被缓存成多个副本 - 排除动态接口:确保不与
/api/v1/user等真正动态路径冲突;建议 JSON 资源走独立子路径(如/data/)或二级域名(static-api.example.com)
定制缓存键,屏蔽干扰变量
默认 $scheme$host$request_uri 会把 URL 参数、Cookie、Header 全部纳入 key,导致同一资源因不同 UA 或空参反复回源。静态 JSON 不依赖用户上下文,应精简:
- 推荐 key:
proxy_cache_key "$scheme$request_method$host$uri";(去掉$args和$cookie_*) - 若需支持语义化刷新(如加
?refresh=1强制跳过),用proxy_cache_bypass $arg_refresh;,而不是把它塞进 key - 禁用影响 key 的头:
proxy_ignore_headers Set-Cookie Vary;,避免后端错误返回 Vary 导致缓存分裂
分级设有效期,兼顾新鲜度与稳定性
JSON 更新不频繁,但业务要求“不能长期错”。不建议简单设 1y,而应分层控制:
-
proxy_cache_valid 200 302 4h;—— 正常响应缓存 4 小时,平衡更新节奏与缓存复用 -
proxy_cache_valid 404 1m;—— 缓存 404 1 分钟,防探测攻击打穿后端 -
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504 updating;—— 源站异常或正在更新时,仍可返回旧缓存,保障服务可用 - 开启再验证:
proxy_cache_revalidate on;,缓存到期前自动发If-None-Match校验,命中 304 则延长有效期,减少无效回源
可观测与快速验证是否真生效
配置写完不等于缓存跑起来。必须通过响应头确认真实行为:
- 加响应头:
add_header X-Cache-Status $upstream_cache_status;,返回HIT/MISS/BYPASS一目了然 - 用 curl 验证:
curl -I https://example.com/conf/app.json,看是否含X-Cache-Status: HIT且响应时间 - 检查缓存目录:
ls -lh /var/cache/nginx/json_cache/,确认有文件生成(注意:首次 HIT 后才写磁盘) - 日志中加变量:
log_format cache '$remote_addr - $upstream_cache_status $request';,便于统计命中率


















