判断 Nginx 反向代理缓存是否生效可以通过多种方式验证,以下是常用的检查方法和工具:
1. 查看响应头信息(最直接方法)
通过添加 X-Cache-Status
响应头来查看缓存命中状态:
配置示例
server {
location / {
# 其他代理配置...
add_header X-Cache-Status $upstream_cache_status; # 添加缓存状态头
}
}
状态码含义
- HIT:缓存命中,直接返回缓存内容。
- MISS:缓存未命中,请求已转发至后端。
- EXPIRED:缓存已过期,需重新请求后端(命中后会更新缓存)。
- UPDATING:缓存正在后台更新(需配置
proxy_cache_use_stale updating
)。 - STALE:使用过期缓存(后端故障时)。
验证方法
curl -I http://example.com/path/to/resource # 查看响应头
# 预期输出:
# X-Cache-Status: HIT # 表示缓存命中
2. 检查缓存文件是否生成
查看配置中指定的缓存目录(如 /var/cache/nginx
)是否存在对应的缓存文件:
示例命令
# 查找与请求匹配的缓存文件(根据 proxy_cache_key 生成)
find /var/cache/nginx -type f -name "*$(echo -n "http://example.com/path/to/resource" | md5sum | awk '{print $1}')*"
注意事项
- 缓存文件路径由
proxy_cache_path
的levels
参数决定(如levels=1:2
会生成两级目录)。 - 文件权限需确保 Nginx 进程有读写权限(通常为
www-data
或nginx
用户)。
3. 监控缓存命中率
通过日志统计或监控工具分析缓存命中率:
配置日志记录
log_format cache '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$upstream_cache_status';
access_log /var/log/nginx/access_cache.log cache;
统计命中率
# 统计 HIT 和 MISS 的比例
grep -o '"$upstream_cache_status' /var/log/nginx/access_cache.log | sort | uniq -c
4. 验证后端请求次数
通过监控后端服务器的访问日志或性能指标,确认相同请求是否被重复处理:
示例场景
- 缓存生效:多次请求同一资源,后端日志仅记录一次请求。
- 缓存失效:每次请求都触发后端处理。
5. 使用浏览器开发者工具
在 Chrome/Firefox 中查看 Network 面板的响应头:
- 打开开发者工具(F12 或右键 Inspect)。
- 刷新页面并查看请求的响应头。
- 检查是否存在
X-Cache-Status: HIT
或其他状态。
6. 检查缓存配置是否正确
确保 Nginx 配置无误是缓存生效的前提:
常见配置问题
- 缓存路径权限不足:Nginx 无法写入缓存目录。
- 缓存键配置错误:
proxy_cache_key
未包含关键参数(如忽略了查询字符串)。 - 缓存有效期过短:
proxy_cache_valid
设置时间过短,导致缓存频繁失效。 - 请求被绕过:
proxy_cache_bypass
或proxy_no_cache
条件匹配所有请求。
验证配置语法
nginx -t # 检查配置文件语法
systemctl reload nginx # 重新加载配置
7. 特殊场景排查
动态内容缓存
若动态内容(如含登录状态的页面)未被缓存,可能是因为:
- 缓存键未包含
$cookie_*
变量,导致不同用户的请求被视为相同。 proxy_cache_bypass
配置为根据 Cookie 绕过缓存。
HTTPS 请求缓存
确保 proxy_cache_key
包含 $scheme
变量,否则 HTTP 和 HTTPS 请求可能被视为相同:
proxy_cache_key $scheme$host$request_uri; # 包含协议信息
总结
验证 Nginx 反向代理缓存是否生效的步骤:
- 添加状态头:通过
X-Cache-Status
直接查看命中状态。 - 检查文件系统:确认缓存文件是否生成。
- 分析日志:统计 HIT/MISS 比例。
- 监控后端:确认后端请求次数是否减少。
- 排查配置:修复权限、路径或参数配置问题。
通过以上方法,可以快速定位缓存不生效的原因并进行优化。