nginx启用brotli压缩算法 ,经过实地验证,brotli和gzip可以共存….

來源: nginx启用brotli压缩算法 | Jackie的家

 

 

配置说明

指令介绍

ngx_brotli定义了如下指令:

  • brotli,是否允许动态压缩响应数据,可选值为onoff,默认值为off。样例如下:
    brotli on;
    
  • brotli_types,动态压缩启用时,允许压缩的MIME types,默认值为text/html。样例如下:
    brotli_types text/plain text/css text/xml application/xml application/json text/javascript application/javascript application/x-javascript;
    
  • brotli_static,是否允许查找预处理好的、以.br结尾的压缩文件,可选值为onoffalways,默认值为off。样例如下:
    brotli_static off;
    
  • brotli_comp_level,压缩级别,可选值范围为0~11,默认值为6。样例如下:
    brotli_comp_level 11;
    
  • brotli_buffers,压缩响应数据时使用的缓冲区的数量和大小。样例如下:
    brotli_buffers 16 8k;
    
  • brotli_window,brotli使用的窗口值,默认值为512k。样例如下:
    brotli_window 512k;
    
  • brotli_min_length,响应数据的最小长度,低于该值将不使用brotli算法执行压缩操作。brotli算法使用Content-Length来确定响应数据的长度。样例如下:
    brotli_min_length 20;
    

完整样例

http {
    ...
    gzip  on;
    gzip_vary               on;
    gzip_min_length         1024;
    gzip_buffers            128 32k;
    gzip_comp_level         6;
    gzip_http_version       1.1;
    gzip_proxied            expired no-cache no-store private auth;
    gzip_types              text/plain text/css text/xml application/xml application/json text/javascript application/javascript application/x-javascript;

    brotli on;
    brotli_types text/plain text/css text/xml application/xml application/json text/javascript application/javascript application/x-javascript;
    brotli_static off;
    brotli_comp_level 11;
    brotli_buffers 16 8k;
    brotli_window 512k;
    brotli_min_length 20;
    ...
}

经过实地验证,brotli和gzip可以共存。这是一个好消息,意味着Jackie可以在项目中使用启用brotli算法支持的nginx。
对于支持brotli算法的浏览器,比如Chrome 49之后的版本,使用开发者工具检查网络通信时,可以看到如下的HTTP响应头。

Content-Encoding: br

Nginx 使用 Brotli 压缩算法,Better than Gzip Compression | 米饭粑

Brotli 在瑞士德语中的意思是小面包(真·吃货·谷歌 啊)。Brotli 是一个通用目的的无损压缩算法,它通过用变种的 LZ77 算法,Huffman 编码和二阶文本建模进行数据压缩,是一种压缩比很高的压缩方法。在压缩速度上跟 Deflate 差不多的同事却实现了更密集的压缩,对 Canterbury 资料库的压缩密度好于 LZMA 和 bzip2。

來源: Nginx 使用 Brotli 压缩算法,Better than Gzip Compression | 米饭粑

 

安装

Brotli 的实现需要用到如下三个库,google/brotli 包含在 bagder/libbrotli 中。

google/brotli
google/ngx_brotli
bagder/libbrotli

一、首先安装 brotli 和 libbrotli 

git clone https://github.com/bagder/libbrotli 
cd libbrotli 
./autogen.sh 
./configure 
make && make install 

二、安装 ngx_brotli,重新编译 Nginx 或者 Openresty,在末尾加上 ./configure --add-module=/path/to/ngx_brotli 即可

例如,

cd /tmp
git clone https://github.com/google/ngx_brotli.git

# 已经下载好 ngx_brotli 了

cd nginx-1.11.3
./configure --add-module=/tmp/ngx_brotli 

三、编辑 nginx.conf 文件,在http配置段增加以下配置

brotli on; 
brotli_comp_level 6; 
brotli_buffers 16 8k; 
brotli_min_length 20; 
brotli_types *; 

(可选)四、反代禁用 gizp,反代 node.js 应用,如果他们启用了 gzip 了,他们在反代的地方就要添加:

proxy_set_header Accept-Encoding ""; 

五、重启 Nginx

service nginx restart

如果提示:

nginx: error while loading shared libraries: libbrotlienc.so.1: cannot open shared object file: No such file or directory

那么 SSH 中输入:

ldconfig

即可解决。