需先确认Nginx已编译Brotli模块,未集成则须手动编译安装;压缩级别应分层设置:动态内容用1–4级,前端产物用5–6级,静态资源预压缩并设8–11级;brotli_static需配合预先生成.br文件且MIME严格匹配;必须保留gzip兜底以兼容老旧客户端。

要在Nginx中用Brotli压缩提升带宽利用率,同时避免CPU负载明显上升,关键不是“开开关”,而是精准控制压缩行为——尤其要避开高耗时操作、区分资源类型、善用预压缩,并保留gzip兜底。
必须先确认模块已编译,否则配置无效
Brotli不是Nginx内置功能。apt或宝塔一键安装的Nginx默认不含该模块。执行以下命令验证:
- nginx -V 2>&1 | grep with-http_brotli_module —— 无输出说明未集成
- 若缺失,需手动编译:克隆
ngx_brotli,递归更新子模块,用cmake -DBUILD_SHARED_LIBS=OFF构建brotli静态库,再在./configure中加入--add-module=/path/to/ngx_brotli - 编译后务必重装并重启,不能仅覆盖二进制文件
压缩级别按资源类型分层设置
统一设brotli_comp_level 11会显著拖慢TTFB,尤其在API网关或高QPS场景下。实测建议如下:
-
动态内容(HTML/JSON接口):用
1–4级。压缩耗时降60%,压缩率仍优于gzip 9级 -
前端打包产物(js/css):设
5–6级。兼顾压缩率(~63%)与响应延迟,iOS/Android解压稳定低于8ms -
长期不变的静态资源(SVG、字体、reset.css):配合
brotli_static on,设8–11级并预生成.br文件
启用预压缩 + 合理配置brotli_static
brotli_static on不等于自动压缩,它只检查同名.br文件是否存在。若没提前生成,请求直接跳过Brotli,也不fallback。
- 构建阶段生成.br:Vite项目加
vite-plugin-compression,Webpack用compression-webpack-plugin,指定algorithm: 'brotliCompress' - Nginx中
brotli_types必须与.br文件实际MIME严格一致,例如application/javascript不能写成text/javascript - .br文件权限需为Nginx worker可读(如
chmod 644),否则静默失败,日志无提示
保留gzip作为兼容性兜底
即使现代浏览器支持率超98%,仍需开启gzip:
- 在
http块中同时配置gzip on和brotli on,顺序无关 - 客户端发
Accept-Encoding: br,gzip时,Nginx优先返回br;若只发gzip或空头,则走gzip - 禁用gzip只留brotli,会导致部分老旧爬虫、监控工具、内网HTTP客户端无法解析响应
不复杂但容易忽略。











