全站启用Brotli压缩算法替代Gzip提升Web加载速度

Brotli压缩算法比Gzip压缩率高20%-30%,尤其在文本资源上表现更优。本文从原理对比出发,给出Nginx/Apache/CDN全站启用Brotli的完整配置、验证方法、风险控制与回滚方案,帮助开发者在真实生产环境中安全切换,让用户感知到更快的首屏加载。

全站启用Brotli压缩算法替代Gzip提升Web加载速度
封面图:ZuCDN · ZuCDN 原创

为什么Gzip不再是唯一选择

Web性能优化中,压缩是成本最低、收益最明显的一环。Gzip统治HTTP压缩领域超过二十年,几乎所有服务器和浏览器都支持。但随着前端资源体积膨胀(JavaScript包动辄数MB),Gzip的压缩比已经触及天花板。

Google在2015年推出了Brotli算法,最初用于WOFF2字体压缩,后来扩展为通用的HTTP内容编码。2016年主流浏览器开始支持,2023年全球站点使用Brotli的比例已超过70%。压缩率提升意味着更少的网络传输字节,直接转化为更快的首字节时间和完整加载时间。

一个实测数据:一份未经压缩的jQuery 3.7.1文件(88KB),Gzip后约33KB,Brotli(质量等级6)后约27KB,缩小了18%。对CSS和HTML,收益更明显。这正是替代Gzip的核心动力——在不改变代码和服务器资源的前提下,进一步削减传输量。

Brotli与Gzip的差异:不止是压缩比

算法原理不同

Gzip基于Deflate算法(LZ77 + Huffman编码),是一种通用压缩器。Brotli在2013年由Jyrki Alakuijala和Zoltán Szabadka设计,使用基于LZ77的改进版配合二阶上下文建模,并内置一个包含常用单词和短语的静态字典(如HTML标签、HTTP头部、CSS属性名等)。这个字典让Brotli在小文件上也能获得不错压缩率,而Gzip在小文件上往往因为五字节的头部开销显得压缩效果有限。

压缩与解压速度的权衡

Brotli提供了11个质量等级(0-11,默认11)。等级越高压缩率越好,但压缩耗时显著增加。在实践中:

  • 等级1-4:压缩速度极快,接近Gzip等级6,但压缩率仅略优于Gzip。
  • 等级5-6:压缩速度适中,压缩率明显超过Gzip等级6,适合动态压缩。
  • 等级7-11:压缩速度缓慢,适合静态资源的预压缩。

解压速度方面,Brotli比Gzip慢约10%-20%,但现代浏览器解压效率很高,增加的CPU时间远小于网络传输节省的时间,整体仍是正向收益。

浏览器支持情况

所有现代浏览器(Chrome 49+、Firefox 44+、Safari 11+、Edge 15+)都支持Brotli。主要缺口是iOS 9及更早版本,但这些设备占比极低。注意:Brotli要求使用HTTPS,因为中间代理可能无法正确处理编码协商。如果站点未全站HTTPS,Brotli会被降级为Gzip。

全站启用Brotli的条件与准备

必须满足的三项前提

  • 服务器已全站部署HTTPS(TLS 1.2+)。
  • Web服务器或反向代理支持Brotli模块:Nginx 1.11.5+需要编译ngx_brotli模块;Apache 2.4.26+需安装mod_brotli;Caddy、H2O、OpenLiteSpeed原生支持。
  • CDN或边缘节点支持Brotli:CloudFlare、Fastly、CloudFront、Akamai等均已支持,但需在控制台开启。

检查当前Gzip配置

不要直接覆盖原有Gzip配置。Brotil与Gzip在客户端协商时遵循相同逻辑:浏览器在Accept-Encoding头中列出支持的编码(如br, gzip),服务器选择优先级最高的br。因此只需新增Brotli支持,保留Gzip作为降级选项。如果完全移除Gzip,老浏览器会收到未经压缩的内容,导致带宽浪费和加载变慢。

Nginx服务器启用Brotli:动态与静态方案

编译安装ngx_brotli模块(以CentOS 7为例)

# 下载源码并编译
wget https://nginx.org/download/nginx-1.24.0.tar.gz
wget https://github.com/google/ngx_brotli/archive/master.zip
tar xzf nginx-1.24.0.tar.gz && unzip master.zip
cd nginx-1.24.0
./configure --add-module=../ngx_brotli-master
make && make install

生产环境建议使用动态模块方式,避免每次Nginx版本升级时重新编译。以Debian/Ubuntu为例,可通过Nginx官方仓库安装预编译版本:apt install libnginx-mod-brotli

