数据压缩算法-Brotli
2020-09-16 10:34:04 阿炯

Brotli是一个Jyrki Alakuijala和Zoltán Szabadka开发的开源数据压缩库,Brotli基于LZ77算法的一个现代变体、霍夫曼编码和二阶上下文建模等方式来进行数据压缩,与其他压缩算法相比,它有着更高的压缩效率。采用C语言开发并在MIT许可证协议下授权使用。


在Chrome(v49)和Firefox(v44)中,它已被用于加速万维网的传输速度。类似Google的压缩算法zopfli,brotli这个名字来自瑞士的烘培产品。

主要特点
针对常见的 Web 资源内容,Brotli 的性能相比 Gzip 提高了 17-25%;
当 Brotli 压缩级别为 1 时,压缩率比 Gzip 压缩等级为 9(最高)时还要高;
在处理不同 HTML 文档时,Brotli 依然能够提供非常高的压缩率。


Brotli最初发布于2015年,用于网络字体的离线压缩。Google软件工程师在2015年9月发布了包含通用无损数据压缩的Brotli增强版本,特别侧重于HTTP压缩。其中的编码器被部分改写以提高压缩比,编码器和解码器都提高了速度,流式API已被改进,增加更多压缩质量级别。新版本还展现了跨平台的性能改进,以及减少解码所需的内存。

与常见的通用压缩算法不同,Brotli使用一个预定义的120千字节字典。该字典包含超过13000个常用单词、短语和其他子字符串,这些来自一个文本和HTML文档的大型语料库。预定义的算法可以提升较小文件的压缩密度。使用brotli取代deflate来对文本文件压缩通常可以增加20%的压缩密度,而压缩与解压缩速度则大致不变。使用Brotli进行流压缩的内容编码类型已被提议使用"br"。


Nginx使用 ngx_brotli 模块

Nginx默认不支持ngx_brotli 模块,需要自行下载编译,方法如下:

#先下载brotli
git clone https://github.com/google/ngx_brotli.git
#进入目录
cd ngx_brotli
#更新brotli
git submodule update --init
#进入nginx源码目录
cd xxx/nginx
#生成makefile,注意根据自己使用的模块添加
./configure  ...  --add-module=../ngx_brotli
#编译nginx
make && make install

不出意外就能完成编译,输入nginx -V就可以看到ngx_brotli模块了。

修改nginx.conf在http段内添加以下内容来启用Brotli 压缩。

#开启Brotli压缩
brotli on;
#压缩等级,0 到 11,默认值是 6,过大会额外消耗服务器CPU
brotli_comp_level 6;
#设置需要进行压缩的最小响应大小,单位为字节
brotli_min_length   512;
#指定哪些MIME类型进行压缩
brotli_types text/plain text/javascript text/css text/xml text/x-component application/javascript application/x-javascript application/xml application/json application/xhtml+xml application/rss+xml application/atom+xml application/x-font-ttf application/vnd.ms-fontobject image/svg+xml image/x-icon font/opentype;
#是否允许查找预处理好的、以 .br 结尾的压缩文件。可选值为 on、off、always
brotli_static       always;

最后别忘记重载Nginx使其生效nginx -s restart

其它说明

支持Brotli压缩算法的浏览器使用的内容编码类型为br,例如以下是Chrome浏览器请求头里Accept-Encoding的值(只有在HTTPS的情况下,浏览器才会发送br这个Accept-Encoding):
Accept-Encoding: gzip, deflate, sdch, br

如果服务端支持Brotli算法,则会返回以下的响应头:
Content-Encoding: br

Brotli和Gzip可以共存,因此建议2个压缩都启用,当部分老旧的浏览器并不支持Brotli的情况下自动降级为Gzip来处理。


最新版本:1.0


项目主页:https://github.com/google/brotli