Aldebaran

人生最棒的感觉,就是你做到别人说你做不到的事。

0%

Nginx启用Brotli压缩

指原莉乃

简介

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 的。

参考

官网Github

Nginx启用Brotli压缩

gzip与brotli压缩算法对比

引入 Brotli 进行 Web Server的压缩