Nginx开启Brotli压缩算法实现过程详解

Nginx开启Brotli压缩算法实现过程详解,第1张

Nginx开启Brotli压缩算法实现过程详解

本文主要介绍支持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的头。默认情况下是关闭的。可选参数值:

  • 关闭所有代理结果数据的压缩。
  • 如果标头包含过期的标头信息,则Expired启用压缩。
  • No-cache如果标头包含Cache-Control:no-cache标头信息,则启用压缩。
  • 如果标头包含Cache-Control:No-store标头信息,则no-store启用压缩
  • 如果标头包含Cache-Control:private标头信息,则启用专用压缩。
  • 如果标头不包含上次修改的标头信息,No_last_modified将启用压缩。
  • No_ETag如果头不包含ETag头信息,则启用压缩。
  • 如果标头包含授权标头信息,则启用授权压缩。
  • Any无条件启用压缩
  • 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。同时,网络时间也会明显减少。

    这就是本文的全部内容。希望对大家的学习有帮助,支持我们。

    欢迎分享,转载请注明来源:内存溢出

    原文地址: http://outofmemory.cn/zz/774065.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-05-03
    下一篇 2022-05-03

    发表评论

    登录后才能评论

    评论列表(0条)

    保存