本文主要介绍支持Nginx的Brotli压缩算法的详细实现过程,并通过示例代码进行详细介绍。对大家的学习或者工作都有一定的参考价值,有需要的朋友可以参考一下。
前言
在web应用中,为了节省流量,减少传输数据的大小,提高传输效率,常用的压缩方法是gzip。今天,我们将介绍另一种更高效的压缩方法brotli。
Brotli是LZ77算法、霍夫曼编码和二阶上下文建模的现代变体。谷歌软件工程师在2015年9月发布了包含通用无损数据压缩的Brotli增强版,特别关注HTTP压缩。
注意:使用算法的前提是启用https,因为http请求的请求头中Accept-Encoding:gzip,deflate中没有br。
brotLi算法详情请见:https://link.zhihu.com/?.target=https%3A//en.Wikipedia.org/wiki/brotLi
浏览器对brotli协议的支持
不同层次上各种压缩算法的比较
从图中可以看出,brotlivsgzip的压缩算法整体性能更好,尤其是解压缩速度。我们在选择brotli算法或者gzip的时候,需要根据实际场景进行优化。
下载Brotli
Google/ngx_brotli从12月16日版本开始内置了google/brotli,所以我们不需要编译bagder/libbrotli库来使安装更容易。我们下载并解压google/ngx_brotli到/usr/src/ngx_brotli目录。
cd/usr/src
gitclonehttps://github.com/Google/ngx_brotLi.git
然后下载google/brotli解压到/usr/src/ngx_brotLi/deps/brotLi。
CD/usr/src/ngx_brotli/deps&;&rm-rfbrotli
git克隆git@github.com:Google/brotLi.git
CD/usr/src/ngx_brotLi&;&git子模块更新-初始化
编译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版本:nginx/1.14.2
下载nginx安装包
CD/usr/src
wgethttp://59.80.44.46/nginx.org/download/nginx-1.14.2.tar.gz
解压缩安装包
tar-xvfnginx-1.14.2.tar.gz
编译动态模块
首先进入解压后的nginx安装包的目录,配置configure,然后使用makemodules。
cdnginx-1.14.2
。/configure-with-compat-add-dynamic-module=/usr/src/ngx_brotLi
生成模块
参数:-add-add-dynamic-module=[=[模块源代码所在目录的绝对路径]
运行后,检查编译后的模块。
lsobjs/*。所以
输出:
objs/ngx_http_brotLi_filter_module.soobjs/ngx_http_brotLi_static_module.so
将编译好的模块文件复制到nginx动态模块加载目录。
CPobjs/{ngx_http_brotLi_filter_module.so,ngx_http_brotLi_static_module.so}/etc/nginx/modules
注册Brotli模块
为了方便管理nginx动态模块,建议新建一个modules.conf文件,单独管理动态模块。
touch/etc/nginx/modules.conf
将modules.conf文件引入/etc/nginx/nginx.conf配置文件,找到以下内容并进行修改:
PID/var/run/nginx.PID;
include/etc/nginx/modules.conf;
打开/etc/nginx/modules.conf,注册刚刚编译好的Brotli模块。
#brotLimodule
load_modulemodules/ngx_http_brotLi_filter_module.so;
load_modulemodules/ngx_http_brotLi_static_module.so;
启用Brotli压缩
Brotli和gzip可以共存,不用关闭gzip。
在/etc/nginx/nginx.conf打开Brotli:
http{ ... #gzip gzipon; gzip_min_length1k; gzip_buffers432k; gzip_http_version1.1; gzip_comp_level5; gzip_typestext/plaintext/cssapplication/jsonapplication/x-javascripttext/xmlapplication/xmlapplication/xml+rsstext/javascriptapplication/javascript; gzip_varyon; gzip_proxiedany; gzip_disable"MSIE[1-6]\."; #brotli brotlion; brotli_comp_level6; brotli_buffers168k; brotli_min_length20; brotli_typestext/plaintext/cssapplication/jsonapplication/x-javascripttext/xmlapplication/xmlapplication/xml+rsstext/javascriptapplication/javascriptimage/svg+xml; ... }gzip和brotli的配置详细信息
Gzip调优
使用gzip压缩功能可能会节省我们的带宽,加快传输速度,有更好的体验,节省我们的成本,所以这是一个重点。关于gzip的详细介绍,请点击这里;
Gzipon打开Gzip压缩。
gzip_min_length1k
设置允许压缩的页面的最小字节数。页面的字节数是从标题的内容长度获得的。默认值为0。无论页面有多大,建议设置为1K以上。如果小于1K,可能会越来越大。
gzip_buffers
压缩缓冲区大小,即申请4个32K的内存单元作为压缩结果流缓存。默认值是申请与原始数据大小相同的内存空来存储gzip压缩结果。
gzip_http_版本1.1
版本,用于设置和标识HTTP协议版本。默认值为1.1。目前,大多数浏览器已经支持GZIP解压缩,所以使用默认的。
gzip_comp_level5
压缩比,用于指定gzip压缩比。1压缩比最小,处理速度最快,9压缩比最大,传输速度快,但处理慢,也消耗CPU资源。建议设置为5。
gzip_types
指定压缩类型。文本/html类型将总是被压缩。
gzip_varyon
它与http头有关。为代理服务器添加vary标头。有些浏览器支持压缩,有些不支持,所以避免浪费不支持的,压缩。所以根据客户端的HTTP头判断是否需要压缩。
gzip_proxiedany
nginx作为反向代理时,启用、打开或关闭后端服务器返回的结果。匹配的前提是后端服务器必须返回包含Via的头。默认情况下是关闭的。可选参数值:
gzip_disable
禁用IE6的gzip压缩。IE6对gzip的压缩支持很差,会造成页面的假死。为了避免IE6出现问题,建议添加此参数。
brotli调整
谷歌认为互联网用户的时间是宝贵的,他们的时间不应该消耗在漫长的网页加载上,所以在2015年9月,谷歌推出了无损压缩算法Brotli。Brotli通过改进的LZ77算法、霍夫曼编码和二阶文本建模来压缩数据。与其他压缩算法相比,Brotli具有更高的压缩效率。关于brotli的详细介绍,请点击这里;
注意:如果没有安装brotli模块,这部分配置项不需要配置,可以跳过。
brotlion
打开brotli压缩功能。
brotli_comp_level6
压缩比,用于指定brotli压缩比。1压缩比最小,处理速度最快,11压缩比最大,传输速度快,但处理慢,也消耗CPU资源。默认值是6,就用默认值吧。
brotli_buffers168k
设置用于压缩响应的缓冲区数量和大小。默认情况下,缓冲区大小等于一个内存页面。默认值:324k|168k。
brotli_min_length20
设置长度要压缩的响应的最小值。长度仅由内容长度响应头字段确定。默认值为20。
brotli_types
指定压缩类型。文本/html类型将总是被压缩。
gzip和brotli的配置细节被添加到反向代理配置文件代码中:
proxy_set_header接受编码“”;
示例:
server{ ... location/{ ... proxy_set_headerAccept-Encoding""; ... } ... }重启nginx,使其配置生效。
systemctl重新启动nginx
Brotli压缩只能在https中生效,因为http请求中的Accept-Encoding:gzip,deflate请求头中没有br。
清理临时文件
每次编译后删除从应用程序包中提取的文件或目录是一个好习惯。
rm-rf/usr/src/{nginx-1.14.2/,ngx_brotli/}
最后检查是否生效
打开网页,用chromedevelopertools调试,你会在网络一栏找到content-encoding:br。同时,网络时间也会明显减少。
这就是本文的全部内容。希望对大家的学习有帮助,支持我们。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)