$gzip_ratio是nginx记录响应体压缩前后体积比的内置日志变量,值为compressed_body_size/original_body_size,仅压缩时有效,需在log_format中显式引用并配置access_log启用。

$gzip_ratio 是 Nginx 内置的一个日志变量,用于记录单次响应中 Gzip 压缩前后的体积比值,以小数形式表示(如 0.32 表示压缩后为原始大小的 32%,即节省了 68% 的传输带宽)。它不直接输出百分比,而是返回 压缩后字节数 / 压缩前字节数,因此数值越小,压缩收益越高。
怎么启用 $gzip_ratio 日志记录
该变量仅在响应实际经过 Gzip 压缩时有值;若未压缩(如文件太小、MIME 类型不匹配、客户端不支持等),其值为空或“-”。要在 access log 中记录它,需在 log_format 中显式引用:
- 在
http块中定义带$gzip_ratio的日志格式:
' $status $body_bytes_sent "$http_referer" '
' "$http_user_agent" "$http_accept_encoding" $gzip_ratio;'
- 然后在
server或location中使用该格式:
重启或重载 Nginx 后,日志行末尾就会出现类似 0.28、0.41 或 - 的值。
$gzip_ratio 的真实含义与常见误区
它反映的是「本次 HTTP 响应体」在 Nginx 内部压缩前后的字节比,计算逻辑为:
gzip_ratio = compressed_body_size / original_body_size- 不是“压缩率”(compression ratio),后者通常定义为
(original − compressed) / original,即节省比例;$gzip_ratio 是它的补数 - 不包含响应头(headers)大小,只统计
body部分 - 对未压缩响应(如图片、小文本、禁用场景)返回空字符串或短横线
-,不可直接参与数值统计 - 若启用了
gzip_vary on,且缓存层(如 CDN 或代理)复用压缩结果,Nginx 仍会如实记录该变量——因为它是响应发出前计算的,与是否命中缓存无关
如何用 $gzip_ratio 评估带宽节省效果
单纯看单个值意义有限,关键在于聚合分析。例如:
- 统计某类资源(如
.js)的平均$gzip_ratio:若长期稳定在0.25,说明 JS 文件平均压缩至原大小的 1/4,带宽节省约 75% - 对比不同
gzip_comp_level下的分布:级别 4 下中位数为0.31,级别 6 下为0.27,可量化多花 CPU 换来的额外 4 个百分点收益 - 识别异常:发现大量
.json接口返回-,可能因gzip_min_length设得过高(如设为2k),而分页接口返回体常为1.2k,导致本可压缩的响应被跳过 - 监控趋势:某天起
$gzip_ratio整体上浮(如从0.28 → 0.35),可能因前端引入大量 Base64 图片内联到 HTML 中,使 HTML 原始体积膨胀且压缩率下降
配合其他变量提升分析价值
单独使用 $gzip_ratio 容易误判,建议组合以下变量共同分析:
-
$bytes_sent:实际发送字节数(含 header + compressed body),用于验证压缩是否真正降低总流量 -
$body_bytes_sent:仅响应体字节数(压缩后),与$gzip_ratio相乘可反推原始体大小(当 ratio 非空时) -
$http_accept_encoding:确认客户端是否声明支持 gzip,排除因 UA 不兼容导致的未压缩 -
$request_length和$request_time:观察高 ratio 是否伴随更长处理时间(可能暗示 CPU 成为瓶颈)











