Nginx 启用谷歌 Brotli 高级压缩算法

前言

Google 认为互联网用户的时间是宝贵的,他们的时间不应该消耗在漫长的网页加载中

因此在 2015 年 9 月 Google 推出了无损压缩算法 Brotli

Brotli 通过变种的 LZ77 算法、Huffman 编码以及二阶文本建模等方式进行数据压缩,与其他压缩算法相比,它有着更高的压缩效率

根据 Google 发布的研究报告,Brotli 压缩算法具有多个特点,最典型的是以下 3 个:

  • 针对常见的 Web 资源内容,Brotli 的性能相比 Gzip 提高了 17-25%
  • 当 Brotli 压缩级别为 1 时,压缩率比 Gzip 压缩等级为 9(最高)时还要高
  • 在处理不同 HTML 文档时,Brotli 依然能够提供非常高的压缩率

Brotli 如此高的压缩比率,得益于其使用一个预定义的字典,该字典包含超过 13000 个来自文本和 HTML 文档的大型语料库的常用字符串,预定义的算法可以提升较小文件的压缩密度,而压缩与解压缩速度则大致不变

Brotli 凭借它优异的压缩性能迅速占领了市场

从下图可以看到,除了 IE 和 Opera Mini 之外,几乎所有的主流浏览器都已支持 Brotli 算法,因此处于资源占用的考虑,比如说流量,建议启用:

浏览器支持

以下操作基于宝塔平台,同样适用于LNMP 等平台,区别于操作目录而已

下载源码

进入 Nginx 源码目录操作:

cd /www/server/nginx/src/src/
git clone https://github.com/google/ngx_brotli.git
cd ngx_brotli
git submodule update --init
cd ..

重新编译

通过 nginx -V 获得原先的编译参数:

nginx -V
configure arguments: --user=www --group=www --prefix=/www/server/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-stream --with-stream_ssl_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-ld-opt=-Wl,-E

在原先编译参数基础上,在尾巴添加 –add-module=./src/ngx_brotli

./configure --user=www --group=www --prefix=/www/server/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-stream --with-stream_ssl_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-ld-opt=-Wl,-E --add-module=./src/ngx_brotli
#......
service nginx stop
make && make install
#......

启用配置

启用方法:

  • 如果只在某个路径启用,那么在 location 段中添加
  • 如果某个站点启用,那么在server 段中添加
  • 如果要全局启用,则在 http 段中添加

验证

假设当我们已经全局启用了 Brotli 算法

如果看到响应头包含了 Content-Encoding: br 字样

br 是 Brotli 流压缩的内容编码类型

就表示我们已经成功的启用了 Brotli 算法

参考文章


人生如逆旅,我亦是行人。