缓存有效期过短会导致Nginx频繁回源,后端请求数陡增;需通过压测对比不同proxy_cache_valid值下的后端真实请求数、分析$upstream_cache_status日志中EXPIRED比例、检查缓存文件mtime驻留时长及后端响应头是否覆盖缓存策略来综合验证。

缓存有效期设得太短,会让 Nginx 频繁回源,后端请求量陡增,CPU、连接数、数据库查询压力都会明显上升。排查核心是确认“是不是缓存真在频繁过期”,而不是只看配置写了多少秒。
看后端真实请求数是否随缓存时间缩放
这是最直接的证据。用压测工具(如 wrk)固定并发和时长,对比不同 proxy_cache_valid 值下的后端日志请求数:
- 设为
30s:30 秒压测中,后端收到接近总请求数(比如 2900+ 次),说明几乎每次都在回源 - 设为
5m:同样压测,后端请求数降到 200–400 次,且集中在前几十秒——符合“首次加载 + 过期刷新”规律 - 如果两组数据差距极小(比如都是 2800+),大概率缓存根本没生效,要查
Cache-Control是否被后端覆盖或proxy_ignore_headers是否漏配
查 Nginx 缓存状态日志里的 EXPIRED 比例
在 access log 中加入 $upstream_cache_status,例如:
log_format main '$remote_addr - $upstream_cache_status $request_time $upstream_response_time';压测后统计日志:
- 若
EXPIRED占比超过 30%,尤其集中在固定时间间隔(如每 30 秒一批),基本锁定有效期过短 - 同时出现大量
MISS而非EXPIRED,则可能是inactive参数太小(如inactive=10s),缓存文件还没过期就被清理了
检查缓存文件是否真的按预期时间驻留
进入 proxy_cache_path 目录(如 /var/cache/nginx),执行:
find . -type f -printf '%T@ %p\n' | sort -n | tail -3观察最近几个缓存文件的修改时间戳(%T@ 是秒级时间戳):
- 如果刚写入几秒就消失,不是
proxy_cache_valid的问题,而是inactive设置过小或磁盘满/权限异常(查error.log) - 如果文件存在时间接近你设的
proxy_cache_valid(比如设 60s,文件 mtime 到 58–62 秒后才不见),说明过期逻辑正常,但时间值确实太短
确认有没有被后端响应头强行覆盖
哪怕 Nginx 配了 proxy_cache_valid 200 1h,只要后端返回 Cache-Control: max-age=0 或 no-cache,Nginx 就会跳过缓存。快速验证方法:
- 用
curl -I https://your.site/api/data查响应头,重点盯Cache-Control和Expires - 如果存在
max-age=0、no-cache、private或no-store,就说明后端在“拒绝缓存” - 此时需在 Nginx 中加
proxy_ignore_headers Cache-Control Expires;并重设proxy_cache_valid,才能真正接管控制权











