为什么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模块可以共存,会按权重自动协商。
回滚步骤
- 如果Nginx,注释掉
brotli on及相关指令,reload Nginx。 - 如果存在预压缩的.br文件,可以保留或通过配置忽略(不设置brotli_static on)。
- 清除CDN缓存(如果CDN也参与了Brotli处理)。
- 确认回滚后响应头
content-encoding恢复为gzip。
实际收益与长期维护
启用Brotli后,常见收益:
- JavaScript/CSS资源体积缩减15%-25%
- HTML文档缩减20%-30%
- 首字节时间(TTFB)因传输数据量减少略有缩短
- 移动端弱网环境下页面加载时间可降低10%-20%
长期维护建议:每次更新前端资源后,重新生成预压缩的.br文件(可集成到CI/CD脚本中);定期检查浏览器支持变化;适当监控Brotli压缩带来的额外CPU消耗,必要时调整等级。
替换Gzip不是颠覆式创新,而是渐进式优化。Brotli已经足够成熟,值得在生产环境推广。如果站点尚未启用,现在就是迁移的最佳时机。
延伸阅读
