当前位置: 首页 > 工具软件 > Brotli > 使用案例 >

Brotli压缩算法

周龙光
2023-12-01

https://indust.me/brotli-compression-format/

在去年9月, Google就已经在官方博客上发布了新的压缩算法Brotli, 并开源在了Github上.

同时还发布了一个研究报告, 対Brotli, Deflate, Zopfli, LZMA, LZHAM和Bzip2这几种压缩算法进行了细致的对比. 从中我们可以知道Brotli的特性大概有这样几点:

  • 对于典型的Web资源(html,css,js等), Brotli比Gzip性能好17–25%
  • Brotli -1有着与Gzip -9相近的压缩比和更快的压缩解压速度
  • 多语言HTML文件压缩率有25%的提升
  • (在对Alexa排名前一万个网站的测试中)JS/MinJS/CSS文件压缩率分别有17% 17%和20%的提升
  • 有效降低移动端浏览器加载网页耗费的数据流量和电量

经过大约半年的开发, 现在Chrome 49和Firefox 44以上的版本已经可以体验到这项新算法了.

不过在Chrome 49稳定版中Brotli默认没有启用, 需要到chrome://flags#enable-brotli中手动启用, 启用后可以在请求头的Accept-encoding字段中看到br字样. 服务端也支持Brotli压缩算法的话就能在响应头中看到Content-Encoding: br.

在我所知道的站点中, 当前只有极少数启用了対Brotli的支持. 其中一个是Google Fonts API, 另一个是CloudFlare的HTTP2实验站点.

值得庆幸的是, CloudFlareGoogle都提供了Brotli的Nginx模块. 我们可以自行编译来加入对Brotli的支持. 整个过程和配置其他模块没有太大的区别, 这里就简要地记录一下.

# 先安装libbrotli库(https://github.com/bagder/libbrotli)
$ git clone https://github.com/bagder/libbrotli
$ cd libbrotli
$ ./autogen.sh
$ ./configure --prefix=/usr
$ make && make install
$ ldconfig

# 编译Nginx 加入brotli模块
$ git clone https://github.com/google/ngx_brotli
$ cd nginx-1.x.x
$ ./configure --add-module=/path/to/ngx_brotli
$ make
# 替换二进制文件 然后平滑升级
$ mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
$ cp objs/nginx /usr/local/nginx/sbin/nginx
$ kill -USR2 `cat /var/run/nginx.pid`
$ kill -QUIT `cat /var/run/nginx.pid.oldbin`
# 修改配置文件, 参数和Gzip大致相同
brotli on;  
brotli_static off;  
brotli_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/javascript text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;  
brotli_buffers 4 16k;  
brotli_comp_level 6;  
brotli_window 512k;  
brotli_min_length 512;  

另外, 该模块和Gzip同样1提供了一个变量$brotli_ratio, 可以用于在日志中记录压缩比.

 类似资料: