Fork me on GitHub

centos7 nginx 的 brotli 压缩

   如何动态更新Nginx模块,使用新一代压缩算法 Brotli

测试环境

  • centos 7.2 64

  • Nginx 14.2

内容协商

在介绍 Brotli 之前,先说一下 HTTP 内容协商

有时候,同一个 URL 可以提供多份不同的文档,这就要求服务端和客户端之间有一个选择最合适版本的机制,这就是内容协商

HTTP 的内容协商的其中一种方式:服务端根据客户端发送的请求头中某些字段自动发送最合适的版本。可以用于这个机制的请求头字段又分两种:内容协商专用字段(Accept 字段)、其他字段

字段情况,详见下表:

请求头字段说明响应头字段
Accept告知服务器发送何种媒体类型Content-Type
Accept-Language告知服务器发送何种语言Content-Language
Accept-Charset告知服务器发送何种字符集Content-Type
Accept-Encoding告知服务器采用何种压缩方式Content-Encoding

例如客户端发送以下请求头:

Accept-Encoding:gzip,deflate,br

表示支持采用 gzip、deflate 或 br 压缩过的资源

浏览器的响应头可能是这样的:

Content-Encoding: gzip

详情可参考:Here

什么是 Brotli

从上面的内容了解到,我们控制使用压缩的资源,除了有Gzip外,还有br,而这个br就是我这里要说的 Brotli

Brotli is a generic-purpose lossless compression algorithm that compresses data using a combination of a modern variant of the LZ77 algorithm, Huffman coding and 2nd order context modeling, with a compression ratio comparable to the best currently available general-purpose compression methods. It is similar in speed with deflate but offers more dense compression.

Brotli 是基于LZ77算法的一个现代变体、霍夫曼编码和二阶上下文建模。Google软件工程师在2015年9月发布了包含通用无损数据压缩的Brotli增强版本,特别侧重于HTTP压缩。其中的编码器被部分改写以提高压缩比,编码器和解码器都提高了速度,流式API已被改进,增加更多压缩质量级别。

与常见的通用压缩算法不同,Brotli使用一个预定义的120千字节字典。该字典包含超过13000个常用单词、短语和其他子字符串,这些来自一个文本和HTML文档的大型语料库。预定义的算法可以提升较小文件的压缩密度。

使用Brotli替换Deflate来对文本文件压缩通常可以增加20%的压缩密度,而压缩与解压缩速度则大致不变。

浏览器支持情况

  • Mozilla Firefox在Firefox 44中实现Brotli。

  • Google Chrome从Chrome 49开始支持Brotli。

  • Opera从Opera 36开始支持Brotli。

安装与配置过程

安装需要用到开发工具

1
yum -y groupinstall 'Development Tools'

因为我们是编译安装nginx来定制自己的模块,所以需要安装缺少的依赖包

1
yum -y install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel

安装libbrotli

cd /usr/local/src/
git clone https://github.com/bagder/libbrotli
cd libbrotli
./autogen.sh
./configure
make && make install

安装ngx_brotli

cd /usr/local/src/
git clone https://github.com/google/ngx_brotli
cd ngx_brotli && git submodule update --init

安装Nginx

  1. 创建/etc/yum.repos.d/nginx.repo文件并根据自己的系统填写适当的Linux版本和发行版型号

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [nginx]
    name=nginx repo
    baseurl=http://nginx.org/packages/OS/OSRELEASE/$basearch/
    gpgcheck=0
    enabled=1

    # Replace “OS” with “rhel” or “centos”, depending on the distribution used, and “OSRELEASE” with “6” or “7”, for 6.x or 7.x versions, respectively.
    # 因为我是cetons 7 所以我的文件内容为

    [nginx]
    name=nginx repo
    baseurl=http://nginx.org/packages/centos/7/$basearch/
    gpgcheck=0
    enabled=1
  2. 安装 Nginx

    1
    yum install -y nginx

下载Nginx

这里使用 nginx-1.14.2

1
2
3
cd /usr/local/src/
wget http://nginx.org/download/nginx-1.14.2.tar.gz
tar -xvzf nginx-1.14.2.tar.gz && rm -rf nginx-1.14.2.tar.gz

获取Nginx Arguments

nginx -V
# 格式化输出
nginx -V 2>&1 | sed "s/\s\+--/\n --/g"

整理新的Arguments

根据获取到的configure arguments和上面软件的位置,重新整理configure arguments

然后再加上 --add-module=/usr/local/src/ngx_brotli,一下为我的安装实例,大家可以根据自己的情况动态修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
./configure \
--prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib64/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--user=nginx \
--group=nginx \
--with-compat \
--with-file-aio \
--with-threads \
--with-http_addition_module \
--with-http_auth_request_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_mp4_module \
--with-http_random_index_module \
--with-http_realip_module \
--with-http_secure_link_module \
--with-http_slice_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_v2_module \
--with-mail \
--with-mail_ssl_module \
--with-stream \
--with-stream_realip_module \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--add-module=/usr/local/src/ngx_brotli

开始安装和编译

cd /usr/local/src/nginx-1.14.2
./configure [这里是你的原Arguments] --add-module=/usr/local/src/ngx_brotli
make && make install

检查是否安装正常

nginx -V
nginx -t

找到Nginx的全局配置文件

如果检测安装正常的话,可以开始配置,该配置文件一般为 nginx.conf

在合适的位置插入下面代码

#Brotli Compression
brotli on;
brotli_comp_level 6;
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 -t

重启Nginx

如果正常的话,恭喜你,你已经配置完成了,重启一下Nginx即可

systemctl restart nginx

检查是否生效

打开你的网页,用chrome开发者工具调试,在Network那,发现有content-encoding:br

可能的报错

如果在测试或者重载时, Nginx 报错如下:

nginx: error while loading shared libraries: libbrotlienc.so.1: cannot open shared object file: No such file or directory

解决方法是把对应的库文件在 /lib(64) 或者 /usr/lib(64) 中做上软链接:

# 64 位系统
$ ln -s /usr/local/lib/libbrotlienc.so.1 /lib64

# 32 位系统
$ ln -s /usr/local/lib/libbrotlienc.so.1 /lib

参考

本文标题:centos7 nginx 的 brotli 压缩

文章作者:孤城落寞

发布时间:2018年12月08日 - 17:36:22

最后更新:2019年02月18日 - 16:43:25

原始链接:https://blog.gclmit.club/archives/762d039f.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。



-------------本文结束 感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!