预生成 .br 文件是 Nginx 使用 Brotli 的最佳实践:构建阶段产出所有目标静态资源的 .br 文件并保留原文件,Nginx 配置需在 http 或 server 块顶层启用 brotli_static always、brotli_types 并关闭 gzip,确保零 CPU 开销、首字节更快且兼容缓存与 Range 请求。

直接发送预生成的 .br 文件是 Nginx 使用 Brotli 的最佳实践——它不走实时压缩,零 CPU 开销,首字节更快,且完全兼容 HTTP 缓存与 Range 请求(对原始文件)。关键在于构建阶段产出文件 + Nginx 精准配置,二者缺一不可。
构建时必须生成 .br 文件
所有目标静态资源(.js、.css、.html、.svg、.json)需在打包环节同步输出同名 .br 文件,并保留原始文件。
- Vite 项目推荐
vite-plugin-compression,设algorithm: 'brotliCompress'、ext: '.br'、threshold: 10240(≥10KB 才压,避免小文件负优化) - Webpack 用
compression-webpack-plugin,同样指定algorithm: 'brotliCompress',确保main.js和main.js.br同时存在于输出目录 - 纯静态站点可用命令批量处理:
find dist -type f \( -name "*.js" -o -name "*.css" -o -name "*.html" \) -exec brotli -q 6 -k {} \;,其中-k保留原始时间戳,防止 Nginx 因时间不一致降级
Nginx 配置必须放在顶层且关闭 gzip
brotli_static 不能写在 location 块里,也不和 gzip_static 共存。它必须在 http{} 或 server{} 块顶部启用,并显式关闭 gzip 相关指令。
- 在
http{}块中写:brotli_static always;(比on更严格,强制只返回 .br 文件,不回落) - 必须声明支持类型:
brotli_types text/html text/css application/javascript image/svg+xml application/json;,漏掉text/html就会导致首页不走 Brotli - 务必添加:
gzip off;—— 否则现代浏览器发起Accept-Encoding: br,gzip请求时,Nginx 可能触发冗余判断逻辑,导致 TTFB 升高或意外降级
验证是否真正命中 .br 文件
配置生效 ≠ 实际返回 .br。要确认最终响应头和内容是否匹配预期。
- 用 curl 测试:
curl -H "Accept-Encoding: br" -I https://yoursite.com/app.js,响应中应含Content-Encoding: br,且Content-Length明显小于未压缩版本 - 检查 Nginx 是否加载模块:
nginx -V 2>&1 | grep ngx_brotli,无输出说明模块未就绪,需换用预编译镜像(如tiangolo/nginx-brotli)或重编译 - 确认文件路径可读:Nginx 的
root或alias必须指向包含.br文件的物理目录,且文件权限允许 Nginx 用户(如www-data)读取
不复杂但容易忽略:预压缩不是“开了就能用”,而是构建、路径、配置、模块四者严丝合缝的结果。


















