$sent_http_content_encoding 是 Nginx 记录实际响应 Content-Encoding 值的内置变量,用于精准统计 gzip 与 brotli 真实启用比例;需在 log_format 中引入并配合 access_log 使用,再通过 awk 分析日志得出压缩类型分布。

$sent_http_content_encoding 是 Nginx 日志中一个内置变量,它记录了响应头中实际发送的 Content-Encoding 值(如 gzip、br、空值等)。利用它,你可以客观统计真实用户请求中 Gzip 与 Brotli 的实际启用比例,而非依赖配置是否开启——因为最终是否压缩,还取决于客户端支持、资源类型、大小、预压缩文件是否存在、模块是否加载成功等多重因素。
如何配置日志格式以捕获压缩类型
在 Nginx 主配置(通常是 /www/server/nginx/conf/nginx.conf 或宝塔面板的全局配置)的 http 块中,定义一个含 $sent_http_content_encoding 的日志格式:
log_format compression '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$sent_http_content_encoding"';然后在 server 或 location 块中应用该格式:
access_log /www/wwwlogs/your-site.com-compression.log compression;
✅ 注意:
$sent_http_content_encoding只在响应头真正发出后才被赋值,所以它反映的是最终生效的编码方式,包括未压缩(为空)、gzip、br、甚至deflate(极少见)。
如何分析日志统计使用率
用 Linux 命令快速统计近24小时压缩分布(假设日志按天轮转):
# 统计所有非空 Content-Encoding 类型及出现次数
awk '{print $12}' /www/wwwlogs/your-site.com-compression.log | sort | uniq -c | sort -nr
# 单独看 gzip 和 br 的占比(忽略空值)
awk '$12 ~ /^(gzip|br)$/{count[$12]++} END{total=count["gzip"]+count["br"]; print "gzip:", count["gzip"], "(" int(count["gzip"]/total*100) "%)"; print "br:", count["br"], "(" int(count["br"]/total*100) "%)"}' /www/wwwlogs/your-site.com-compression.log输出示例:
gzip: 12845 (63%) br: 7521 (37%)
⚠️ 若出现大量空值(即
$12为空),说明大量响应未压缩——需检查gzip_min_length、brotli_min_length是否设得过高,或gzip_types/brotli_types是否漏配关键 MIME 类型(如application/json)。
结合 DevTools 验证典型请求是否命中预期
日志统计是宏观视角,但单点验证不可少:
- 打开 Chrome DevTools → Network 标签页
- 刷新页面,筛选一个 JS/CSS/HTML 文件
- 查看响应头中的
Content-Encoding字段 - 同时确认
Vary: Accept-Encoding是否存在(Brotli/Gzip 共存时必须有,否则 CDN 或代理可能缓存错版本) - 对比
Content-Length:若为.br文件,应明显小于原始体积;若为动态压缩,可对比未开启压缩时的大小
常见偏差原因排查(为什么日志显示 br 很少?)
-
Brotli 模块未真正加载:
nginx -V 2>&1 | grep brotli无输出 → 编译缺失或load_module路径错误 -
.br文件缺失或权限不足:brotli_static on时,Nginx 不报错也不降级,只静默跳过 -
brotli_types与实际返回 MIME 不匹配:例如后端返回text/javascript,但配置写的是application/javascript(Chrome 已弃用前者) -
CDN 或反向代理覆盖了
Accept-Encoding:上游(如 Cloudflare)未透传br,或强制回退到gzip -
PHP/Node.js 等后端已自行压缩:导致 Nginx 层跳过压缩(
Content-Encoding已存在时,Nginx 不会二次压缩)
不复杂但容易忽略

















