关键在于区分动态压缩与静态预压缩:动态压缩(brotli on)用于API等不可预生成内容,静态预压缩(brotli_static on)优先返回已构建的.br文件,二者互补兜底;必须确保ngx_brotli模块已编译进Nginx且brotli_types明确包含text/html等关键MIME类型。

要让 Nginx 同时支持 Brotli 动态压缩和静态预压缩文件分发,关键在于明确区分两种模式的触发条件,并避免配置冲突。动态压缩用于无法预生成的响应(如 API 返回、模板渲染内容),而静态预压缩(.br 文件)专为构建产出的 JS/CSS/HTML 等资源服务——二者不是互斥,而是互补兜底关系。
必须先确保 ngx_brotli 模块已加载
动态压缩和 brotli_static 都依赖该模块。验证方式:
- 运行
nginx -V 2>&1 | grep with-http_brotli_module,有输出才表示模块就绪 - 若无输出,需换用预编译镜像(如
tiangolo/nginx-brotli)或重编译 Nginx - 注意:仅安装
libbrotli库不够,Nginx 必须显式集成模块
静态预压缩:优先返回 .br 文件
这是零开销、首字节最快的方式,适用于构建阶段可确定的资源:
- 在
http{}或server{}块顶层启用:brotli_static on;(推荐)或brotli_static always;(强制只发 .br,不回落) - 必须声明类型:
brotli_types text/html text/css application/javascript image/svg+xml application/json;,漏掉text/html就会导致首页不走 Brotli - 保留原始文件与同名
.br文件共存于同一目录(如app.js和app.js.br) - 关闭 gzip:
gzip off;,否则浏览器带br,gzip头时可能引发冗余判断、TTFB 升高
动态压缩:兜底处理未预压缩的响应
当请求目标没有对应 .br 文件(如后端接口、动态 HTML 模板)时,靠动态压缩保障传输效率:
- 启用动态压缩:
brotli on;(必须显式开启) - 设压缩级别:
brotli_comp_level 4;~6;(动态场景不建议用 11,会拖慢响应) - 设置最小长度:
brotli_min_length 256;(跳过极小响应,如空 JSON 或 304) -
禁用静态查找:
brotli_static off;(此条仅在纯动态场景下使用;若同时启用了brotli_static on,则该指令可省略,因静态优先机制天然覆盖动态)
验证是否按预期工作
配置生效 ≠ 实际命中。需逐项确认:
- 对静态资源测试:
curl -H "Accept-Encoding: br" -I https://yoursite.com/main.js,响应头应含Content-Encoding: br且Content-Length明显更小 - 对动态接口测试(如
/api/data):同样用-H "Accept-Encoding: br",观察是否返回br编码,且响应体大小下降 - 检查文件权限:Nginx 工作用户(如
www-data)必须能读取.br文件所在目录 - 确认路径映射正确:Nginx 的
root或alias指向包含.br文件的真实物理路径


















