统计静态资源压缩率需依托nginx的$gzip_ratio变量,通过自定义log_format记录该值,过滤非“-”样本后按路径或mime类型分组计算平均值,并结合$body_bytes_sent反推原始大小与实际节省量。

要统计静态资源的压缩率,核心是利用 Nginx 的 $gzip_ratio 变量配合日志格式与后续分析,而不是靠猜测或手动测文件。它直接反映每次响应的实际压缩效果(仅对真正被压缩的请求生效),但必须先确保日志中能稳定采集到该值。
确保 $gzip_ratio 在日志中正确记录
该变量默认不输出,需显式加入 log_format:
- 在
http块中定义日志格式,例如:log_format gzip_log '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent $gzip_ratio $request_time "$http_referer" "$http_user_agent"'; - 启用该格式的日志:
access_log /var/log/nginx/access_gzip.log gzip_log; - 确认
gzip on已开启,且gzip_types包含目标资源类型(如text/css application/javascript) - 注意:
$gzip_ratio仅对满足全部压缩条件的响应返回小数(如0.65),未压缩时为短横线-,不可参与计算
从日志提取有效压缩样本
压缩率统计必须基于真实被压缩的请求,因此过滤是关键:
- 用
awk或日志分析工具筛选出$gzip_ratio不为-的行,例如:awk '$12 != "-" {print $7, $12}' /var/log/nginx/access_gzip.log
(假设第7列为$body_bytes_sent,第12列为$gzip_ratio,具体列数依你的格式而定) - 按文件路径(
$request)或 MIME 类型(可结合$sent_http_content_type)分组聚合,排除图片、字体、视频等本就不该压缩的资源 - 对每个资源路径,计算其
$gzip_ratio的平均值和分布范围,避免单次异常值干扰整体判断
结合 $body_bytes_sent 反推实际压缩效果
单看 $gzip_ratio 数值不够直观,需关联传输体积才能评估真实收益:
- 对某资源(如
app.js),取其平均$body_bytes_sent和平均$gzip_ratio - 原始大小 ≈
$body_bytes_sent / (1 - $gzip_ratio)(仅当$gzip_ratio > 0) - 压缩率 =
$gzip_ratio × 100%;节省比例 = 同样数值;单次节省字节数 = 原始大小 −$body_bytes_sent - 例如:平均发送 82 KB,平均
$gzip_ratio = 0.68→ 原始约 265 KB → 实际压缩率达 68%,每请求节省约 183 KB
识别压缩失效或低效的常见原因
如果大量静态资源的 $gzip_ratio 为 - 或偏低(如
- 检查是否启用了
gzip_static on:它会优先发预压缩的.gz文件,此时$gzip_ratio不生效(因未走动态压缩流程) - 确认
gzip_min_length设置合理(建议 ≥1024),过小的文件压缩后可能反而变大 - 查看
Accept-Encoding请求头是否缺失或不含gzip,某些爬虫或旧客户端可能不声明支持 - 验证
gzip_types是否遗漏了实际资源的 MIME 类型(如application/json或text/plain)











