Brotli是Google推出的开源压缩算法,通过变种的LZ77算法、Huffman编码以及二阶文本建模等方式进行数据压缩,与其他压缩算法相比,它有着更高的压缩效率,性能也比我们目前常见的Gzip高17-25%(我实际测试至少能达到30%),可以帮我们更高效的压缩网页中的各类文件大小及脚本,从而提高加载速度,提升网页浏览体验。目前我这个小博客也开启了Brotli压缩,需要说明的是Brotli压缩只在https下生效。

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

Brotli 凭借它优异的压缩性能迅速占领了市场,从下图可以看到,除了 IE 和 Opera Mini 之外,几乎所有的主流浏览器都已支持 Brotli 算法,因此处于资源占用的考虑,比如说流量,建议启用:

Nginx开启Google Brotli压缩

下载Brotli

#下载brotli
git clone https://github.com/google/ngx_brotli.git
cd ngx_brotli
#更新brotli
git submodule update --init

编译nginx

因为服务器更换,我这边是全新编译的。如果是生产环境,请动态为nginx添加模块。

# 查看之前的模块
/usr/loca/nginx/sbin/nginx -V
# 将brotli加到之前的模块后面
./configure --user=www --group=www --prefix=/usr/local --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module --with-http_geoip_module --with-openssl=/data/software/lnmp1.5-full/src/openssl-1.0.2o  --with-openssl-opt='enable-weak-ssl-ciphers' --add-module=/data/software/ngx_brotli

# 编译完成后确认一下是否成功
[root@web-master openresty-1.15.8.1]# /usr/local/nginx/sbin/nginx -V
nginx version: openresty/1.15.8.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
built with OpenSSL 1.0.2o  27 Mar 2018
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-cc-opt=-O2 --add-module=../ngx_devel_kit-0.3.1rc1 --add-module=../echo-nginx-module-0.61 --add-module=../xss-nginx-module-0.06 --add-module=../ngx_coolkit-0.2 --add-module=../set-misc-nginx-module-0.32 --add-module=../form-input-nginx-module-0.12 --add-module=../encrypted-session-nginx-module-0.08 --add-module=../srcache-nginx-module-0.31 --add-module=../ngx_lua-0.10.15 --add-module=../ngx_lua_upstream-0.07 --add-module=../headers-more-nginx-module-0.33 --add-module=../array-var-nginx-module-0.05 --add-module=../memc-nginx-module-0.19 --add-module=../redis2-nginx-module-0.15 --add-module=../redis-nginx-module-0.3.7 --add-module=../rds-json-nginx-module-0.15 --add-module=../rds-csv-nginx-module-0.09 --add-module=../ngx_stream_lua-0.0.7 --with-ld-opt=-Wl,-rpath,/usr/local/luajit/lib --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module --with-http_geoip_module --with-openssl=/data/software/lnmp1.5-full/src/openssl-1.0.2o --with-openssl-opt=enable-weak-ssl-ciphers --add-module=/data/software/ngx_brotli --with-stream --with-stream_ssl_preread_module

开启Brotli压缩

在nginx的配置文件中增加以下配置来开启brotli。

brotli on;              #启用
brotli_comp_level 6;    #压缩等级,默认6,最高11,太高的压缩水平可能需要更多的CPU
brotli_buffers 16 8k;   #请求缓冲区的数量和大小
brotli_min_length 20;   #指定压缩数据的最小长度,只有大于或等于最小长度才会对其压缩。这里指定20字节
brotli_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml text/html application/json image/svg application/font-woff application/vnd.ms-fontobject application/vnd.apple.mpegurl image/x-icon image/jpeg image/gif image/png image/bmp;   #指定允许进行压缩类型
brotli_static always;   #是否允许查找预处理好的、以.br结尾的压缩文件,可选值为on、off、always
brotli_window 512k;     #窗口值,默认值为512k

增加完配置,记得reload一下nginx,确保新增的配置生效。
Nginx开启Google Brotli压缩

Gzip对比

上述操作都成功完成后,brotli就开启了。下面是我简单测试的结果,仅供参考。

开启Gzip压缩时测试页面时间为1.29s
Nginx开启Google Brotli压缩

开启brotli压缩时测试页面时间为587ms
Nginx开启Google Brotli压缩

chrome自从48版本之后就支持brotli压缩了,我这边是gzip和brotli都开启了,以便完美兼容部分老旧的浏览器不支持Brotli的时候会自动变成Gzip压缩。最最需要说明的是brotli压缩仅在https协议下生效。

文章目录