Nginx Brotli自动化部署闭环包含三步:模块存在性检查(校验nginx -V输出含brotli并确认load_module)、构建时预生成.br/.gz双格式文件(如VITE_COMPRESSION=brotli)、Nginx配置精准注入(启用brotli_static always、注释gzip on、执行nginx -t与reload)。

要在自动化部署脚本中为 Nginx 无缝生成安全、可用的 Brotli 压缩配置,核心不是“写对几行 conf”,而是把三件事串成可验证、可回滚、不依赖人工干预的闭环:模块存在性检查 → 构建时预压缩文件生成 → Nginx 配置自动注入与冲突规避。下面分三步讲清楚关键动作和避坑点。
确保 Nginx 已加载 ngx_brotli 模块(脚本必须校验)
自动化脚本不能假设模块已就位。每次部署前应强制校验:
- 执行
nginx -V 2>&1 | grep -q 'brotli',失败则中止并报错“ngx_brotli module missing” - 若使用动态模块(推荐),确认
load_module指令已在nginx.conf开头正确加载(如load_module /usr/lib/nginx/modules/ngx_http_brotli_filter_module.so;) - Docker 环境需在构建阶段完成模块编译与安装,不能靠运行时“临时加”;镜像基础层应固化
libbrotli1和模块 so 文件
构建阶段生成 .br 文件并保留 .gz 降级(Vue/Vite 项目为例)
前端构建工具需输出双格式压缩文件,Nginx 才能按浏览器能力自动选择。脚本中应控制构建行为:
- 设置环境变量:
VITE_COMPRESSION=brotli(vite-plugin-compression 或 vite-plugin-brotli 默认支持) - 确保构建产物目录(如
dist/)同时存在app.js、app.js.br、app.js.gz—— 脚本可用find dist -name "*.br" | head -1校验 - 禁用构建时的 gzip 插件冲突(例如 vite-plugin-compression 若启用,需设
disable: true当VITE_COMPRESSION=brotli)
Nginx 配置注入要关闭 gzip 冲突并启用静态优先
直接追加 brotli on; 很危险:若已有 gzip on;,两者会竞争,部分请求可能被 gzip 截断或返回空响应。脚本应精准替换或注释旧指令:
- 用 sed 或 awk 定位
http {块,在其后第一处空白行插入完整 brotli 配置段 - 关键参数必须包含:
brotli_static always;(优先读 .br 文件)、brotli_types显式列出 MIME 类型(避免text/plain漏掉)、brotli_min_length 512;(防小文件负优化) - 主动注释或删除同作用域内的
gzip on;行(保留gzip_types和gzip_vary可选,但gzip主开关必须关) - 最后执行
nginx -t && nginx -s reload,失败则自动回滚配置文件(建议提前cp nginx.conf nginx.conf.bak.$(date +%s))
整个流程无需人工介入判断,每一步都有明确 exit code 和日志标记。只要构建产物和 Nginx 模块就绪,脚本跑完就能生效,且所有操作可审计、可复现。


















