Nginx启用Brotli压缩

前言

本文假定已经通过yum安装nginx,如果您是通过其他方式安装的nginx,实现方式可能有所不同。
运行环境:Centos 7.4Nginx 1.1x

关于Brotli

Google 认为互联网用户的时间是宝贵的,他们的时间不应该消耗在漫长的网页加载中,因此在 2015 年 9 月 Google 推出了无损压缩算法 Brotli。Brotli 通过变种的 LZ77 算法、Huffman 编码以及二阶文本建模等方式进行数据压缩,与其他压缩算法相比,它有着更高的压塑压缩效率。
关于Brotli详细介绍可点击这里。

开始安装

安装配置Git

在安装之前请先确定当前服务器是否安装 git , 如果已安装配置好git,请直接进入下一步骤。
安装git:

yum -y install git

设置ssh key:
使用git clone命令从github上同步github上的代码库时,如果使用SSH链接,而你的SSH key没有添加到github帐号设置中,系统会报下面的错误:

Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

这时,需要在本地创建SSH key,然后将生成的SSH key文件内容添加到github帐号上去。
创建ssh key的过程如下:

ssh-keygen -t rsa -C "[你的github邮箱地址]"

然后根据提示连按三次enter键,生成的SSH key文件就保存到当前登录用户的"家目录"文件夹下id_rsa.pub文件中。
打开id_rsa.pub文件,复制其内容

vim [用户家目录]/.ssh/id_rsa.pub

请先登录github后,打开https://github.com/settings/keys。
然后点击New SSH key按钮,新建SSH key,粘贴刚才从id_rsa.pub文件复制的内容,保存后即可。

下载Brotli

google/ngx_brotli 从 16年12月的版本起,开始内置google/brotli,所以我们不需要额外编译bagder/libbrotli库,让安装变得简单起来。
我们将google/ngx_brotli下载并解压到/usr/src/ngx_brotli目录

cd /usr/src
git clone https://github.com/google/ngx_brotli.git

然后在下载google/brotli并解压到/usr/src/ngx_brotli/deps/brotli

cd /usr/src/ngx_brotli/deps && rm -rf brotli
git clone [email protected]:google/brotli.git
cd /usr/src/ngx_brotli && git submodule update --init

编译Brotli

nginx自1.9.11以后版本后支持动态模块,自此,给nginx添加模块再也不用重新编译nginx了,通过动态模块,你可以在运行时有有选择性的加载第三方或Nginx官方模块。新的实现方式通过API模块保持尽可能的向后兼容。

下载解压nginx安装包

请下载与当前nginx版本相同的nginx安装包。nginx官方下载地址:http://nginx.org/en/download.html。
这里假设当前服务器nginx是1.14.2版本。

可通过命令,获取当前nginx版本

nginx -v

输出

nginx version: nginx/1.14.2

下载nginx安装包

cd /usr/src
wget http://59.80.44.46/nginx.org/download/nginx-1.14.2.tar.gz

解压安装包

tar -xvf nginx-1.14.2.tar.gz

编译动态模块

先进入解压后的nginx安装包目录,配置configure,然后用make modules

cd nginx-1.14.2
./configure --with-compat --add-dynamic-module=/usr/src/ngx_brotli
make modules

参数语法:–add-dynamic-module=[模块源码所在目录的绝对路径]

等运行完成后,查看编译好的模块

ls objs/*.so

输出:

objs/ngx_http_brotli_filter_module.so  objs/ngx_http_brotli_static_module.so

将编译好的模块文件复制到nginx动态模块加载目录

cp objs/{ngx_http_brotli_filter_module.so,ngx_http_brotli_static_module.so} /etc/nginx/modules

注册Brotli模块

为了方便管理nginx动态模块,建议新建一个modules.conf文件,单独管理动态模块。

touch /etc/nginx/modules.conf

/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。
/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_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

Brotli 压缩只能在https中生效,因为 在 http 请求中 request header 里的 Accept-Encoding: gzip, deflate 是没有 br 的。

清理临时文件

要养成好习惯,每次编译完后都要把应用包解压出来的文件或目录进行删除。

rm -rf /usr/src/{nginx-1.14.2/,ngx_brotli/}

你可能感兴趣的:(linux,nginx,brotli)