简介
Brotli是一种通用无损压缩算法,它结合了LZ77算法的现代变体,霍夫曼编码和二阶上下文建模来压缩数据,其压缩率可与目前最好的通用压缩方法相媲美。它的速度与放气相似,但压缩更紧密。
ngx_brotli是一组两个nginx模块:
- ngx_brotli过滤器模块-用于即时压缩响应,
- ngx_brotli静态模块-用于提供预压缩文件。
Brotli的兼容性
兼容性: https://caniuse.com/#search=Brotli
安装
正常安装
重新编译Nginx的时候,可以直接使用–add-module
$ cd /usr/src $ git clone https://github.com/google/ngx_brotli.git $ cd nginx-1.x.x $ ./configure --add-module=/usr/src/ngx_brotli $ make && make install
动态加载模块
对于已经编译好的Nginx,是支持动态加载的。
nginx自1.9.11以后版本后支持动态模块,自此,给nginx添加模块再也不用重新编译nginx了,通过动态模块,你可以在运行时有有选择性的加载第三方或Nginx官方模块。新的实现方式通过API模块保持尽可能的向后兼容。
$ cd /usr/src $ git clone https://github.com/google/ngx_brotli.git $ cd nginx-1.x.x/ # PS: 编译系统模块使用 --add-module, 编译第三方模块使用--add-dynamic-module。 $ ./configure --with-compat --add-dynamic-module=/usr/src/ngx_brotli $ make modules # 将模块库(.so文件)复制到/etc/nginx/modules: $ sudo cp objs/ngx_http_brotli_filter_module.so /etc/nginx/modules/ $ sudo cp objs/ngx_http_brotli_static_module.so /etc/nginx/modules/
加载并使用模块,在 nginx.conf 最顶端添加(不在http或stream上下文中):
在/etc/nginx/nginx.conf配置文件里引入modules.conf文件,找到以下内容并修改:
pid /var/run/nginx.pid; include /etc/nginx/modules.conf;
打开/etc/nginx/modules.conf,注册刚才编译好的 Brotli 模块。
Brotli模块
load_module modules/ngx_http_brotli_filter_module.so; load_module modules/ngx_http_brotli_static_module.so;
启用Brotli压缩
Brotli和gzip是可以并存的,无需关闭gzip。
ngx_brotli 配置有如下指令:
brotli 是否启用 Brotli on 为开启 off 为关闭
brotli_types 允许的压缩 mime 类型比如 text/css, text/javascript
brotlicomplevel 压缩级别 可选值范围为0~11,默认值为6
在/etc/nginx/nginx.conf开启Brotli:
http {
...
# gzip
gzip on;
gzip_min_length 1k;
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 5;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
gzip_vary on;
gzip_proxied any;
gzip_disable "MSIE [1-6]\.";
# brotli
brotli on;
brotli_comp_level 6;
brotli_buffers 16 8k;
brotli_window 512k;
brotli_min_length 20;
brotli_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;
...
}
在反向代理配置文件代码中添加:
proxy_set_header Accept-Encoding "";
范例:
server {
...
location / {
...
proxy_set_header Accept-Encoding "";
...
}
...
}
重启nginx,使其配置生效
$ systemctl restart nginx
查看 header 头是不是有这样的值:
Content-Encoding: br
Brotli 压缩只能在https中生效,因为 在 http 请求中 request header 里的 Accept-Encoding: gzip, deflate 是没有 br 的。