配置Brotli动态压缩(推荐热内容)

http {
    brotli on;
    brotli_comp_level 6;
    brotli_static on;
    brotli_types text/plain text/css application/javascript application/json image/svg+xml application/xml+rss;
}

参数说明:

  • brotli on:启用动态Brotli压缩
  • brotli_comp_level:质量等级设为6,平衡压缩率和CPU开销
  • brotli_static on:优先查找预先生成的*.br文件,避免重复压缩
  • brotli_types:列出需要压缩的MIME类型。默认只压缩text/html,必须显式添加JS/CSS等。建议添加常用文本类型,但不压缩已经过其他压缩的资源(如JPEG、MP4、WebP)

预生成静态Brotli文件(适配低频变化资源)

对JS/CSS等长期不变文件,使用构建工具(如zopfli或brotli CLI)预压缩:

# 使用brotli命令行工具
brotli --quality=11 --input=app.js --output=app.js.br
# 注意文件权限和Web服务器可读

当请求app.js时,若存在app.js.br且Accept-Encoding包含br,Nginx会直接返回.br文件(需设置brotli_static on)。预压缩版本使用最高等级,同时不消耗实时CPU。

Apache服务器启用Brotli

Apache 2.4.26+通过mod_brotli提供支持。配置示例:

LoadModule brotli_module modules/mod_brotli.so

    AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/css application/javascript
    BrotliCompressionQuality 6
    BrotliCompressionLevel 6
    BrotliFilterNote ratio_br
    SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-brotli

注意:mod_brotli不提供“brotli_static on”类似功能,如需预压缩需借助mod_rewrite或自定义处理。

CDN与反向代理场景

CloudFlare

默认对启用代理(橙色云)的域名自动启用Brotli,无需额外配置。可在Speed -> Optimization -> Brotli中确认状态。注意CloudFlare只在客户端通过HTTPS连接且支持Brotli时使用。

Nginx + CDN组合

若源站启用Brotli,而CDN不支持或配置不当,可能导致Brotli被CDN二次压缩或传递原始未压缩内容。建议:

  • 在源站同时配置Gzip和Brotli,Brotli优先级更高。
  • CDN应设置为“按原样传递”编码(passthrough),或者确认CDN支持Brotli且愿意开启。

验证Brotli是否生效

浏览器开发者工具

打开Chrome DevTools的Network标签,刷新页面,点击任意资源,查看Response Headers:

  • 如果看到content-encoding: br,表示Brotli压缩生效。
  • 如果看到content-encoding: gzip,说明退回到Gzip(可能客户端不支持Brotli,或服务器配置未生效)。
  • 如果无编码字段,表明未压缩。

命令行验证

curl -s -o /dev/null -w "%{http_code} %{size_download}" -H "Accept-Encoding: br" https://example.com/style.css
# 也可以直接查看响应头
curl -I -H "Accept-Encoding: br" https://example.com/style.css | grep -i content-encoding

若返回content-encoding: br,说明配置成功。

风险控制与回滚方案

监控CPU使用率

Brotli动态压缩等级5以上会增加CPU开销。建议先在灰度流量(如5%)中启用Brotli,观察服务器CPU和响应时间。如果CPU飙升超过10%,降低压缩等级或切换为预压缩方案。

兼容性兜底

不要期待客户端100%支持Brotli。务必保留Gzip配置作为备选。Nginx配置中brotli模块与gzip模块可以共存,会按权重自动协商。

回滚步骤

  1. 如果Nginx,注释掉brotli on及相关指令,reload Nginx。
  2. 如果存在预压缩的.br文件,可以保留或通过配置忽略(不设置brotli_static on)。
  3. 清除CDN缓存(如果CDN也参与了Brotli处理)。
  4. 确认回滚后响应头content-encoding恢复为gzip。

实际收益与长期维护

启用Brotli后,常见收益:

  • JavaScript/CSS资源体积缩减15%-25%
  • HTML文档缩减20%-30%
  • 首字节时间(TTFB)因传输数据量减少略有缩短
  • 移动端弱网环境下页面加载时间可降低10%-20%

长期维护建议:每次更新前端资源后,重新生成预压缩的.br文件(可集成到CI/CD脚本中);定期检查浏览器支持变化;适当监控Brotli压缩带来的额外CPU消耗,必要时调整等级。

替换Gzip不是颠覆式创新,而是渐进式优化。Brotli已经足够成熟,值得在生产环境推广。如果站点尚未启用,现在就是迁移的最佳时机。

延伸阅读