目录

nginx开启brotli压缩

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.confhttp 段上面添加ngx_http_brotli_filter_module.songx_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