nginx代理缓存生效需四步闭环:定义缓存区(http块声明keys_zone、路径及use_temp_path=off)、精准启用(location中绑定proxy_cache)、控制键与过期(自定义proxy_cache_key、分级proxy_cache_valid)、验证命中(add_header x-cache-status)。

Nginx 通过 proxy_cache 实现 HTTP 代理缓存加速,核心是把后端响应“存下来、用起来”,而不是每次请求都打到上游。真正起效不靠堆参数,而在于四步闭环:定义缓存区 → 精准启用 → 控制键与过期 → 验证是否真命中。
缓存区必须在 http 块里提前声明
所有缓存配置的起点是全局声明缓存路径和内存索引区,不能写在 server 或 location 里。
-
路径需手动创建并赋权:比如
/var/cache/nginx/api_cache要用mkdir -p创建,并确保 nginx 工作用户(如www-data)有读写权限 -
keys_zone 名称要唯一且后续复用:例如
keys_zone=api_cache:10m,其中10m是元数据内存,支撑约十万级 key;静态资源多时建议 ≥64m - use_temp_path=off 是性能关键:跳过临时文件中转,减少磁盘 IO,必须开启
-
inactive 决定自动清理节奏:比如
inactive=60m表示 60 分钟没被访问的缓存条目会被自动淘汰,比只靠max_size更主动
在 location 中按需启用,不盲目全局开
缓存不是越广越好,要匹配资源特征、状态码、参数行为。
-
窄匹配资源类型:比如接口用
location /api/v1/,静态资源用location ~* \.(js|css|png|webp)$ -
绑定对应 keys_zone:
proxy_cache api_cache,名称必须和proxy_cache_path中定义的一致 -
按状态码分级设有效期:例如
proxy_cache_valid 200 302 10m、proxy_cache_valid 404 1m,避免错误响应也被长期缓存 -
允许客户端控制绕过:加
proxy_cache_bypass $http_cache_control,当请求头含Cache-Control: no-cache时跳过缓存 -
后端异常时仍可用旧数据:用
proxy_cache_use_stale error timeout http_500提升容错性
缓存键要干净,避免碎片化
默认 key 容易因 URL 参数(如 ?t=123、&utm_source=xxx)或请求头(如 User-Agent)导致重复缓存或漏命中。
-
显式定义 key:推荐
proxy_cache_key "$scheme$host$request_uri";,去掉高变字段 -
只保留业务关键参数:比如只对
id和type敏感,就写"$scheme$host$request_uri$is_args$arg_id$arg_type" - 多域名共用缓存时必须保留 $host,否则不同站点资源会相互覆盖
- 禁用 Cookie、Authorization、User-Agent 等字段,防止每个用户生成一份缓存
上线前必须验证是否真命中
配置写完不等于生效,得看响应头说话。
-
加一行调试头:在 location 中加
add_header X-Cache-Status $upstream_cache_status; -
curl 查看结果:执行
curl -I https://example.com/api/data,观察返回头中X-Cache-Status的值:
HIT = 命中缓存,直接返回
MISS = 未命中,已回源并缓存
BYPASS = 被proxy_cache_bypass规则跳过
EXPIRED = 缓存过期,回源更新中 -
配合日志观察效果:检查
$upstream_response_time是否明显下降,/var/cache/nginx/xxx目录是否有文件增长











