启用Brotli静态预压需三要素齐备:确认ngx_brotli模块已加载、构建时生成同名.br文件、在http或server块顶层配置brotli_static on/always并关闭gzip,否则降级回原始文件。

要在 Nginx 中启用 Brotli 静态预压(即直接读取已构建好的 .br 文件),关键不是让 Nginx 实时压缩,而是让它“发现就发、不压不等”。这需要三方面严丝合缝:模块支持、文件存在、配置精准。
确认 ngx_brotli 模块已加载
这是前提,缺一则全失效:
- 运行
nginx -V 2>&1 | grep -o ngx_brotli,有输出才说明模块可用;无输出需换用含该模块的镜像(如tiangolo/nginx-brotli)或重编译 - 注意:
brotli_static和gzip_static互斥,不能共存于同一location块内 - 确保 Nginx 启动用户对
.br文件有读权限,且文件与原始文件在同一目录、同名(如app.js和app.js.br)
构建阶段生成标准 .br 文件
压缩必须在打包时完成,运行时不参与计算:
- Vite 项目推荐
vite-plugin-compression,设algorithm: 'brotliCompress'、ext: '.br'、threshold: 10240(≥10KB 才压) - Webpack 可用
compression-webpack-plugin,同样指定algorithm: 'brotliCompress',并确保deleteOriginalAssets: false - 纯静态站点可用 CLI 批量处理:
find dist -type f \( -name "*.js" -o -name "*.css" -o -name "*.html" -o -name "*.svg" \) -exec brotli -q 6 -k {} \;,其中-k保留时间戳,避免缓存误判
Nginx 配置 brotli_static 的正确写法
配置位置和参数非常关键,错一处就降级回原始文件:
-
brotli_static on;或更严格的brotli_static always;必须放在http{}或server{}块顶层,不能写在 location 内 - 必须显式声明 MIME 类型:
brotli_types text/html text/css application/javascript image/svg+xml application/json;,漏掉text/html就会导致首页不走 Brotli - 务必关闭 gzip 干扰:
gzip off;(或至少注释所有gzip_*指令),否则浏览器协商逻辑可能混乱,TTFB 反而升高
验证是否真正命中 .br 文件
别只看配置,要实测响应头:
- 用 curl 检查:
curl -H "Accept-Encoding: br" -I https://yoursite.com/app.js - 成功响应应包含:
Content-Encoding: br,且Content-Length明显小于未压缩版本 - 浏览器 DevTools 的 Network 面板中,查看响应头和文件大小,对比同路径未带
br请求的行为


















