Nginx使用Gzip算法对报文进行压缩详解

Nginx使用Gzip算法对报文进行压缩详解,第1张

Nginx使用Gzip算法对报文进行压缩详解

本文主要介绍Nginx的Gzip函数的相关信息,通过示例代码详细介绍。对大家学习或使用Nginx有一定的参考价值。有需要的话一起学吧。

什么是HTTP压缩

有时,客户端和服务器之间会传输大量的消息数据,这会占用大量的网络带宽和时间。为了节省带宽,加快消息的响应速度,传输的消息数据可以先压缩再传输。

HTTP支持多种消息压缩算法。下面是一个常见的请求头。从Accept-Encoding字段可以看出,支持gzip、deflate和br压缩算法。本文重点研究使用Gzip算法压缩消息,如压缩HTML、Javascript、CSS文件。压缩后可以大大减少网络传输的数据量,提高用户显示网页的速度。

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding:gzip,deflate,br Accept-Language:zh-CN,zh;q=0.9 Cache-Control:max-age=0 Connection:keep-alive Host:localhost:8000 If-Modified-Since:Tue,21Apr202014:09:01GMT If-None-Match:"5e9efe7d-264" Upgrade-Insecure-Requests:1 User-Agent:Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/71.0.3578.98Safari/537.36

任何技术都是双面的。虽然HTTP压缩可以减少带宽占用,加快响应速度,但是由于需要额外的压缩和解压缩过程,会占用客户端或服务器端的一些计算资源。

了解HTTP的读者都知道,可以对HTTP的报纸样式进行编码和加密。其实HTTP压缩是一种特殊的编码方式,可以大大减少消息的数量,相应的解决方案可以还原原始消息。(我们可以看到,其实压缩技术的本质是一种编码方式。)

HTTP压缩的使用场景

从上面HTTP压缩的介绍可以看出,该技术是一种优化技术,常用于压缩服务器返回的消息,以节省带宽,加快响应速度。

