由谷歌开源的 Brotli 压缩算法不知道大家听过没有?现代网站大多用的压缩算法都是 gzip,它也是非常有效的一种压缩算法,可以节省网站服务器和用户之间传输数据所需要花费的时间(毕竟是压缩传送的,这么说大家应该都能懂,不懂就想想你下载原文件和下载压缩包的区别),但是这个 Brotli,据闻能比 gzip 做得更好——不仅能获得更高的压缩比率,而且对压缩/解压速度影响也比较小(出处:https://imququ.com/post/my-nginx-conf.html)。

有关这个压缩算法的说明,我就不详细说了,毕竟本文主要是针对那些已经知道或了解 Brotli 却又不知道怎么启用的人来写的。如果你还不是很了解,也可以去谷歌的 GitHub 了解一下:https://github.com/google/brotli

一、下载 Nginx Brotli 源码

在下载之前,我要先跟大家提一下,源码下载地址我这里可以分享给大家两个:

  1. 谷歌官方的,源码已经很久没更新了,但是能用:https://github.com/google/ngx_brotli.git
  2. 网友 Fork 自谷歌官方的源码之后弄的,比较新,仍在更新中,也能用:https://github.com/eustas/ngx_brotli.git

具体选哪个你们自己判断吧,反正都是能用的~

下面开始说具体怎么做了,这里只说一遍,所有操作都是要你在 SSH 命令行下进行的,最好是用 Root 用户,不会出现权限之类的问题,否则自己记得适时使用 sudo 命令。

在 SSH 上找一个你想存放 Brotli 源码的目录并进入,比如 /usr/local:

cd /usr/local

使用 Git Clone 命令下载源码,源码地址自己选上面那两个的其中一个:

git clone https://github.com/eustas/ngx_brotli.git

如果提示没有 git 命令的话,先去安装一个,这里就只说 Debian 的安装方法了:

apt-get update
apt-get install git

下载完之后什么也别动,直接执行下面的命令,本部分结束:

cd ngx_brotli
git submodule update --init --recursive

二、为 Nginx 编译进 Brotli 模块

这里我分两个部分来说,一个部分是讲自己编译 Nginx 安装的,另一种的情况要简单一点,就是用了军哥 LNMP 那个一键包安装 Nginx 的。

自编译 Nginx 安装方法

自己编译的 Nginx 的话,首先我们要获取 Nginx 的编译参数:

nginx -V

输入之后无需多看,把得到的结果里 configure arguments: XXXXXXXXX 这一部分中的 XXXXXXXXX 部分完整的复制下来,不管它有多长。

然后用 cd 命令进入你 Nginx 的源码解压目录,没有的话就自己再下载解压一个。这里需要注意的是我说的是 Nginx 的源码解压目录,不是系统已有的 Nginx 安装目录,如果当初装 Nginx 没有存好的话,再去官网下载解压一个就是了。

wget https://nginx.org/download/nginx-1.15.8.tar.gz
tar zxf nginx-1.15.8.tar.gz
cd nginx-1.15.8

上面的命令有三个需要注意的地方,一是 wget 下载的源码包,我这里演示的是最新的 Nginx 1.15.8,你们也可以下载别的版本的,注意替换下地址。二是 tar zxf 解压的源码包名字,请和前面下载的源码包名字保持一致。三是 cd 命令进入的目录,也是要和前面的名字保持一致。

进入之后,输入以下的命令,XXXXXXXXX 部分就是你前面复制的那段,并在最后空格加入 –add-module=/usr/local/ngx_brotli(注意,/usr/local/ngx_brotli 这个目录是你保存 Brotli 源码的目录,具体位置请根据本文开头第一步中你设定的写):

./configure XXXXXXXXX --add-module=/usr/local/ngx_brotli

然后开始编译:

make

做完之后,先别着急,首先我们要知道现有 Nginx 的安装目录位置,比如如果在 /uer/local/ningx(后面都以安装在该目录下时来进行说明,如果你的不是,请注意替换命令中的目录路径为你自己的),那么执行下面的命令(意思就是重命名一下现有 Nginx 的二进制文件了,然后才能把我们新编译的放进去):

mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old

然后复制新二进制文件放进原有的 Nginx 安装目录下:

cp objs/nginx /usr/local/nginx/sbin/nginx

测试一下有没有什么问题:

/usr/local/nginx/sbin/nginx -t

没有问题执行下列命令更新:

make upgrade

完成之后重启一下~

/usr/local/nginx/sbin/nginx restart

OK!编译全部完成~

在这里要说明的是,在中途我们只使用了 make 命令编译,但是并没有选择 make && make install,这是因为 make install 虽然也能让我们顺利解决问题,但是这个更加适合于全新安装 Nginx 的时候,如果我们在已经安装了 Nginx 的情况下,使用 make install,是会覆盖安装现有 Nginx 的,没有 upgrade 更新来得方便。

当然,如果你觉得有必要使用 make && make install 也是没什么问题的(最好在操作之前结束现有 Nginx 进程)。那么后面的重命名二进制文件还有复制新二进制文件什么的就不用做了,编译完成测试重启下什么的就没事了。

军哥 LNMP 安装方法

军哥的就比较简单了,直接编辑 LNMP 安装目录下的 lnmp.conf 文件(默认的话应该位于/root/lnmp1.5 这个目录):

vi /root/lnmp1.5/lnmp.conf

按 i 开启编辑模式,在如下位置加上–add-module=/usr/local/ngx_brotli 这个编译参数,再提醒一下,/usr/local/ngx_brotli 这个目录请写自己下载保存 Brotli 源码的目录:

Nginx_Modules_Options='--add-module=/usr/local/ngx_brotli'

按 ESC 退出编辑状态,:wq 保存并退出。然后用 LNMP 自带的脚本升级一下 Nginx,这里我们可以选择同版本 Nginx 不升级,也可以真的升级,没什么差别,我们只是借用升级脚本重新编译一下 Nginx 而已:

cd /root/lnmp1.5
./upgrade.sh nginx

注意:上面那个命令里的目录路径请根据你自己安装 LNMP 位置的路径来写,如果你的 LNMP 不是安装在 Root 目录下,路径是会不同的,总之就是找到你 LNMP 安装目录下的那个 upgrade.sh 升级脚本就对了。

升级脚本执行完成之后,就是编译完成了,此时你的 Nginx 已经加入了 Brotli 模块,用 Nginx -V 这个命令可以看到。

三、配置 Nginx 加入 Brotli 支持

前面我们只是给 Nginx 编译安装上了 Brotli 的模块,但是此时它还是未启用生效状态的,我们需要编辑 Nginx 的配置文件,加入 Brotli 的配置。

关于 Nginx 的配置文件,这个根据你自己的情况可能会和我的位置不太一样,这里我就以 LNMP 1.5 安装的 Nginx 为例来说了,你要是自己都不知道在哪,我也没办法。

关于 LNMP 1.5 装的 Nginx 的配置文件,你有两个可以编辑的选择:

  1. 如果你只是想单个网站生效,请编辑/usr/local/nginx/conf/vhost 中的网站对应配置文件,在 Sever 段中加入下面说的一些配置
  2. 如果你有多个网站,想全局都启用 Brotli 压缩算法支持,请编辑/usr/local/nginx/conf/nginx.conf 文件,在其中的 HTTP 段中加入下面说的一些配置

PS:为了方便大家理解,简单说说我说的这个段,就是类似这种:

sever
{
XXXXXXX
XXXXXXX
XXXXXXX
XXXXXXX
}

http
{
XXXXXXX
XXXXXXX
XXXXXXX
}

OK!上面解释得够清楚得了吧?下面我来说说 Brotli 具体的一些配置参数,当然我只是跟大家简单的说说(因为本来也没几个可说的嘛=_=),完整的配置参数说明可以看看第一步下载源码里的链接,进入之后可以在页面最后看到说明。

  • brotli on

开启 Brotli 压缩算法,没什么好说的,我们当然要开启。

  • brotli_static

查找预处理好的以 .br 结尾的压缩文件。默认值是 off,也就是关闭状态。可选参数为 off, on, always. 选 always 的话就是不管什么情况都使用预处理好的文件,而不管客户端支不支持。

  • brotli_comp_level

用来设置压缩等级的,默认值是 6,这个不建议随意更改,调小了效果可能不好,大了加重服务器的负担。

  • brotli_buffers

缓冲区的数量和大小,默认的是 32 4k 或者 16 8k。默认缓冲区大小等于你服务器的一个内存页大小,Linux 平台用命令 getconf PAGE_SIZE 可以知道,一般都是 4096,也就是 4k。不过在网友 Fork 之后的 Nginx Brotli 模块说明里好像是说这条已经被弃用了。

  • brotli_window

设置 Brotli 窗口大小,默认值是 512k,没事就别改了,写默认的就好。

  • brotli_min_length

设定Content-Length响应头字段大于或等于多少时,文件才会被压缩,默认是 20,也就是大于等于 20 字节的文件才会被压缩。

  • brotli_types

设定什么类型的文件会被压缩。默认值是 text/html,这个看你自己怎么设置,如果写*的话就是什么文件都会被压缩(前提是它达到了你前面设定的大小)。

如果按照官方提供的文档说明,如果我们把配置放在 Nginx 配置文件的 HTTP 段中,那么完整的默认配置应该是长这样的,除了第一项(那肯定是要选择开启 Brotli 压缩的啊!):

http
    {
        XXXXXX
        XXXXXX
        XXXXXX
        XXXXXX
    
  brotli on;
        brotli_static off;
        brotli_comp_level 6;
        brotli_buffers 32 4k|16 8k;
        brotli_window 512k;  
        brotli_min_length 20;
        brotli_types text/html;
    }

PS:注意一下上面的 brotli_buffers 那段,是让你两个中选一个而不是说就这么写。还有一般的 Nginx 配置文件里也配置了 gzip 压缩算法,不过没关系,Brotli 可以完美和 gzip 配合使用的。如果浏览器支持 Brotli,那么会优先返回 Brotli 压缩的内容,如果不支持,就返回 gzip 压缩的内容。

四、重载 Nginx 使得配置生效

自己编译的 Nginx 用这个命令重载:

/usr/local/nginx/sbin/nginx reload

如果是 LNMP 安装的,就是下面这个:

lnmp nginx reload

OK!教程到这里就完了,现在用你的浏览器打开自己的网站,然后 F12 看看网络选项,如果在文件的响应头里看到 Content-Encoding: br 这样的一项,就说明你配置成功了,功夫不负有心人~如果没有成功,建议再回头看看教程,找找是不是你哪里没做对,实在不行,你还可以留言评论和大家探讨下啊~

说点什么
欢迎评论!不想写邮箱的请填写 [email protected] 哦!
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...