apache不直接提供静态资源压缩比率统计,但可通过mod_logio记录%b(原始响应体大小)和%o(实际发送字节数)间接计算,结合日志筛选、curl抽样验证或预压缩文件大小比实现压缩率评估。

Apache 本身不直接提供“静态资源压缩比率”这一指标的统计功能。它不会自动记录每个 .js 或 .css 文件压缩前后的字节对比,也不像 IoTDB 那样内置 compression_ratio 指标。但你可以通过组合日志、响应头和外部工具,间接推算出实际生效的压缩比率,关键在于捕获两个数据:原始响应体大小(未压缩)和真实发出字节数(含 gzip 后内容)。
确保能获取压缩前后的真实字节数
Apache 的 %b 和 %O 字段是核心依据:
-
%b:响应体(body)字节数,未压缩时等于原始大小;启用 mod_deflate 后,它通常仍显示原始大小或-(取决于版本与配置),不可靠 -
%O:socket 层实际发送的总字节数,包含响应头 + gzip 压缩后的内容 + chunked 分隔符等,是带宽侧的真实值
所以必须启用 mod_logio 并在日志中同时记录 %b 和 %O:
LoadModule logio_module modules/mod_logio.so
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" compression_log
CustomLog /var/log/apache2/static-compression.log compression_log
✅ 验证是否生效:访问一个
.js文件,检查日志行第 7 列(%b)和第 12 列(%O)是否都输出整数(非-)。若%b为-,说明该请求未触发 body 输出(如重定向),需选 200 OK 的静态资源测试。
区分静态资源并过滤压缩生效的请求
不是所有请求都走压缩。只有满足以下条件的才会被 mod_deflate 处理:
- MIME 类型在
AddOutputFilterByType中定义(如text/css,application/javascript) - 客户端声明支持
Accept-Encoding: gzip - 响应体大于
DeflateBufferSize(默认 8KB,可调)
因此,在日志分析时要加筛选:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
# 提取 JS/CSS 文件中被成功压缩的请求(状态200、有Content-Encoding: gzip)
awk '$7 ~ /\.(js|css)$ && $6 == 200 {
# 尝试从响应头日志补全(若你启用了 %{Content-Encoding}o 记录)
# 否则依赖 %O 远大于 %b 的事实(典型 gzip 压缩率 3–5 倍)
if ($12 > $7 * 2) { # 粗略判断:发出量显著大于响应体 → 很可能已压缩
ratio = $7 / $12
print "File:", $7, "Original(b):", $7, "Sent(O):", $12, "Ratio:", sprintf("%.3f", ratio)
}
}' /var/log/apache2/static-compression.log
⚠️ 注意:$7 是 %b(响应体),$12 是 %O(实际发出)。列号依 LogFormat 顺序而定,务必核对。
补充手段:用 curl 手动验证单个文件压缩率
对关键资源做抽样验证,最准确:
# 获取未压缩大小(禁用 gzip)
curl -H "Accept-Encoding:" -s -w "%{size_download}\n" -o /dev/null https://example.com/style.css
# 获取压缩后大小(启用 gzip)
curl -H "Accept-Encoding: gzip" -s -w "%{size_download}\n" -o /dev/null https://example.com/style.css
两结果相除即得该次请求的实际压缩比率(例如 12450 / 3120 ≈ 0.25,即 25%,压缩比 4:1)。
不依赖日志的轻量级监控思路
如果你使用预压缩(.css.gz)+ mod_rewrite 方案:
- 原始文件大小 =
stat -c "%s" style.css -
.gz文件大小 =stat -c "%s" style.css.gz - 压缩比率 =
.gz size / original size
这个值可在部署阶段计算并写入监控系统(如 Prometheus 的文本文件收集器),无需运行时开销。
不复杂但容易忽略。










