Brotli是一个Jyrki Alakuijala和Zoltán Szabadka开发的开源数据压缩程序库。Brotli基于LZ77算法的一个现代变体、霍夫曼编码和二阶上下文建模。
测试结果显示brotli相对gzip能减少文件大小20%-30%,同时不会增加服务器cpu负载。
gzip和brotli可同时开启。
nginx-brotli项目地址
安装brotli
1
2
3
4
5
6
7
8
9
10
11
12
|
$ git clone https://github.com/google/ngx_brotli.git
$ nginx -v
$ wget http://nginx.org/download/nginx-1.17.10.tar.gz
tar -zxvf nginx-1.17.10.tar.gz
$ cd ngx_brotli/
$ git submodule update --init
$ cd ../nginx-1.17.10/
$ ./configure --with-compat --add-dynamic-module=../ngx_brotli
$ make modules
$ cd objs/
$ cp ngx_http_brotli_filter_module.so /etc/nginx/modules/
$ cp ngx_http_brotli_static_module.so /etc/nginx/modules/
|
启用
修改 /etc/nginx/nginx.conf
在 http
段上面添加ngx_http_brotli_filter_module.so
和 ngx_http_brotli_static_module.so
http
内添加
1
2
3
4
5
6
7
8
|
brotli on;
brotli_comp_level 6;
brotli_static on;
brotli_types application/atom+xml application/javascript application/json application/rss+xml
application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype
application/x-font-ttf application/x-javascript application/xhtml+xml application/xml
font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon
image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml;
|
1
|
nginx -t && nginx -s reload && systemctl restart nginx
|
配置说明
1
2
3
4
5
6
7
8
9
10
11
12
|
#开启Brotli压缩
brotli on;
#压缩等级,0 到 11,默认值是 6,过大会额外消耗服务器CPU
brotli_comp_level 6;
#设置需要进行压缩的最小响应大小,单位为字节
brotli_min_length 512;
#指定哪些MIME类型进行压缩
brotli_types *;
#是否允许查找预处理好的、以 .br 结尾的压缩文件。可选值为 on、off、always
brotli_static always;
#显示头文件vary: Accept-Encoding
gzip_vary on;
|
支持Brotli压缩算法的浏览器使用的内容编码类型为br,例如以下是Chrome浏览器请求头里Accept-Encoding的值(只有在HTTPS的情况下,浏览器才会发送br这个Accept-Encoding):
Accept-Encoding: gzip, deflate, sdch, br
如果服务端支持Brotli算法,则会返回以下的响应头:
Content-Encoding: br
Brotli和Gzip可以共存,因此建议2个压缩都启用,当部分老旧的浏览器并不支持Brotli的情况下自动降级为Gzip来处理。
报错处理
1
2
3
4
5
|
./configure: error: Brotli library is missing from the /usr directory.
Please make sure that the git submodule has been checked out:
cd ../ngx_brotli && git submodule update --init && cd /root/temp/nginx-1.17.1
|
解决办法
1
2
|
cd ngx_brotli/
git submodule update --init
|
相关资料
Brotli vs Gzip Compression