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

即可解决。

BROTLI 壓縮算法

在去年9月, Google就已經在官方博客上發布了新的壓縮算法Brotli,並開源在了Github上.

同時還發布了一個研究報告 ,対Brotli, Deflate, Zopfli, LZMA, LZHAM和Bzip2這幾種壓縮算法進行了細緻的對比.從中我們可以知道Brotli的特性大概有這樣幾點:

對於典型的Web資源(html,css,js等), Brotli比Gzip性能好17–25%
Brotli -1有著與Gzip -9相近的壓縮比和更快的壓縮解壓速度
多語言HTML文件壓縮率有25%的提升
(在對Alexa排名前一萬個網站的測試中)JS/MinJS/CSS文件壓縮率分別有17% 17%和20%的提升
有效降低移動端瀏覽器加載網頁耗費的數據流量和電量
經過大約半年的開發, 現在Chrome 49和Firefox 44以上的版本已經可以體驗到這項新算法了.

不過在Chrome 49穩定版中Brotli默認沒有啟用,需要到chrome://flags#enable-brotli中手動啟用,啟用後可以在請求頭的Accept-encoding字段中看到br字樣.服務端也支持Brotli壓縮算法的話就能在響應頭中看到Content-Encoding: br.

在我所知道的站點中,當前只有極少數啟用了対Brotli的支持.其中一個是Google Fonts API,另一個是CloudFlare的HTTP2實驗站點 .

值得慶幸的是, CloudFlare和Google都提供了Brotli的Nginx模塊.我們可以自行編譯來加入對Brotli的支持.整個過程和配置其他模塊沒有太大的區別,這裡就簡要地記錄一下.

# 先安装libbrotli库(https://github.com/bagder/libbrotli)
$ git clone https://github.com/bagder/libbrotli
$ cd libbrotli
$ ./autogen.sh
$ ./configure –prefix=/usr
$ make && make install
$ ldconfig

# 编译Nginx 加入brotli模块
$ git clone https://github.com/google/ngx_brotli
$ cd nginx-1.x.x
$ ./configure –add-module=/path/to/ngx_brotli
$ make
# 替换二进制文件 然后平滑升级
$ mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
$ cp objs/nginx /usr/local/nginx/sbin/nginx
$ kill -USR2 `cat /var/run/nginx.pid`
$ kill -QUIT `cat /var/run/nginx.pid.oldbin`
# 修改配置文件, 参数和Gzip大致相同
brotli on;
brotli_static off;
brotli_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/javascript text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
brotli_buffers 4 16k;
brotli_comp_level 6;
brotli_window 512k;
brotli_min_length 512;
另外,該模塊和Gzip同樣1提供了一個變量$brotli_ratio,可以用於在日誌中記錄壓縮比.

來源: Brotli压缩算法