虽然Brotli 还是非主流,但是如新贴吧知乎就支持Brotli压缩。谷歌也提供了nginx Brotli 模块。开启方面也不用费什么力。而且cloudflare默认就提供这个支持。本文就Brotli做一些概述性科普和配置实践方法
“智能压缩”按照又拍云的说法是,同时支持 Gzip 和 Brotli 压缩算法。根据用于浏览器开启自动选择不同压缩方式。
Gzip 基于 DEFLATE 算法,它是 LZ77 和霍夫曼编码的组合,最早用于 UNIX 系统的文件压缩。HTTP 协议上的 Gzip 编码是一种用来进 Web 应用程序性能的技术,Web 服务器和客户端(浏览器)必须共同支持 Gzip,当下主流的浏览器都是支持 Gzip 压缩,包括 IE6、IE7、IE8、IE9、FireFox、Google Chrome、Opera 等。
Google 认为互联网用户的时间是宝贵,尤其不应该浪费在无用的网页加载中。
2013年,他们发布了 Zotfli 压缩算法。该算法在默认设置下的输出比 zlib 的最大压缩比输出还要小 3-8%。PNG 优化器、Web 内容预处理等许多压缩方案中都集成了该算法。基于该算法的应用情况,于 2015 年 9 月推出了无损压缩算法 Brotli,最初用于用于网络字体的离线压缩。该算法由谷歌压缩团队的 Jyrki Alakuijala 和 Zoltan Szabadka 开发,其中 Jyrki 亦是 Zotfli 压缩算法的创建者。
2015年9月发布了包含通用无损数据压缩的Brotli增强版本,特别侧重于HTTP压缩。其中的编码器被部分改写以提高压缩比,编码器和解码器都提高了速度,流式API已被改进,增加更多压缩质量级别。新版本还展现了跨平台的性能改进,以及减少解码所需的内存。
Brotli 通过变种的 LZ77 算法、Huffman 编码以及二阶文本建模等方式进行数据压缩,与其他压缩算法相比,它有着更高的压缩效率。
与常见的通用压缩算法不同,Brotli使用一个预定义的120千字节字典。该字典包含超过13000个常用单词、短语和其他子字符串,这些来自一个文本和HTML文档的大型语料库。预定义的算法可以提升较小文件的压缩密度。
使用brotli替换deflate来对文本文件压缩通常可以增加20%的压缩密度,而压缩与解压缩速度则大致不变。
Brotli 压缩算法具有多个特点,最典型的是以下 3 个:
针对常见的 Web 资源内容,Brotli 的性能相比 Gzip 提高了 17-25%;
当 Brotli 压缩级别为 1 时,压缩率比 Gzip 压缩等级为 9(最高)时还要高;
在处理不同 HTML 文档时,Brotli 依然能够提供非常高的压缩率。
比其他算法提供更快的解压与压缩算法
Brotli算法与其他算法压缩比率对比
图一,我们可以看到 Brotli 与常用的压缩算法 bzip2、gzip、lzma2 对比,压缩比上有明显的优势。
图二,我们看到 Brotli 的解压缩速度与 Gzip 非常相似,但是远远超出 bzip2 和 lzma2,尽管它们相较于 Gzip 有更好的压缩比,但是它们解压缩的速度要慢几倍,和 Brotli 一比,他们的优势消失殆尽。
Brotli 算法和其他算法的性能比较:
https://cran.r-project.org/web/packages/brotli/vignettes/benchmarks.html
https://hacks.mozilla.org/2015/11/better-than-gzip-compression-with-brotli
支持Brotli压缩算法的浏览器使用的内容编码类型为br
http请求头:Accept-Encoding: gzip, deflate, sdch, br
http返回头:Content-Encoding: br
nginx目前并不支持Brotli算法,需要使用第三方模块,例如ngx_brotli进行实现。https://github.com/google/ngx_brotli
下面是简单的安装步骤。
git clone https://github.com/google/ngx_brotli
cd ngx_brotli
git submodule update --init
cd /path/to/nginx_source/
./configure --add-module=/path/to/ngx_brotli
make && make install
brotli on;
brotli_comp_level 6;
brotli_buffers 16 8k;
brotli_min_length 20;
brotli_types *;
brotli_static:启用后将会检查是否存在带有br扩展的预先压缩过的文件。如果值为always,则总是使用压缩过的文件,而不判断浏览器是否支持。
brotli:是否启用在on-the-fly方式压缩文件,启用后,将会在响应时对文件进行压缩并返回。
brotli_types:指定对哪些内容编码类型进行压缩。text/html内容总是会被进行压缩。
brotli_buffers:设置缓冲的数量和大小。大小默认为一个内存页的大小,也就是4k或者8k。
brotli_comp_level:设置压缩质量等级。取值范围是0到11.
brotli_window:设置窗口大小。
brotli_min_length:设置需要进行压缩的最小响应大小。
现在贴吧化的知乎,就使用了brotli
相关文章:
Google 开源 Brotli 压缩算法 https://www.infoq.cn/article/2015/10/Google-Brotli-Zotfli/
智能压缩,摆脱用 Gzip 还是 Brotli 的纠结 https://www.jianshu.com/p/94a153630de4
让 CDN 更省流量的 Brotli 算法详解 https://www.jianshu.com/p/45c95bdf4f0c
使用Brotli提高网站访问速度 https://segmentfault.com/a/1190000009374437
在ASP.NET Core中使用brotli压缩 https://www.cnblogs.com/shanyou/p/9154816.html