介绍

  Brotli 是由 Google 开发的通用无损压缩算法,是 Gzip,Zopfli 和 Deflate 的替代品,Brotli 通过变种的 LZ77 算法、Huffman 编码以及二阶文本建模等方式进行数据压缩。与其他压缩算法相比,它有着更高的压缩效率与压缩比。Brotli 采用的是宽松的 MIT 许可协议。

下载源码

服务器上 Nginx 已在运作,只需单独编译 Brotli 动态模块,不用重新安装 Nginx。先看下已安装的 Nginx 版本:

nginx -v

nginx version: nginx/1.16.1

在 Nginx 官网下载对应版本的源码

wget https://nginx.org/download/nginx-1.16.1.tar.gz
tar zxvf nginx-1.16.1.tar.gz

从 Github 克隆 Brotli

yum install -y git; git clone https://github.com/google/ngx_brotli.git
cd ngx_brotli; git submodule update --init

编译模块

进入 nginx-1.16.1 目录编译 ngx_brotli 动态模块

yum install -y gcc kernel-headers pcre pcre-devel zlib zlib-devel openssl openssl-devel

Debian:
apt update
apt install -y gcc make libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev build-essential libbrotli-dev

cd ../nginx-1.16.1
./configure --with-compat --add-dynamic-module=../ngx_brotli && make modules

安装模块

检查后,将模块文件拷贝到 Nginx 模块目录
ls objs/*.so

ngx_http_brotli_filter_module.so
ngx_http_brotli_static_module.so

cp objs/*.so /etc/nginx/modules/
chown www-data /etc/nginx/modules/*.so

Debian:
cp objs/*.so /usr/share/nginx/modules/
chown www-data /usr/share/nginx/modules/*.so (?)

在 Nginx 的配置文件 /etc/nginx/nginx.conf 中插入内容(注意:load_module 指令必须插入在 events{...} 之前!)

load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;

最后,在站点的配置文件中 /etc/nginx/conf.d/website.conf 追加内容

brotli on;
brotli_static on;
brotli_comp_level 5;
brotli_types text/plain text/css text/xml text/javascript application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;

重新加载 Nginx 配置

nginx -t
nginx -s reload

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

完成!

验证

访问站点,在浏览器中打开“开发者工具”,切换到 Network 选项卡,查看 Headers 标签:

content-encoding: br
content-encoding: br

看到 content-encoding: br 字样说明 Brotli 压缩算法已经成功启用了。