Nginx可同时支持静态与动态Brotli压缩:静态需预生成.br文件并启用brotli_static on,动态需关闭静态模式、开启brotli on并设置合适类型与等级,二者通过location隔离,优先匹配静态文件,不存在则回退动态压缩。

要让 Nginx 同时支持静态与动态 Brotli 压缩,关键不是“二选一”,而是明确区分两类场景并分别配置:静态资源走预压缩文件(.br)直发,动态响应走实时编码(brotli on)。两者可共存,但不能互相替代或混淆开关逻辑。
静态 Brotli 压缩:预生成 .br 文件 + brotli_static on
适用于 HTML、CSS、JS、SVG、JSON 等不常变动的文本类文件。核心是提前用 brotli 命令生成 .br 副本,Nginx 仅做文件存在性判断和响应替换。
- 先批量生成 .br 文件,例如:
find ./dist -type f \( -name "*.html" -o -name "*.js" -o -name "*.css" \) -exec brotli --quality=11 --output={}.br {} \; - 在
http或server块中启用:brotli_static on;brotli_types text/plain text/css application/javascript application/json image/svg+xml; - 确保对应路径下存在
main.js.br或style.css.br等真实文件,否则 Nginx 会跳过并尝试动态压缩(若已开启)或不压缩
动态 Brotli 压缩:实时编码 + brotli on + brotli_static off
适用于 API 返回、PHP/Node 渲染页、模板变量注入后的 HTML 等每次响应内容不同的场景。Nginx 在发送前实时压缩响应体,不依赖磁盘文件。
- 必须关闭静态模式:
brotli_static off;(设为on会完全绕过动态压缩) - 开启动态压缩:
brotli on;brotli_types application/json text/plain text/html;(按需补充 MIME 类型) - 合理设置压缩等级:
API 接口推荐brotli_comp_level 3–5,平衡延迟与带宽;
后台管理页等低并发场景可设至6–7 - 避免无效开销:
brotli_min_length 20;(小于 20 字节的响应不压缩)
静态与动态共存的典型组合配置
生产环境推荐“Brotli 静态预压 + Gzip 动态兜底”双层架构,但若坚持纯 Brotli 动静混合,可这样组织:
- 全局启用基础参数(放在
http块):brotli on;<br>brotli_static on;<br>brotli_types text/plain text/css application/javascript application/json image/svg+xml;
- 在特定
location中覆盖为动态模式(如 /api/):location /api/ {<br> brotli_static off;<br> brotli_comp_level 4;<br> brotli_types application/json text/plain;<br>} - 注意:同一请求不会同时触发静态和动态压缩。Nginx 优先查 .br 文件;查不到且
brotli_static off时才走实时编码
验证是否生效的关键点
光写配置没用,必须逐项确认:
- 用
nginx -V 2>&1 | grep ngx_brotli确认模块已加载 - HTTPS 下测试(HTTP 请求中浏览器不发
Accept-Encoding: br) - 用 curl 检查响应头:
curl -I -H "Accept-Encoding: br" https://yoursite.com/main.js→ 应返回Content-Encoding: brcurl -I -H "Accept-Encoding: br" https://yoursite.com/api/data→ 同样应有br头 - 若静态资源没压缩,检查对应 .br 文件是否存在;若动态接口没压缩,检查是否误设了
brotli_static on或漏写了brotli_types


















