Brotli在宝塔中需编译Nginx并加载ngx_brotli模块才生效,仅开关或配置brotli on无效;验证须执行nginx -V | grep ngx_brotli,且配置必须置于http块内、指定完整types并重启Nginx。

Brotli 在宝塔面板里不是开关一开就生效的功能,必须让 Nginx 加载 ngx_brotli 模块,且重编译后 service nginx restart 才算真正启用——只 reload 配置或改几行 brotli on 是没用的。
确认当前 Nginx 是否支持 Brotli 模块
直接执行:nginx -V 2>&1 | grep -o ngx_brotli。如果无输出,说明模块未编译进二进制;若返回 ngx_brotli,再检查 /www/server/nginx/sbin/nginx -t 是否通过,避免配置语法错误掩盖模块缺失问题。注意:宝塔「极速安装」版 Nginx 默认不支持自定义模块,必须是「编译安装」版才能加 Brotli。
手动编译 ngx_brotli 模块(不卸载现有 Nginx)
适合已稳定运行、不想中断服务、且熟悉 Nginx 编译流程的用户。关键点是复用原参数,只追加模块路径:
- 先备份:
cp /www/server/nginx/sbin/nginx /www/server/nginx/sbin/nginx.bak - 拉取模块:
cd /www/server && git clone https://github.com/google/ngx_brotli.git,然后cd ngx_brotli && git submodule update --init - 查原编译参数:
nginx -V 2>&1 | grep "configure arguments:",复制整行(含所有--with-xxx和--add-module=) - 下载对应 Nginx 源码(版本号必须完全一致,如
1.24.0),解压后进入目录,执行./configure [你复制的全部参数] --add-module=/www/server/ngx_brotli -
make(不要make install),完成后替换二进制:cp objs/nginx /www/server/nginx/sbin/nginx
nginx.conf 中启用 Brotli 的真实生效条件
配置必须放在 http{} 块内(不是 server{} 或 location{}),且需显式声明压缩类型与级别:
-
brotli on;—— 必须写,off或注释掉即无效 -
brotli_comp_level 5;—— 推荐 4–6,1基本不压,11会卡住响应,Nginx 1.24 下设成7+可能触发 worker 进程超时 -
brotli_types要覆盖现代资源:text/plain text/css application/javascript application/json text/html image/svg+xml;漏掉application/javascript就压不了 ES6+ JS -
brotli_static off;—— 别设always,除非你真用脚本定期跑brotili -Z -q 5 xxx.js -o xxx.js.br并确保文件同名同目录,否则 404 风险高
验证 Brotli 是否真在工作
别只看响应头有没有 content-encoding: br,还要确认三件事:
- 用 Chrome 或 Edge 访问,F12 → Network → 点一个 JS/CSS 文件 → Headers → Response Headers 里
content-encoding是br,且content-length明显小于 gzip 同资源 - 检查
curl -I -H "Accept-Encoding: br" https://yoursite.com/test.js返回头是否含content-encoding: br,排除浏览器缓存干扰 - 如果返回
gzip或空,大概率是 Nginx 没重启(service nginx restart,不是 reload)、brotli_types漏了 MIME 类型、或客户端(比如 Safari br 在 Accept-Encoding 里
最常被忽略的一点:Brotli 不压缩动态 PHP 输出(除非你在 PHP 层额外调用 ob_deflatehandler),它只作用于 Nginx 直接响应的静态文件和 proxy_pass 后带 Vary: Accept-Encoding 头的上游响应。如果你的 HTML 是 PHP 生成的,默认不会被 Brotli 压缩。











