配置 brotli_types 是为了精准控制仅对受益文本类型启用 Brotli 压缩,如 text/html、text/css、application/javascript、application/json、image/svg+xml 等;避免对图片、字体、PDF 等已压缩格式启用,防止 CPU 浪费与缓存混乱;并配合 brotli_min_length(推荐 1024)过滤微小响应。

配置 brotli_types 不是为了“无损压缩”(Brotli 本身就是无损算法,这点无需额外配置),而是精准控制哪些资源走 Brotli 压缩——压对了,才能真正发挥其比 Gzip 高 15–25% 的压缩优势;压错了,反而浪费 CPU、拖慢响应、甚至引发缓存混乱。
只压缩真正受益的文本类 MIME 类型
Brotli 对已压缩格式(如图片、字体、PDF)几乎无效,强行开启只会白耗服务器资源。必须显式列出明确受益的类型:
-
必加核心文本类型:
text/html、text/css、application/javascript、application/json -
常被遗漏但关键的类型:
image/svg+xml(SVG 是纯文本,压缩收益显著)、application/xml+rss、application/atom+xml -
避免加入的类型:
image/png、image/jpeg、font/woff2、application/pdf、audio/mpeg—— 这些本身已是高压缩格式,Brotli 不仅压不出多少体积,还会触发不必要的 CPU 计算
排除动态生成的小响应,设好最小长度阈值
极小响应(比如空 JSON {}、304 响应体、短错误提示)不值得压缩。启用 brotli_min_length 可避免低效开销:
- 生产环境推荐设为
1024(1KB):覆盖绝大多数有效文本资源,同时过滤掉大量微小响应 - 若服务大量 API 且 JSON 普遍较小(如 256,但需配合监控 CPU 使用率
- 切勿设为
0或1:Nginx 会对每个字节都做压缩判断,CPU 升高明显
静态资源路径下优先用预压缩 + brotli_static
对 JS/CSS/HTML 等构建产出的静态文件,应提前生成 .br 文件并启用 brotli_static on 或 always,而非依赖动态压缩:
- 构建时批量生成:
find ./dist -name "*.js" -exec brotli -q 6 -k {} \;(-k保留时间戳,利于缓存校验) - Nginx 中配
brotli_static always:强制查找.br文件,找不到才 fallback 到动态压缩(更省 CPU) - 确保
.br文件权限正确(如 Nginx worker 用户可读),否则静默失败,返回未压缩内容
与 gzip 共存时必须做类型隔离
若保留 gzip 作为兜底(兼容极老客户端),必须防止它抢在 Brotli 前响应:
- 关闭
gzip_static on:否则当app.js.gz存在时,Nginx 会直接发 gzip 版,无视客户端支持br - 精简
gzip_types至最低限度,例如仅text/plain,避免和brotli_types重叠 - 启用
brotli_vary on:确保 CDN 和浏览器将br和gzip视为不同变体,防止缓存降级或混淆

















