nginx无“brotli压缩命中率”指标,监控核心是验证压缩是否按条件触发、实际生效且效果达标;通过日志变量(如$brotli_ratio)、统计压缩生效率、结合响应头content-encoding: br三步落地。

Nginx 本身不提供“Brotli 压缩命中率”这类内置指标,所谓监控,核心是验证压缩是否按条件触发、实际生效、效果达标。重点不在“有没有压”,而在“该压的压没压、压得够不够、有没有白压”。以下是可直接落地的日志监控与传输效率分析方法。
配置带压缩指标的专用日志格式
在 `http{}` 块中定义含 Brotli 关键变量的日志格式,确保每条访问记录自带压缩行为证据:log_format brotli '$remote_addr [$time_local] "$request" '
'$status $body_bytes_sent '
'brotli=$brotli_ratio '
'orig=$request_length '
'sent=$bytes_sent '
'ua="$http_user_agent"';
access_log /var/log/nginx/brotli.log brotli;
关键字段说明:
-
$brotli_ratio:原始响应体大小 ÷ 压缩后大小(>1 表示压缩生效;=1 表示未压缩;缺失值通常表示未匹配brotli_types或客户端不支持br) -
$body_bytes_sent:纯响应体字节数(不含响应头),最能反映压缩收益 -
$bytes_sent:含响应头的总发送字节数,用于交叉验证 -
$request_length:请求头+体总长,辅助判断是否因请求过小被跳过(如健康检查探针)
✅ 示例有效压缩日志:
10.0.2.5 [25/Sep/2026:07:42:11 +0000] "GET /static/main.js HTTP/1.1" 200 89242 brotli=4.1 orig=365800 sent=89242 ua="Mozilla/5.0..."
→ brotli=4.1 明确表明压缩比达 4.1 倍,orig=365800(约 366KB)压缩为 sent=89242(约 89KB),效果清晰可见。
用日志快速统计压缩覆盖率与异常类型
通过 `awk` 对日志做轻量聚合,无需额外工具即可掌握压缩执行情况:-
统计最近 10,000 条中压缩生效比例(即
brotli_ratio > 1):awk '$10 > 1 {hit++} NR -
找出本应压缩却未生效的资源(如
.js、.css文件brotli_ratio == 1):awk '$10 == 1 && $4 ~ /\.(js|css|svg|json)$/ {print $4}' /var/log/nginx/brotli.log | sort | uniq -c | sort -nr→ 若发现大量
main.js或app.css出现在结果里,说明brotli_types配置漏掉了对应 MIME 类型,或资源体积 brotli_min_length(默认 20 字节)。 -
查看低效压缩(
brotli_ratio接近 1.0 但 >1):awk '$10 > 1 && $10 <p>→ 可能原因:资源本身已高度压缩(如 minified JS 中混入 base64 图片)、或 <code>brotli_comp_level</code> 过低(如设为 1–2)。</p>
结合响应头验证真实传输效果
日志中的 `brotli_ratio` 是服务端计算值,最终是否真正节省带宽,要看客户端实际收到什么。需确认两点:-
响应头是否含
Content-Encoding: br
用curl -I抽样检查关键资源:curl -I -H "Accept-Encoding: br" https://yoursite.com/static/app.js
✅ 正常应返回:
Content-Encoding: br Vary: Accept-Encoding
-
对比压缩前后字节数是否与日志一致
同一请求分别加/不加Accept-Encoding: br头,用curl -s -w "%{size_download}\n"获取下载字节数:# 支持 br 时 curl -s -H "Accept-Encoding: br" -w "%{size_download}\n" -o /dev/null https://yoursite.com/static/app.js # 不支持时(模拟旧客户端) curl -s -H "Accept-Encoding: gzip" -w "%{size_download}\n" -o /dev/null https://yoursite.com/static/app.js→ 两数差值即为 Brotli 实际节省的字节数,可与日志中
orig - sent交叉校验。
识别无效压缩与资源误伤
Brotli 对已压缩资源(如 JPG、PNG、WebP、字体二进制文件)不仅无益,还徒增 CPU 开销。需主动过滤:-
确保
brotli_types不包含以下 MIME 类型:-
image/jpeg,image/png,image/webp,image/avif -
font/woff,font/woff2,application/font-woff -
application/octet-stream(泛类型,易误伤)
-
-
检查日志中是否存在
brotli_ratio == 1但请求路径含.jpg或.woff2:awk '$10 == 1 && $4 ~ /\.(jpg|jpeg|png|webp|woff2)$/ {print $4, $10}' /var/log/nginx/brotli.log | head -5→ 若有输出,说明该资源被纳入了压缩流程但未生效,属配置冗余,应从
brotli_types中移除。
不复杂但容易忽略











