启用 Brotli 压缩算法,减少流量

关于 Brotli

与常见的通用压缩算法不同,Brotli使用一个预定义的字典。该字典包含超过13000个常用字符串,这些来自一个文本和HTML文档的大型语料库。预定义的算法可以提升较小文件的压缩密度。

使用Brotli替换Deflate来对文本文件压缩通常可以增加20%的压缩密度,而压缩与解压缩速度则大致不变。

支持度

  • Mozilla FirefoxFirefox 44中开始支持Brotli
  • Google ChromeChrome 49开始支持Brotli
  • OperaOpera 36开始支持Brotli

以上正式支持该压缩编码的浏览器,约占全球浏览器的一半。

备注:

以上两个栏目内容,参阅了:

必要资源

将该算法运用到nginx中,需要用到以下的库:

安装过程:

1.首先安装 bagder/libbrotli

$ git clone https://github.com/bagder/libbrotli
$ cd libbrotli

# 备注,下一步所执行的 autogen.sh 会自动从 Github 下载 google/brotli 这个库,无需另外下载。

$ ./autogen.sh

$ ./configure
$ make && make install

2.然后下载 google/ngx_brotli

$ git clone https://github.com/google/ngx_brotli

然后,编译安装 nginx

$ cd nginx-1.11.5

# 此处应该有你自己的配置,再加上 google/ngx_brotli 库。
# --with-cc-opt=-Wno-deprecated-declarations 是暂时性的配置,因为该软件中压缩相关 API 正在修改。

$ ./configure --add-module=/path/to/ngx_brotli --with-cc-opt=-Wno-deprecated-declarations
$ make && make install

3.根据 GitHub 页面,配置nginx.conf,在 http 配置段增加以下配置:

brotli               on;
brotli_comp_level    6;
brotli_buffers       16 8k;
brotli_min_length    20;
brotli_types         *;

4.考虑到部分基于 Node.js 的博客会在后台自动 Gzip ,所以在网站反代配置里加上下面这一句话,目的是告知后端:前端不接受 Gzip 编码。

proxy_set_header Accept-Encoding "";

5.最后,测试配置,重载生效。

可能的报错

如果在测试或者重载时, Nginx 报错如下:

nginx: error while loading shared libraries: libbrotlienc.so.1: cannot open shared object file: No such file or directory
方案一

可行的解决方案之一,是把对应的库文件在 /lib(64) 或者 /usr/lib(64) 中做上软链接:

# 64 位系统
$ ln -s /usr/local/lib/libbrotlienc.so.1 /lib64

# 32 位系统
$ ln -s /usr/local/lib/libbrotlienc.so.1 /lib
方案二

直接编辑 /etc/ld.so.conf ,加上一行:

/usr/local/lib/

执行:

$ ldconfig

执行方案一或二,并且重载 nginx ,若无报错,问题解决。

本文总结

Mozilla-48-br

上图:Mozilla 48 测试

Chrome-br

上图: Chrome 52 测试

经过测试,(本文发布前)本站首页大小: Gzip 压缩时为 3.7KB , Brotli 压缩时为 3.4KB 。
经过观察,虽然压缩耗时有所提高——尤其对于低配置服务器而言,但是传输耗时有所减少,能够有效降低加载耗时。

备注

本站另外启用了 SDCH 压缩功能,但暂时没有能够正常使用。

最后推荐一篇文章: Cloudflare 员工写的*Results of experimenting with Brotli for dynamic web content*,对于这个技术的利弊说的很浅显明白。