brotli压缩需按资源类型分级:html/css/js设为5级,json设为4级;5级比gzip高19%压缩率且解压快,4级适配小文件api响应。

直接启用 Brotli 能提升 17–25% 的文本压缩率,但光“开了”远远不够。关键在于让压缩行为匹配现代浏览器的能力、移动端弱网特性以及资源实际用途——不是压得越狠越好,而是压得准、传得快、解得稳。
选对压缩级别:HTML/CSS/JS 用 5 级,JSON 用 4 级
Brotli 压缩等级范围是 0–11,但高数值不等于高收益:
- HTML、CSS、JS 主文档建议固定设为 brotli_comp_level 5:压缩率比 gzip 高约 19%,解压耗时与 gzip 相当,主流 iOS/Android 设备解压 100KB 文本稳定低于 8ms
- API 返回的 JSON 响应设为 brotli_comp_level 4:小文件(
- 避免使用 0–1 级(压缩增益仅比 gzip 高 5–8%)和 9–11 级(压缩时间翻 3 倍,首包延迟(TTFB)显著上升,对加载速度几乎无正向作用)
窗口大小设为 256KB(lgwin=18),贴合弱网分片规律
Brotli 的 brotli_window 决定重复内容查找范围,直接影响 HTML 模板类结构的压缩效果:
- 推荐配置:brotli_window 256k(即 lgwin=18):覆盖 95% 以上跨帧重复结构,内存开销可控(
- 不建议低于 lgwin=16(64KB):含大量模板标签的 HTML 压缩率会明显下降
- 弱网典型传输分片集中在 16–64KB,256KB 窗口能兼顾查重深度与首字节响应效率
静态资源必须预压缩 + brotli_static always
动态压缩消耗 CPU,而静态资源(JS/CSS/HTML/SVG)内容不变,完全可提前处理:
- 构建阶段用
brotli -Z -q 5 *.js *.css *.html批量生成 .br 文件 - Nginx 配置中启用:brotli_static always(非 on),确保优先返回已存在的 .br 文件,零压缩延迟
- 确认 brotli_types 包含
text/html和image/svg+xml,漏掉会导致关键资源跳过压缩 - 现代 ngx_brotli 模块默认启用 Web 静态字典(含 HTML 标签、JS 关键字等),只要 comp_level ≥2 就生效,无需额外开关
与 HTTP/2 和缓存策略协同生效
Brotli 单独启用只是起点,必须嵌入完整链路才能释放全部价值:
- 确保站点已启用 HTTP/2:多路复用可消除 gzip/brotli 多文件压缩带来的头部冗余放大问题
- 对 .br 文件设置强缓存:
add_header Content-Encoding br;+expires 1y;+add_header Cache-Control "public, immutable"; - 关闭对同类资源的冗余 gzip:gzip off(现代浏览器均支持 br 且自动协商优先级),避免 Nginx 反复判断编码逻辑,徒增 CPU 开销











