https://indust.me/brotli-compression-format/
在去年9月, Google就已经在官方博客上发布了新的压缩算法Brotli, 并开源在了Github上.
同时还发布了一个研究报告, 対Brotli, Deflate, Zopfli, LZMA, LZHAM和Bzip2这几种压缩算法进行了细致的对比. 从中我们可以知道Brotli的特性大概有这样几点:
经过大约半年的开发, 现在Chrome 49和Firefox 44以上的版本已经可以体验到这项新算法了.
不过在Chrome 49稳定版中Brotli默认没有启用, 需要到chrome://flags#enable-brotli中手动启用, 启用后可以在请求头的Accept-encoding
字段中看到br
字样. 服务端也支持Brotli压缩算法的话就能在响应头中看到Content-Encoding: br
.
在我所知道的站点中, 当前只有极少数启用了対Brotli的支持. 其中一个是Google Fonts API, 另一个是CloudFlare的HTTP2实验站点.
值得庆幸的是, CloudFlare和Google都提供了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
, 可以用于在日志中记录压缩比.