BROTLI 壓縮算法

在去年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實驗站點 .

值得慶幸的是, 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,可以用於在日誌中記錄壓縮比.

來源: Brotli压缩算法