下面简单介绍一下HTTP使用Gzip压缩的过程。

  • 从浏览器向Web服务器发送Http请求,请求中包含accept-encoding:gzip,deflate,br。(告诉服务器浏览器支持gzip压缩)
  • 收到请求后,Web服务器生成原始响应,其中包括原始内容类型和内容长度。
  • Web通过Gzip对响应进行编码。编码后,头中有Content-Type和Content-Length(压缩大小),并添加了Content-Encoding:gzip。然后,响应被发送到浏览器。
  • 收到响应后,浏览器根据Content-Encoding:gzip对响应进行解码。获取原始响应,然后显示网页。
  • 客户端也可以向服务器发送压缩数据,请求数据可以通过代码解压缩。为了规范起见,Content-Encoding:gzip也应该添加到请求中。

    使用Nginx进行HTTP压缩

    NGX提供对HTTPGzip压缩的支持。在这里,我们来看看如何压缩返回的消息以适应Nginx。

    在NGX中,Gzip函数由ngx_http_gzip_module、ngx_http_gzip_static_module和ngx_http_gunzip_module支持。正常情况下,Nginx会默认编译
    这些模块。您可以通过nginx-V命令检查您的nginx安装是否包含这些模块。

    Gzip相关的指令可以在配置文件的http块、服务器块或位置块中。

    ngx_http_gzip_module模块

    X_http_Gzip_module模块主要负责打开和设置Gzip函数,在线实时压缩响应数据。本模块包含以下主要说明。

    #开启或者关闭Gzip功能,默认情况下,该指令设置为off,即不启用Gzip功能。只有将该指令设置为on时,其他指令设置才有效 gzipon|off #设置Gzip压缩文件使用缓存空间的大小 #默认值是:gzip_buffers324k|168k gzip_buffersnumbersize; #该指令用于设定Gzip压缩程度,包括级别1到级别9。 #级别1表示压缩程度最低,压缩效率最高;级别9表示压缩程度最高,压缩效率最低,最费时间。 #默认是1 gzip_comp_levellevel #针对不同种类客户端发起的请求,可以选择性地开启和关闭Gzip功能。 #支持正则表达式,其中,regex根据客户端的浏览器标志(User-Agent,UA)进行设置。 gzip_disableregex...; #该设置使用了正则表达式,其可以匹配UC字符串中包含MSIE4、MSIE5和MSIE6的所有浏览器。 #响应这些浏览器发出的请求时,Nginx服务器不进行Gzip压缩。 gzip_disableMSIE[4-6]\.; #早期的一些浏览器或者HTTP客户端,可能不支持Gzip自解压,因此用户有时会看到乱码,所以针 #对不同的HTTP协议版本,需要选择性地开启或者关闭Gzip功能。该指令用于设置开启Gzip功能的最低HTTP协议版本。 #默认设置为1.1版本,即只有客户端使用1.1及以上版本的HTTP协议时,才使用Gzip功能对响应输出数据进行压缩。 #从目前来看,绝大多数的浏览器都支持Gzip自解压,一般采用默认值即可. zip_http_version1.0|1.1; #该指令设置页面的字节数,当响应页面的大小大于该值时,才启用Gzip功能。 #建议设置成gzip_min_length1024; gzip_min_lengthlength; #用于设置Nginx服务器是否对后端服务器返回的结果进行Gzip压缩; #一般情况下,后端都是用来做restAPI接口,返回的数据量不会太大,不建议进行压缩 #真的需要对后端返回的数据进行压缩是可以再看下这块的内容 gzip_proxiedoff|expired|no-cache|no-store|private|no_last_modified|no_etag|auth|any...; #设置MIME类型,被设置的类型将被压缩,默认值是:text/html #该变量还可以取“*”,表示对所有MIME类型的页面数据进行Gzip压缩 #一般可以设置成:gzip_typestext/plainapplication/javascripttext/csstext/xml gzip_typesmime-type...; #开启后的效果是在响应头部添加了Accept-Encoding:gzip gzip_varyon|off;

    NGX_http_gzip_static_module模块

    X_http_Gzip_static_module模块主要负责搜索和发送Gzip函数预压缩的数据。这些数据存储在服务器上,后缀为。gz”。如果客户端请求的数据之前已经压缩过,并且客户端浏览器支持Gzip压缩,则直接返回压缩后的数据。

    该模块与ngx_http_gzip_module的主要区别在于,该模块使用静态压缩,http响应头包含Content-Length头字段来指示报纸样式的长度,该字段在服务器可以确定响应数据的长度时使用。后者默认使用分块编码动态压缩,主要适用于服务器无法确定响应数据长度的情况,比如下载大文件的情况,需要实时生成数据长度。

    模块指令类似于ngx_http_gzip_static_module模块,这里就不展开了。可以参考官方文件。

    该模块是Nginx服务器的可选HTTP模块。如果要使用,必须在配置Nginx程序时添加-with-http_gzip_static_module指令。

    ngx_http_gunzip_module模块

    NGX服务器支持响应输出数据流的Gzip压缩,需要客户端浏览器能够对Gzip压缩数据进行解压缩和处理。但是如果客户端本身不支持这个功能,Nginx服务器需要对数据进行解压缩后再发送。这些压缩数据可能来自后端服务器压缩或Nginx服务器预压缩。X_http_gunzip_module模块用于为不支持Gzip压缩数据处理的客户端浏览器解压缩压缩数据。

    同样,这个模块的指令使用也不是专门开发的,可以参考官方文档。

    现代浏览器一般都支持压缩,所以很少使用这个模块。

    配置列

    gzipon; gzip_min_length1000; gzip_proxiedexpiredno-cacheno-storeprivateauth; gzip_typestext/plainapplication/xml;

    为了使Nginx服务器能够全局应用Gzip压缩功能,可以将Gzip配置放在http全局块中。如果要区别对待每个虚拟主机,可以在对应的server
    块中添加自己的Gzip配置指令;

    阅读扩展

    平时开发的应用不一定都用Nginx。让我们看看其他Web服务器如何支持HTTP压缩。

    1.嵌入SpringBoot的Tomcat开启压缩功能。

    Tomcat作为servet容器+http服务器,也支持gzip压缩。使用传统的Tomcat,我们只需要在server.xml配置中打开HTTP压缩。
    需要在嵌入式版本下通过代码进行配置。Spring-boot内置的tomcat是嵌入式版本。一些默认的tomcat配置是通过内置的自动配置机制进行的,但是对于一些不常见的/高级的配置,spring-boot不提供条目。

    但是,由于springbean的特性,可以覆盖默认安装的bean,包括tomcat相关的配置。使用TomcatConnectorCustomizer接口打开压缩方案。

    publicclassConnC1implementsTomcatConnectorCustomizer{ @Override publicvoidcustomize(Connectorconnector){ ProtocolHandlerprotocolHandler=connector.getProtocolHandler(); if(protocolHandlerinstanceofHttp11NioProtocol){ Http11NioProtocolhttp11NioProtocol=(Http11NioProtocol)protocolHandler; http11NioProtocol.setCompression("on");//defaultoff http11NioProtocol.setCompressibleMimeType(); http11NioProtocol.setCompressionMinSize(2048);//default2048(B) http11NioProtocol.setMaxKeepAliveRequests(1);//default200 } } }

    关于Tomcat对HTTP压缩的支持,可以从Tomcat的CompressionConfig类开始寻找线索。

    事实上,如果您只是打开对压缩的支持,只需在SpringBoot中进行以下配置:

    server: compression: enabled:true min-response-size:1024 mime-types: application/json

    摘要

    关于Nginx的Gzip功能的这篇文章就到这里了。关于Nginx的Gzip功能的更多信息,请搜索我们之前的文章或者继续浏览下面的相关文章。希望你以后能支持我们!

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

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

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

    发表评论

    登录后才能评论

    评论列表(0条)

    保存