Nginx 不提供 Brotli 文件完整性校验机制;验证分两方面:一是动态压缩需比对解压后与原始文件哈希值是否一致,二是预压缩文件需检查格式合法性、内容一致性及读取权限。

Nginx 本身不提供 Brotli 压缩后文件的“完整性校验”机制——它不会自动计算或比对 .br 文件的哈希值,也不在响应中附带校验摘要(如 Digest 头)。所谓“验证 Brotli 压缩后的文件完整性”,实际是指两件事:
✅ 确认 Nginx 返回的 .br 文件内容与原始文件解压后完全一致(即无损坏、无截断);
✅ 验证预生成的 .br 文件(用于 brotli_static on)未被篡改、权限正确、格式合法。
下面分场景说明怎么做:
确认动态压缩输出是否完整(brotli on; brotli_static off)
这是最常见场景。Nginx 实时压缩响应体,无需预存 .br 文件。验证重点是:压缩-传输-解压全过程无损。
-
用
curl获取压缩响应并本地解压比对:
linux-performance-analyzer下载Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
# 请求一个 JS 文件,强制走 Brotli curl -H "Accept-Encoding: br" -s https://yoursite.com/app.js > app.js.br # 安装 brotli 命令行工具(Ubuntu/Debian) sudo apt install brotli # 解压并保存为原始格式 brotli -d app.js.br -o app.js.decompressed # 与原始未压缩文件对比(需提前下载原始 app.js) sha256sum app.js app.js.decompressed # 两个哈希值必须完全一致
验证预压缩 .br 文件是否有效且未损坏(brotli_static on)
此时 Nginx 直接发送磁盘上的 .br 文件,完整性依赖构建阶段和文件系统。
- 检查
.br文件能否被正常解压:brotli -t app.js.br # 返回 0 表示格式合法、未损坏
- 核对
.br文件与源文件的逻辑一致性(推荐脚本化):# 下载原始文件 + 解压 .br + 比对内容 curl -s https://yoursite.com/app.js > app.js.origin brotli -d app.js.br -o app.js.frombr cmp app.js.origin app.js.frombr || echo "内容不一致!"
- 检查文件权限:确保 Nginx worker 进程(通常是
www-data或nginx用户)有读取.br文件的权限:ls -l app.js.br # 应显示类似 -rw-r--r-- 1 www-data www-data ...
通过响应头和日志交叉验证是否真走 Brotli 路径
避免“以为启用了,其实没生效”的假象:
- 查看响应头是否含
Content-Encoding: br且状态码为 200:curl -I -H "Accept-Encoding: br" https://yoursite.com/app.js # 必须看到:Content-Encoding: br # 若返回 404 或无该头,说明 .br 文件缺失、路径不对或 `brotli_static` 未命中
- 启用
$brotli_ratio日志变量(仅动态压缩生效):
在http{}块中添加:log_format brotli '$remote_addr "$request" $status $body_bytes_sent brotli=$brotli_ratio'; access_log /var/log/nginx/brotli.log brotli;
日志中
brotli=1.0表示未压缩(可能因大小低于brotli_min_length),brotli>1.0才说明成功压缩且数据完整。
不需要额外签名或 checksum 机制,只要原始文件可信、.br 文件由标准工具生成、Nginx 正确读取并透传,Brotli 解压结果就具备字节级完整性。

















