Nginx 本身不会直接记录“缓存命中/未命中”到普通 access log,需要你在配置里显式记录缓存状态,然后看日志才行。
下面按常见场景说明。
最常见的 Nginx 缓存方式。
Nginx 只发 Cache-Control、Expires,不缓存内容,日志里看不到命中。
log_format cache_log '$remote_addr - $upstream_cache_status [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
关键变量:
$upstream_cache_statusaccess_log /var/log/nginx/cache_access.log cache_log;
upstream_cache_status示例日志:
192.168.1.10 - HIT [10/Oct/2024:12:00:01 +0800] "GET /api/user HTTP/1.1" 200 1234
192.168.1.11 - MISS [10/Oct/2024:12:00:02 +0800] "GET /api/user HTTP/1.1" 200 1234
192.168.1.12 - EXPIRED [10/Oct/2024:12:00:03 +0800] "GET /api/user HTTP/1.1" 200 1234
upstream_cache_status 含义| 状态 | 含义 |
|---|---|
| HIT | 缓存命中 |
| MISS | 未命中,回源 |
| EXPIRED | 缓存过期,回源更新 |
| BYPASS | 强制不走缓存 |
| STALE | 用旧缓存(源站错误) |
| UPDATING | 正在更新缓存 |
| REVALIDATED | 重新验证成功 |
✅ 看缓存是否生效,核心就是看 HIT 多不多
$upstream_cache_status默认 combined 日志是看不到缓存状态的。
可能原因:
proxy_cache 没开proxy_cache_valid 没配Cache-Control: no-cachecurl -I https://yourdomain.com/api/test
看响应头:
X-Cache: HIT
(如果你配置了 add_header X-Cache $upstream_cache_status)
add_header X-Cache $upstream_cache_status;
浏览器开发者工具 → Network → Response Headers 直接看。
Nginx 缓存日志 = 配置
log_format+$upstream_cache_status+ 看 HIT / MISS
如果你愿意,可以把你的 nginx.conf 相关配置贴出来,我可以直接帮你判断缓存有没有配对。