apache本身不直接记录缓存命中/未命中状态,需通过自定义x-cache响应头(如header set x-cache "hit" "expr=%{cache_status} == 'hit'")并配合logformat和customlog将该头写入日志,再用awk等工具统计;若无法注入x-cache,则可依据age头、304状态码及cache-control等响应头组合间接判断命中、再验证与未命中。

Apache 本身不直接记录缓存命中/未命中状态,但通过合理配置日志格式并结合响应头分析,可以间接、可靠地评估动态内容缓存效率。关键不是“找现成指标”,而是让日志主动暴露缓存行为。
在日志中显式记录缓存状态
Apache 的 mod_cache 不默认写入缓存结果到日志,需手动扩展日志字段。利用 %{Cache-Control}o、%{Expires}o 和更关键的 %{X-Cache}o(需自定义响应头)可直接反映缓存决策:
- 启用
mod_headers并在缓存规则中注入标识:Header set X-Cache "HIT" "expr=%{cache_status} == 'hit'"Header set X-Cache "MISS" "expr=%{cache_status} == 'miss'"Header set X-Cache "REVALIDATE" "expr=%{cache_status} == 'revalidate'" - 定义新日志格式,包含该头:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{X-Cache}o" cache_format - 对动态路径启用该格式:
<location> CustomLog logs/api_cache.log cache_format </location>
从标准响应头反推缓存行为
若无法注入 X-Cache,可通过分析原始响应头字段组合判断:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
命中(HIT):状态码为
200且响应含Age头(值 > 0),或含Cache-Control且无no-cache/no-store,同时ETag或Last-Modified与请求一致 -
再验证成功(REVALIDATE):状态码为
304—— 这是最明确的缓存有效性信号,应单独统计 -
未命中(MISS):状态码
200但无Age,且响应头含Cache-Control: private或max-age=0,或首次请求(无If-None-Match等条件头)
用命令行快速统计命中率
针对已记录 X-Cache 的日志,一行命令即可得出实时命中率:
awk '$12 ~ /^(HIT|REVALIDATE)$/ {hit++} $12 == "MISS" {miss++} END {if(hit+miss>0) printf "命中率: %.1f%\n", hit/(hit+miss)*100}' /var/log/apache2/api_cache.log
若仅依赖状态码,可简化估算(适用于以 304 为主验证机制的场景):
-
grep -c '" 304 "' access.log→ 再验证数 -
grep -c '" 200 "' access.log→ 总成功响应 - 命中率 ≈
(304数 + 部分200缓存响应)/ 总请求数 —— 但需配合Age字段过滤才准确
关联错误日志定位缓存失效根源
高 MISS 率常源于配置或内容问题,需交叉检查:
- 搜索
Cache miss for或Cache not fresh关键词(开启mod_cache的 debug 日志后) - 检查错误日志中是否频繁出现
CacheLock timeout(并发锁争用)、Cache storage full(磁盘缓存满)或Invalid response headers(如 Set-Cookie 被误缓存) - 确认动态脚本是否主动发送了
Cache-Control: no-cache或Vary: *等破坏缓存粒度的头










