$gzip_ratio是Nginx内置变量,表示gzip压缩率(1-压缩后大小/原始大小),需在log_format中显式配置才生效,仅对实际压缩的响应返回有效数值,未压缩时为“-”。

$gzip_ratio 是 Nginx 内置的变量,表示当前响应启用 gzip 压缩后的压缩率(即 1 - 压缩后大小 / 原始大小),以小数形式呈现(如 0.65 表示体积减少了 65%)。它不直接显示节省了多少带宽,但结合日志格式与访问统计,可精准量化压缩带来的实际带宽收益。
关键前提:必须确保该变量在日志中生效且数据可信
Nginx 默认不记录 $gzip_ratio,需手动加入 log_format;同时它仅对实际执行了 gzip 压缩的响应有效(即满足 gzip on、类型匹配、大小达标等全部条件),对未压缩或跳过压缩的请求返回短横线 -。
在日志中正确记录并解读 $gzip_ratio
在 http 块中定义含 $gzip_ratio 的日志格式:
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;注意三点:
-
$body_bytes_sent记录实际发送给客户端的字节数(含压缩后大小),是计算真实带宽消耗的核心指标 -
$gzip_ratio与$body_bytes_sent必须成对出现,才能反推原始大小:原始大小 ≈ $body_bytes_sent / (1 - $gzip_ratio)(当$gzip_ratio > 0) - 若
$gzip_ratio为-,说明本次响应未压缩,此时$body_bytes_sent就是原始大小
用日志数据估算带宽节省量
假设某天日志中提取出以下典型样本(已去重聚合):
| 文件 | 请求次数 | avg $body_bytes_sent
|
avg $gzip_ratio
|
推算原始平均大小 | 单次节省字节 | 总节省(字节) |
|---|---|---|---|---|---|---|
app.js |
12,480 | 82,300 | 0.68 | ≈ 265,484 | 183,184 | ≈ 2.29 GB |
style.css |
9,750 | 18,900 | 0.71 | ≈ 64,828 | 45,928 | ≈ 448 MB |
index.html |
24,100 | 4,200 | 0.63 | ≈ 11,351 | 7,151 | ≈ 172 MB |
计算逻辑:
原始平均大小 = $body_bytes_sent / (1 - $gzip_ratio)单次节省 = 原始平均大小 - $body_bytes_sent总节省 = 单次节省 × 请求次数
✅ 示例验证:
app.js平均压缩率 68%,发送 82.3 KB → 原始约 265.5 KB → 每次省下 183.2 KB,万次请求即省 1.8 TB 带宽(按原始未压测算)
避免误读的三个常见陷阱
-
$gzip_ratio对图片、字体、二进制文件恒为-,若gzip_types配置错误(如误加image/png),这些请求仍会进日志但无压缩效果,不能计入节省统计 - 启用了
gzip_static on且存在预生成.gz文件时,Nginx 直接返回静态压缩包,$gzip_ratio仍正常输出(因响应头含Content-Encoding: gzip),数据可信 - 若 CDN 或上游代理已压缩并返回
Content-Encoding: gzip,Nginx 不会二次压缩,$gzip_ratio仍为-(因 Nginx 未参与压缩过程),此时日志中该请求不反映本机压缩收益,需统一管控压缩入口点
快速验证压缩是否真正生效
终端执行:
curl -H "Accept-Encoding: gzip" -I https://yoursite.com/app.js | grep -i "content-encoding\|content-length"
应看到类似:
Content-Encoding: gzip Content-Length: 82300
再对比未声明 gzip 的请求:
curl -H "Accept-Encoding:" -I https://yoursite.com/app.js | grep "Content-Length"
若后者 Content-Length 显著更大(如 265484),且与日志中推算值吻合,说明 $gzip_ratio 数据真实可用。
不复杂但容易忽略

















