Nginx可通过$sent_http_content_encoding变量在access log中明确标识Brotli压缩是否实际发生:值为"br"表示启用,空字符串表示未压缩;需配合自定义log_format及access_log指令使用,且仅适用于Nginx≥1.13.5。

Nginx 本身不提供原生字段记录 Brotli 压缩是否实际发生、压缩比或传输字节数。它没有类似 $gzip_ratio 的内置变量对应 Brotli(如 brotli_ratio),也没有 $upstream_http_content_encoding 这类直接反映响应编码方式的可靠日志变量——因为 Content-Encoding 是响应头,而 Nginx 日志模块在写入时通常无法动态捕获已发送的响应头值(尤其当启用缓冲或代理时)。
但你可以通过间接、可靠且生产可用的方式,在 access log 中明确标识“本次响应是否使用了 Brotli 压缩”,核心思路是:利用 $sent_http_content_encoding 变量 + 条件日志格式。
✅ 推荐做法:用 $sent_http_content_encoding 区分压缩类型
该变量在响应头发出后可被读取(Nginx ≥1.13.5 支持),能真实反映最终返回给客户端的 Content-Encoding 值(如 br、gzip 或空)。
1. 定义带标记的日志格式
在 http{} 块中添加:
log_format brotli_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$sent_http_content_encoding"';⚠️ 注意:
$sent_http_content_encoding只在响应头已确定后才有效,因此必须确保它出现在log_format中,且该格式用于access_log指令(不能用于error_log)。
2. 在 server 或 http 块中启用该日志
access_log /var/log/nginx/access.log brotli_log;
3. 查看效果(示例日志行)
192.168.1.100 - - [30/Sep/2026:21:22:15 +0000] "GET /app.js HTTP/2.0" 200 12487 "-" "Mozilla/5.0" "br" 192.168.1.100 - - [30/Sep/2026:21:22:16 +0000] "GET /logo.png HTTP/2.0" 200 5621 "-" "Mozilla/5.0" "" 192.168.1.100 - - [30/Sep/2026:21:22:17 +0000] "GET /api/data.json HTTP/2.0" 200 892 "-" "curl/7.81.0" "br"
-
"br"→ 表示该响应确实启用了 Brotli 压缩并成功返回 -
""(空字符串)→ 表示未压缩,或压缩被跳过(如小文件、MIME 类型不匹配、客户端未申明 <code>Accept-Encoding: br)
? 补充验证建议(辅助判断压缩是否生效)
仅靠日志还不够?配合以下方法交叉确认:
检查请求头是否含
Accept-Encoding: br
可加字段到日志:"$http_accept_encoding",用于排查客户端是否支持-
确认资源满足压缩条件
确保同时满足:-
brotli on;已启用(且gzip off;或至少gzip_types不重叠) - 响应 MIME 类型在
brotli_types列表中(如application/javascript) - 响应体长度 ≥
brotli_min_length(默认仅 20 字节,强烈建议设为1024) -
brotli_static off;(动态压缩场景)或.br文件存在且权限正确(静态场景)
-
-
用 curl 快速验证单个资源
curl -I -H "Accept-Encoding: br" https://yoursite.com/app.js # 应看到:Content-Encoding: br
❌ 不推荐的做法(常见误区)
- 用
$gzip_ratio类推写$brotli_ratio→ Nginx 不提供该变量,会报错或留空 - 在
log_format中写$upstream_http_content_encoding→ 仅对代理后端有效,且不一定等于最终响应头 - 依赖
map模块模拟判断(如根据$http_accept_encoding和$sent_http_content_type)→ 逻辑脆弱,无法反映真实是否压缩(例如因brotli_min_length未达标而跳过)
小结
| 目标 | 实现方式 |
|---|---|
| 日志中明确标识 Brotli 是否启用 | 使用 $sent_http_content_encoding + 自定义 log_format
|
| 区分 Brotli / Gzip / 无压缩 | 日志中该字段显示 br / gzip / 空字符串 |
| 排查为何没压缩 | 结合 $http_accept_encoding、$sent_http_content_type、响应大小和配置条件综合分析 |
这样配置后,你就能在标准访问日志里一眼看出哪些请求真正受益于 Brotli,方便监控、统计和优化决策。


















