最近,本站的服务器已经正式切换为NGINX,本文旨在记录如何给NGINX添加Brotli压缩功能。
Brotli压缩介绍
2015年9月谷歌发布了Brotli压缩算法,直到现在才开始被大多数的浏览器所兼容。现在最新的HTTP服务器程序Apache和nginx也支持了Brotli压缩算法,谷歌和一些商业公司也开始对Brotli提供支持服务。和谷歌的gzip解压缩格式比起来,Brotli能在此基础上将数据在压缩20~25%。它通过一本英语、西班牙语、汉语、印地语、俄语、阿拉伯语的常用字、词汇字典,结合机器语言,特别是HTML和JavaScript的常用术语,能够将数据比gzip, bzip2, LZMA等压缩算法的基础上进一步进行压缩,减少了数据内容的容量大小,使得网页在加载时速度更快。
配置方法
准备工作
克隆Brotli源代码
bash
git clone https://github.com/google/ngx_brotli.git
国内Github被墙,请使用Github镜像
执行结果如下
bash
Cloning into 'ngx_brotli'...
remote: Enumerating objects: 206, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 206 (delta 0), reused 2 (delta 0), pack-reused 203
Receiving objects: 100% (206https://cszj.wang/wp-content/uploads/206), 74.99 KiB | 0 bytes/s, done.
Resolving deltas: 100% (90/90), done.
然后进入clone目录,加入Brotli依赖项
bash
cd ./ngx_brotli/deps && rm -rf brotli #清空原有目录
git clone https://github.com/google/brotli.git
cd ../ && git submodule update --init #刷新依赖项
执行结果如下
bash
Cloning into 'brotli'...
remote: Enumerating objects: 6755, done.
remote: Total 6755 (delta 0), reused 0 (delta 0), pack-reused 6755
Receiving objects: 100% (6755/6755), 36.07 MiB | 15.88 MiB/s, done.
Resolving deltas: 100% (4411/4411), done.
Submodule 'deps/brotli' (https://github.com/google/brotli.git) registered for path 'deps/brotli'
Submodule path 'deps/brotli': checked out '#####'
编译源代码
首先用nginx -v命令获得当前Nginx的版本号,如图即为1.25.1。

然后,点击http://nginx.org/en/download.html链接去Nginx官网下载对应安装包

推荐右键,复制链接后,用wget来下载,如以下命令
bash
wget http://nginx.org/download/nginx-1.25.1.tar.gz

解压包
bash
tar -xvf nginx-1.25.1.tar.gz
查看当前编译参数
bash
nginx -V #注意大小写
根据官方文档,可以使用--with-compact来免去参数直接构建,不知为何我的服务器上执行后模块附加失败,故使用该方法编译。

将configure arguments:后的编译选项复制下来,最后切换到刚刚解压出的Nginx目录
bash
cd ../nginx-1.25.1/
编译
configure
bash
./configure #你复制的编译选项# --add-dynamic-module=/root/ngx_brotli #替换为刚刚克隆到的绝对路径
错误提示
bash
checking for LuaJIT 2.x … not found./configure: error: unsupported LuaJIT version; ngx_http_lua_module requires LuaJIT 2.x.
若出现以上错误,则按以下方法解决
bash
export LUAJIT_INC=/usr/local/include/luajit-2.1
export LUAJIT_LIB=/usr/local/lib #临时引入lua库

若出现上图即为configure成功
make
bash
sudo make modules
等待较长的编译时间

如上图即为完成
部署
拷贝
进入objs文件夹

文件夹内容

将这两个文件拷贝入Nginx目录(可以新建一个modules文件夹)

修改配置
在nginx.conf中加入如下代码
nginx
load_module /**/nginx/modules/ngx_http_brotli_filter_module.so;
load_module /**/server/nginx/modules/ngx_http_brotli_static_module.so;
加在如图位置

再加入如下代码
nginx
# brotli
brotli on;
brotli_comp_level 6;
brotli_buffers 16 8k;
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;
加在这里

重载Nginx服务即可生效

