排查 Nginx 缓存问题,主要看 access 日志、error 日志,必要时开启 debug 日志 或 缓存命中日志变量。下面按实战步骤说明。
Nginx 常见缓存有:
下面以 proxy_cache 为例(最常见)。
log_format cache_log '$remote_addr - $upstream_cache_status [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log cache_log;
upstream_cache_status请求后看日志,会出现以下值:
| 状态 | 含义 |
|---|---|
| HIT | 命中缓存 |
| MISS | 未命中,回源 |
| EXPIRED | 缓存过期 |
| BYPASS | 被绕过(如 Cache-Control) |
| STALE | 返回旧缓存 |
| UPDATING | 正在更新缓存 |
| REVALIDATED | 重新验证成功 |
示例:
10.0.0.1 - HIT [10/Oct/2024:10:00:00] "GET /api/test HTTP/1.1" 200 1234
✅ 这是判断缓存是否生效的第一手证据
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;
server {
location / {
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_pass http://backend;
}
}
常见错误:
proxy_cacheCache-Control: no-store / privateSet-CookieAuthorizationnginx -V 2>&1 | grep debug
error_log /var/log/nginx/error.log debug;
搜索关键字:
grep -i cache /var/log/nginx/error.log
你会看到:
ls -R /data/nginx/cache
cat /data/nginx/cache/xxx
curl -I https://example.com/test
看响应头:
X-Cache: HIT
Cache-Control: max-age=600
(需自行加 add_header X-Cache $upstream_cache_status;)
| 问题 | 排查点 |
|---|---|
| 一直 MISS | 后端 no-cache / Set-Cookie |
| 偶尔 HIT | Cache key 不一致 |
| 缓存不更新 | inactive / proxy_cache_valid |
| 登录接口被缓存 | 带 Cookie / Authorization |
| 缓存目录为空 | proxy_cache_path 权限 |
tail -f /var/log/nginx/access.log | grep -E 'HIT|MISS|EXPIRED'
如果你愿意,可以把:
贴出来,我可以帮你精确指出问题点。