精华内容
下载资源
问答
  • 开启网站的 gzip 压缩功能,通常可以高达70%,也就是说,如果你的网页有30K,压缩之后就变成9K, 对于大部分网站,显然可以明显提高浏览速度(注:需要浏览器支持)。
  • 主要介绍了Nginx服务器的配置中开启文件Gzip压缩的方法,可以对CSS和JavaScript以及各种图片等web传输的文件进行压缩,需要的朋友可以参考下
  • ...2.httpd.conf中打开deflate_Module和headers_Module模块,具体做法为将 如下两...4.使用工具重新检测是否开启gzip压缩。具体的gzip检测工具访问地址可以到搜索引擎中去查找。
      1. 1.找到并打开apache/conf目录中的httpd.conf文件

      2. 2.httpd.conf中打开deflate_Module和headers_Module模块,具体做法为将 如下两句前面的#去掉:

      3. LoadModule deflate_module modules/mod_deflate.so
        LoadModule headers_module modules/mod_headers.so
        

      4. 3.在httpd.conf文件底部加入如下代码配置需要压缩的文件:

        <IfModule deflate_module>
        SetOutputFilter DEFLATE
        # Don’t compress images and other 
        SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary 
        SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary 
        SetEnvIfNoCase Request_URI .(?:pdf|doc)$ no-gzip dont-vary 
        AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css 
        AddOutputFilterByType DEFLATE application/x-javascript
        </IfModule>

      5. 4.使用工具重新检测是否开启gzip压缩。具体的gzip检测工具访问地址可以到搜索引擎中去查找。


    展开全文
  • 主要介绍了NodeJS服务器实现gzip压缩的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • Gzip压缩使用起来很简单,以前我也只是在客户端使用,服务器端不用管,所以我只用过GZIPInputStream来读取,用起来也没有问题。后来OkHttp开始流行,后来听说OkHttp会自动处理Gzip压缩的数据,不需要我们使用...

    Gzip压缩和解压的实现

    Gzip压缩使用起来很简单,以前我也只是在客户端使用,服务器端不用管,所以我只用过GZIPInputStream来读取,用起来也没有问题。后来OkHttp开始流行,后来听说OkHttp会自动处理Gzip压缩的数据,不需要我们使用GZIPInputStream来处理,于是我想验证一下是否真的是这样的,这时我就需要写个服务器端Demo了,发现行不通,会报错,找不到原因,老办法,先写个最简单Demo,把Gzip流用起来,整体思路如下:

    1. 创建一个很长的数据,一长串1,如:1111111111111111,1万个1
    2. 使用GZIPOutputStream压缩数据
    3. 使用GZIPInputStream解压数据

    具体代码如下(使用Kotlin语言编写):

    fun main() {
        // 原始数据
        val sb = StringBuffer()
        repeat(10000) { sb.append(1) } // 生成1万个1的字符串
        val rawBytes = sb.toString() .toByteArray(Charsets.UTF_8) // 原始数据
        println("压缩前size = ${rawBytes.size},  数据 = ${rawBytes.map { byteToHex(it) }}")
    
        // 压缩数据
        var baos = ByteArrayOutputStream()
        val gzipOut = GZIPOutputStream(baos)
        gzipOut.write(rawBytes)
        val gzipBytes = baos.toByteArray() // 拿到压缩后的数据
        println("压缩后size = ${gzipBytes.size},  数据 = ${gzipBytes.map { byteToHex(it) }}")
    
        // 解压数据
        val gzipIn = GZIPInputStream(ByteArrayInputStream(gzipBytes))
        baos.reset() // 重置内存流,以便重新使用
        var byte: Int
        while (gzipIn.read().also { byte = it } != -1) baos.write(byte)
        println("解压结果:size = ${baos.size()}, 数据 = ${String(baos.toByteArray(), Charsets.UTF_8)}")
    }
    
    /** 把字byte转换为十六进制的表现形式,如ff  */
    fun byteToHex(byte: Byte) = String.format("%02x", byte.toInt() and 0xFF)
    

    代码很简单,看似没什么问题,运行结果却出了异常,如下:

    压缩前size = 10000,  数据 = [31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31]
    压缩后size = 10,  数据 = [1f, 8b, 08, 00, 00, 00, 00, 00, 00, 00]
    Exception in thread "main" java.io.EOFException: Unexpected end of ZLIB input stream
    	at java.base/java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:245)
    	at java.base/java.util.zip.InflaterInputStream.read(InflaterInputStream.java:159)
    	at java.base/java.util.zip.GZIPInputStream.read(GZIPInputStream.java:118)
    	at java.base/java.util.zip.InflaterInputStream.read(InflaterInputStream.java:123)
    	at KtMainKt.main(KtMain.kt:31)
    	at KtMainKt.main(KtMain.kt)
    

    想不出这么简单的代码哪里会出问题,不就是一个读一个写吗?而且我发现不论我写什么数据,压缩后的数据结果都是一样的,说明是在写数据(压缩)的时候出了问题,百度也找不到原因,百度Gzip压缩的相关知识并没有得到答案,百度上面报的异常信息也没有答案,最后是读了一下JDK文档才发现了问题的原因(所以JDK文档是个好东西,要多看看),在GZIPOutputStream文档上有这么一个方法:

    finish() 完成将压缩数据写入输出流的操作,无需关闭底层流。
    

    之前我有试过调用输出流的flush方法,没想到要调用的竟然是finish方法,在GZIPOutputStream的wirte方法执行之后再调用一下finish方法即可,运行结果如下:

    压缩前size = 10000,  数据 = [31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31]
    压缩后size = 46,  数据 = [1f, 8b, 08, 00, 00, 00, 00, 00, 00, 00, ed, c1, 01, 0d, 00, 00, 00, c2, a0, 4c, ef, 5f, ce, 1c, 6e, 40, 01, 00, 00, 00, 00, 00, 00, 00, 00, c0, bf, 01, 5e, 62, 1a, 8f, 10, 27, 00, 00]
    解压结果:size = 10000,  数据 = 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
    

    从结果可以看到,压缩前的数据长度为10000,压缩后的长度为46,真是牛B呀。解压结果正确还原了1万个1,因为1万个1太长,上面的打印结果我是进行了删除的,所以大家不要觉得结果不对。

    学会了Gzip大家平时做传输时就可以节省大量的流量了,比如获取服务器端数据时可以让服务器压缩后再传输,我们给服务器传参数时,如果参数很大也可Gzip压缩后再传给服务器,又比如上传文本文件(如bug文件、log日志等)到服务器时,也可以Gzip压缩后再上传,节省流量、加快访问、提高用户体验耿耿的!

    OkHttp中的Gzip压缩处理

    听说Gzip压缩是自动处理的,我也是最近看到别人文章上说的,我之前一直是在请求头上加上gzip的,读流的时候就自己用GZIPInputStream来解压,也是没问题的,但关键是既然OkHttp自动处理了,则我们就不要自己处理了,于是我要写个Demo来验证一下。

    服务器端

    打开陈年老旧的Eclipse(因为在IntelliJ上写JavaEE不熟),写了个JavaEE的Demo,创建了一个Servlet,如下:

    /** 服务器端 */
    public class Hello extends HttpServlet {
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// 数据内容:一段Json
    		byte[] datas = "{name:\"张三\",age:18}".getBytes("UTF-8");							
    		
    		// 告诉客户端我们发送的数据是经过Gzip压缩的
    		response.setHeader("Content-Encoding", "gzip");		
    		
    		// 告诉客户端我们发送的数据是什么类型,以及用的什么编码
    		response.setContentType("application/json; charset=UTF-8"); 
    		
    		// 创建一个内存流,用于保存压缩后的数据
    		ByteArrayOutputStream baos = new ByteArrayOutputStream();	
    		
    		// 压缩数据
    		GZIPOutputStream gzipOut = new GZIPOutputStream(baos);
    		gzipOut.write(datas);
    		gzipOut.finish();
    		
    		// 告诉客户端我们发送的数据总共的长度
    		response.setContentLength(baos.size()); 
    		
    		// 把压缩后的数据传给客户端
    		response.getOutputStream().write(baos.toByteArray());
    	}
    
    
    }
    

    客户端

    客户端就使用了IntelliJ,Kotlin语言编写,OkHttp进行数据请求,代码如下:

    fun main() {
        val url = "http://localhost:8080/WebDemo/Hello"
        val request = Request.Builder().url(url).build()
    
        OkHttpClient().newCall(request).execute().use { response ->
            println(response.body()?.string())
        }
    }
    

    Kotlin是个好东西,OkHttp也是个好东西,写个请求就是这么简单,几行代码搞定,运行结果如下:

    {name:"张三",age:18}
    

    没有出现乱码,实验证明OkHttp自动帮我们进行了Gzip解压,我们不需要特殊处理,而且我们看打印结果有中文,中文并没有显示成乱码,说明OkHttp还会根据服务器端指定的编码来处理String。这样在我们去面试时,如果别人要问OkHttp的优点时这里就有两点可说了:

    1. OkHttp会自动进行Gzip处理
    2. OkHttp会根据响应头中指定的编码来处理字符数据

    接下来我们继续实验上面的两条优点

    1、实验:OkHttp对Gzip数据的处理

    我们在客户端代码中打印一下响应体中的所有响应头:

    OkHttpClient().newCall(request).execute().use { response ->
        response.headers()?.names()?.forEach { key -> println("$key=${response.header(key)}")}
        println(response.body()?.string())
    }
    

    运行客户端,打印结果如下:

    Content-Type=application/json;charset=UTF-8
    Date=Mon, 23 Mar 2020 09:22:38 GMT
    Server=Apache-Coyote/1.1
    {name:"张三",age:18}
    

    姨,奇怪了!服务器明明告诉了客户端数据是经过Gzip压缩的,怎么响应头里看不到Gzip呢?这其是OkHttp把这个Gzip的Header给删除了,因为它已经帮我们把Gzip的数据给解压了,所以Header里面就没必要有Gzip的Header存在,意思就是告诉你数据没有压缩了,你直接使用就行了,千万别自己拿个GZIPInputStream再解压了,如果再解压一次肯定就乱码了。

    接下来把服务器端代码中的这行代码注释掉:

    response.setHeader("Content-Encoding", "gzip");		
    

    再次运行客户端,打印结果如下:

    Content-Length=42
    Content-Type=application/json;charset=UTF-8
    Date=Mon, 23 Mar 2020 09:23:54 GMT
    Server=Apache-Coyote/1.1
           ��K�M�Rz�g���J:��V�� )F��     
    

    乱码,因为服务器没有告诉客户端数据是经过Gzip压缩的,所以OkHttp就不会使用Gzip来解压,不解压直接当字符串来用肯定是乱码啊。

    这时,我们把上面注释的代码再恢复回来,修改一下客户端,以告诉服务器我们可以处理Gzip压缩的数据:

    val request = Request.Builder().url(url).header("Accept-Encoding", "gzip").build()
    

    再次运行,客户端,打印结果如下:

    Content-Encoding=gzip
    Content-Length=42
    Content-Type=application/json;charset=UTF-8
    Date=Mon, 23 Mar 2020 09:25:35 GMT
    Server=Apache-Coyote/1.1
           ��K�M�Rz�g���J:��V�� )F��    
    

    从上面打印的响应头中我们看到了关于Gzip的Header,这就说明数据是经过压缩的,需要进行解压,然而我们并没有进行解压,所以数据乱码了,这说明只要我们在请求头里加上Gzip的Header,就表示我们希望要自己处理Gzip,需要自己解压,OkHttp就不会帮我们处理了。这样有什么用呢?有时候想自己解压啊,比如我们在获取数据的时候想显示获取进度的百分比,这种情况就需要自己去读流,而不是OKHttp帮我们读流。

    对于Gzip请求头,服务器在收到请求时会读取这个请求头,如果有gzip头,则服务器把数据gzip压缩后再传给客户端,如果没有gzip头,则服务器不会压缩,直接把数据传给客户端。这时你可能会觉得郁闷,如果我不加Gzip请求头,则服务器不会给我压缩数据,如果我加了Gzip请求头,虽然服务器给我压缩数据了,但是OkHttp又不会自动给我解压,怎么解?其实不存在这个问题,虽然我们在请求时没有加入Gzip请求头,但是OkHttp会自动帮我们加入的,怎么验证呢?使用Fiddler抓包工具抓包一看就知道,具体如何抓包这里就不讲解了,大家可以百度一下很多教程的,这里就截图给大家看一下抓包OkHttp请求,OkHttp确实是自动给我们加入了Gzip请求头的:
    在这里插入图片描述

    2、实验:OkHttp对字符编码的处理

    把服务器端的这行代码注释掉:

    response.setContentType("application/json; charset=UTF-8"); 
    

    运行客户端,打印结果如下:

    Date=Mon, 23 Mar 2020 10:01:57 GMT
    Server=Apache-Coyote/1.1
    {name:"张三",age:18}
    

    在响应头中看不到关于数据编码的响应头了,但是客户端的中文显示正常,说明OkHttp默认使用UTF-8进行编码,我们再把服务器端设置编码为GBK,如下:

    response.setContentType("application/json; charset=GBK"); 
    

    再次运行客户端,打印结果如下:

    Content-Type=application/json;charset=GBK
    Date=Mon, 23 Mar 2020 10:07:25 GMT
    Server=Apache-Coyote/1.1
    {name:"寮犱笁",age:18}
    

    结果中文显示为乱码,因为服务器的数据是以UTF-8编码进行传输的,却告诉客户端使用GBK编码来解析,肯定是乱码的。我们修改服务器的数据以GBK进行编码,如下:

    byte[] datas = "{name:\"张三\",age:18}".getBytes("GBK");
    

    再次运行,结果如下:

    Content-Type=application/json;charset=GBK
    Date=Mon, 23 Mar 2020 10:09:40 GMT
    Server=Apache-Coyote/1.1
    {name:"张三",age:18}
    

    OK,结果正常,这些实验充分说明了OkHttp会以响应头中指定的编码来处理字符数据。

    总结

    1. 在发送请求时,OkHttp会自动加入Gzip请求头,当返回的数据带有Gzip响应头时,OkHttp会自动帮我们解压数据。也就是说,对于Gzip,我们不需要做任何处理。如果我们在请求里加入Gzip请求头,则表明我们想要自己处理Gzip数据,此时OkHttp就不会给我们解压数据了。
    2. 在处理字符数据时,如果是使用OkHttp的response.body()?.string()方法,或者使用OkHttp的response.body().charStream()来读取字符,则OkHttp会根据响应头中的编码来处理字符,如果响应头中没有编码,则默认使用UTF-8编码来处理字符,也可以认为对于字符数据的编码我们不需要做任何处理。除非服务器端没有指定字符编码,比如服务器使用GBK编码发送数据,但是又没在响应头中声明编码,则OkHttp会以UTF-8处理则会乱码,这样的情况应该很少出现,除非是小学生写服务器端。
    展开全文
  • 服务器端如何开启GZIP压缩功能

    千次阅读 2018-05-07 07:43:20
    在负载均衡中有一个必须要做的事情就是给服务器开启GZIP压缩功能,对用户请求的页面进行压缩处理,以达到节省网络带宽,提高网站速度的作用。 GZIP是若干文件压缩程序的简称,通常指GNU计划的实现,此处的GZIP代表的...

    我们知道做好负载均衡对网站的正常运行,用户体验相当重要。在负载均衡中有一个必须要做的事情就是给服务器开启GZIP压缩功能,对用户请求的页面进行压缩处理,以达到节省网络带宽,提高网站速度的作用。

    GZIP是若干文件压缩程序的简称,通常指GNU计划的实现,此处的GZIP代表的就是GUN ZIP,这也是HTTP1.1协议定义的两种压缩方法中最常用的一种压缩方法,客户端浏览器大都支持这种压缩格式。接下来,DNSLA将介绍apache、IIS、nginx 这些现在流行的web服务器如何开启GZIP压缩的方法。

    Apache如何开启GZIP功能

    Apache开启GZIP要看查看是否已经开启mod_deflate模块,如果没有则需要先加载,在配置文件httpd.conf中将

    LoadModule deflate_module modules/mod_deflate.so
    
    LoadModule headers_module modules/mod_headers.so
    复制代码

    前面的#号去掉。DNSLA建议,如果对apache的配置文件不太懂的客户在修改配置文件之前对配置文件进行备份。

    开启模块后,在httpd.conf配置文件的最下面空白处添加一下内容:

    <IfModule mod_deflate.c>
    # 告诉 apache 对传输到浏览器的内容进行压缩
    SetOutputFilter DEFLATE
    # 压缩等级 9
    DeflateCompressionLevel 9
    </IfModule>
    复制代码

    这样就能对所有文件进行 gzip 压缩了。压缩等级是个 1-9 之间的整数,取值范围在 1(最低) 到 9(最高)之间,不建议设置太高,虽然有很高的压缩率,但是占用更多的CPU资源。

    实际开发中我们并不需要对所有文件进行压缩,比如我们无需对图片文件进行gzip压缩,因为图片文件(一般为jpg、png等格式)本身已经压缩过了,再进行gzip压缩可能会适得其反(详见图片要启用gzip压缩吗?绝对不要!,背景图片千万不要gzip压缩,尤其是PNG),类似的还有 PDF 以及音乐文件。所以我们可以设置过滤指定文件或者对指定文件进行压缩。

    比如我们要对图片等特殊文件不进行 gzip 压缩处理:

    <IfModule mod_deflate.c>
    # 告诉 apache 对传输到浏览器的内容进行压缩
    SetOutputFilter DEFLATE
    # 压缩等级 9
    DeflateCompressionLevel 9
    #设置不对后缀gif,jpg,jpeg,png的图片文件进行压缩
    SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
    </IfModule>
    复制代码

    或者指定文件格式进行压缩:

    <IfModule mod_deflate.c>
    # 压缩等级 9
    DeflateCompressionLevel 9
    # 压缩类型 html、xml、php、css、js
    AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript application/x-httpd-php
    AddOutputFilter DEFLATE js css
    </IfModule>
    复制代码

    其中DeflateCompressionLevel 的意思是压缩等级,共分为1-9,9级为最高,不建议使用太高的压缩比,这样会对CPU产生太大的负担。

    IIS如何开启GZIP功能

    打开IIS管理工具,在右键网站打开网站属性,在服务选项卡中开启HTTP压缩,不建议选中压缩应用程序文件,但一定要选上压缩静态文件,不然就等于没有压缩,达不到负载均衡了。然后选中我那个站下面那个服务器扩展,新建一个服务器扩展,名字为GZIP,下面的添加文件路径为:c:\windows\system32\inetsrv\gzip.dll,然后启用这个扩展。DNSLA提醒大家,还没结束,第三步是,我们要修改配置文件,在配置文件之前要停止IIS服务,(DNSLA提醒大家一定要先关闭IIS服务)打开C:\Windows\System32\inetsrv\MetaBase.xml,这个文件很大,找到下面一段信息:

    <IIsCompressionScheme  Location ="/LM/W3SVC/Filters/Compression/gzip"
    
    HcCompressionDll="%windir%\system32\inetsrv\gzip.dll"
    
    HcCreateFlags="1"
    
    HcDoDynamicCompression="TRUE"
    
    HcDoOnDemandCompression="TRUE"
    
    HcDoStaticCompression="TRUE"
    
    HcDynamicCompressionLevel="0"
    
    HcFileExtensions="htm
    
    html
    
    txt"
    
    HcOnDemandCompLevel="10"
    
    HcPriority="1"
    
    HcScriptFileExtensions="asp
    
    dll
    
    exe"
    
    >
    
    </IIsCompressionScheme>
    复制代码

    修改这个文件是要增加一些要进行压缩的文件后缀,其中 HcFileExtensions 是静态文件的扩展名,增加 js 和 css 等;HcScriptFileExtensions 为动态文件的扩展名,增加 aspx,HcDynamicCompressionLevel改成9,(0-10,6是性价比最高的一个)。

    然后需要重启一下IIS服务即可。

    Nginx如何开启GZIP功能

    相对apache 和 IIS nginx开启GZIP简单很多,只需要打开配置文件 nginx.conf找到gzip on 把前面的注释符号#去掉即可开启GZIP服务。然后配置GZIP即可。

    下面是一个相对优化不错的配置,DNSLA建议使用。

    Gzip on;
    
    gzip_min_length 1024;
    
    gzip_buffers   4  8k;
    
    gzip_types   text/plain application/x-javascript text/css  application/xml;
    复制代码
    展开全文
  • 一、什么是gzip ​ gzip是一种数据格式,...当应用Gzip压缩到一个纯文本文件时,效果是非常明显的,大约可以减少70%以上的文件大小。这取决于文件中的内容。 ​ 利用Apache中的Gzip模块,我们可以使用Gzip压缩算...

    一、什么是gzip

    ​ gzip是一种数据格式,默认且目前仅使用deflate算法压缩data部分;

    ​ Gzip是一种流行的文件压缩算法,现在的应用十分广泛,尤其是在Linux平台。当应用Gzip压缩到一个纯文本文件时,效果是非常明显的,大约可以减少70%以上的文件大小。这取决于文件中的内容。

    ​ 利用Apache中的Gzip模块,我们可以使用Gzip压缩算法来对Apache服务器发布的网页内容进行压缩后再传输到客户端浏览器。这样经过压缩后实际上降低了网络传输的字节数,最明显的好处就是可以加快网页加载的速度。

    ​ 网页加载速度加快的好处不言而喻,除了节省流量,改善用户的浏览体验外,另一个潜在的好处是Gzip与搜索引擎的抓取工具有着更好的关系。例如 Google就可以通过直接读取gzip文件来比普通手工抓取更快地检索网页。在Google网站管理员工具(Google Webmaster Tools)中你可以看到,sitemap.xml.gz 是直接作为Sitemap被提交的。

    ​ 而这些好处并不仅仅限于静态内容,PHP动态页面和其他动态生成的内容均可以通过使用Apache压缩模块压缩,加上其他的性能调整机制和相应的服务器端 缓存规则,这可以大大提高网站的性能。因此,对于部署在Linux服务器上的PHP程序,在服务器支持的情况下,我们建议你开启使用Gzip Web压缩。

    PS**:详情参考:http://baike.baidu.com/item/gzip?fr=aladdin**

    二、什么是deflate

    ​ DEFLATE是同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法。

    ​ 它最初是由Phil Katz为他的PKZIP归档工具第二版所定义的,后来定义在RFC 1951规范中。

    ​ 人们普遍认为DEFLATE不受任何专利所制约,并且在LZW(GIF文件格式使用)相关的专利失效之前,这种格式除了在ZIP文件格式中得到应用之外也在gzip压缩文件以及PNG图像文件中得到了应用。

    ​ DEFLATE压缩与解压的源代码可以在自由、通用的压缩库zlib上找到。

    ​ 更高压缩率的DEFLATE是7-zip所实现的。AdvanceCOMP也使用这种实现,它可以对gzip、PNG、MNG以及ZIP文件进行压缩从而得到比zlib更小的文件大小。在Ken Silverman的KZIP与PNGOUT中使用了一种更加高效同时要求更多用户输入的DEFLATE程序。

    ​ deflate是一种压缩算法,是huffman编码的一种加强。

    ​ deflate与gzip解压的代码几乎相同,可以合成一块代码。

    三、web服务器处理http压缩的过程

    ​ \1. Web服务器接收到浏览器的HTTP请求后,检查浏览器是否支持HTTP压缩(Accept-Encoding 信息);

    ​ \2. 如果浏览器支持HTTP压缩,Web服务器检查请求文件的后缀名;

    ​ \3. 如果请求文件是HTML、CSS等静态文件,Web服务器到压缩缓冲目录中检查是否已经存在请求文件的最新压缩文件;

    ​ \4. 如果请求文件的压缩文件不存在,Web服务器向浏览器返回未压缩的请求文件,并在压缩缓冲目录中存放请求文件的压缩文件;

    ​ \5. 如果请求文件的最新压缩文件已经存在,则直接返回请求文件的压缩文件;

    ​ \6. 如果请求文件是动态文件,Web服务器动态压缩内容并返回浏览器,压缩内容不存放到压缩缓存目录中。

    下面是两个演示图:

    未使用Gzip:
    在这里插入图片描述
    开启使用Gzip后:
    在这里插入图片描述

    四、gzip与deflate区别

    ​ deflate使用inflateInit(),而gzip使用inflateInit2()进行初始化,比 inflateInit()多一个参数: -MAX_WBITS,表示处理raw deflate数据。因为gzip数据中的zlib压缩数据块没有zlib header的两个字节。使用inflateInit2时要求zlib库忽略zlib header。在zlib手册中要求windowBits为8…15,但是实际上其它范围的数据有特殊作用,见zlib.h中的注释,如负数表示raw deflate。

    ​ Apache的deflate变种可能也没有zlib header,需要添加假头后处理。即MS的错误deflate (raw deflate).zlib头第1字节一般是0x78, 第2字节与第一字节合起来的双字节应能被31整除,详见rfc1950。例如Firefox的zlib假头为0x7801,python zlib.compress()结果头部为0x789c。

    ​ deflate 是最基础的算法,gzip 在 deflate 的 raw data 前增加了 10 个字节的 gzheader,尾部添加了 8 个字节的校验字节(可选 crc32 和 adler32) 和长度标识字节。

    ​ 安装它们的Apache Web服务器版本的差异。Apache 1.x系列没有内建网页压缩技术,所以才去用额外的第三方mod_gzip 模块来执行压缩。而Apache 2.x官方在开发的时候,就把网页压缩考虑进去,内建了mod_deflate 这个模块,用以取代mod_gzip。虽然两者都是使用的Gzip压缩算法,它们的运作原理是类似的。

    ​ 压缩质量。mod_deflate 压缩速度略快而mod_gzip 的压缩比略高。一般默认情况下,mod_gzip 会比mod_deflate 多出4%~6%的压缩量。

    ​ 对服务器资源的占用。 一般来说mod_gzip 对服务器CPU的占用要高一些。mod_deflate 是专门为确保服务器的性能而使用的一个压缩模块,mod_deflate 需要较少的资源来压缩文件。这意味着在高流量的服务器,使用mod_deflate 可能会比mod_gzip 加载速度更快。即在服务器性能足够的情况下,使用mod_gzip,虽然会耗费服务器性能,但是值得(压缩更快更好);在服务器性能不足的情况下,使用mod_deflate 确保性能。

    ​ 从Apache 2.0.45开始,mod_deflate 可使用DeflateCompressionLevel 指令来设置压缩级别。该指令的值可为1(压缩速度最快,最低的压缩质量)至9(最慢的压缩速度,压缩率最高)之间的整数,其默认值为6(压缩速度和压缩质 量较为平衡的值)。这个简单的变化更是使得mod_deflate 可以轻松媲美mod_gzip 的压缩。

    五、开启mod_gzip、mod_deflate

    ​ Apache上利用Gzip压缩算法进行压缩的模块有两种:mod_gzip 和mod_deflate。 要使用Gzip Web压缩,请首先确定你的服务器开启了对这两个组件之一的支持。在Linux服务器上,现在已经有越来越多的空间商开放了对它们的支持,有的甚至是同时 支持这两个模块的。例如目前Godaddy、Bluehost及DreamHosts等空间商的服务器都已同时支持mod_gzip 和mod_deflate。

    ​ 通过查看HTTP头,我们可以快速判断使用的客户端浏览器是否支持接受gzip压缩。若发送的HTTP头中出现以下信息,则表明你的浏览器支持接受相应的gzip压缩:

    ​ Accept-Encoding: gzip 支持mod_gzip

    ​ Accept-Encoding: deflate 支持mod_deflate

    ​ Accept-Encoding: gzip,deflate 同时支持mod_gzip 和mod_deflate

    ​ mod_deflate 是apache自带的模块,当然是在apache 2后支持的,以前1的时候是mod_gzip,启用mod_deflate可以很好的为节省网页大小,只不过是占用服务器的资源和内存.用户看到页面的速度会大大加快。在apache2.0以上(包括apache2.0)的版中gzip压缩使用的是mod_deflate模块

    1. 查看apache的安装模式
    apachectl -l

    发现 mod_so.c,ok可以动态加模块,不用重新编译。

    2. 安装mod_deflate
    找到原有的apache安装包安装mod_deflate
    cd httpd-2.0.59/modules/filters
    /usr/local/apache2/bin/apxs -i -c -a mod_deflate.c

    PS:apxs命令参数说明:
    ​ -i 此选项表示需要执行安装操作,以安装一个或多个动态共享对象到服务器的modules目录中。
    ​ -a 此选项自动增加一个LoadModule行到httpd.conf文件中,以激活此模块,或者,如果此行已经存在,则启用之。
    ​ -A 与 -a 选项类似,但是它增加的LoadModule命令有一个井号前缀(#),即此模块已经准备就绪但尚未启用。
    ​ -c 此选项表示需要执行编译操作。它首先会编译C源程序(.c)files为对应的目标代码文件(.o),然后连接这些目标代码和files中其余的目标代码文件(.o和.a),以生成动态共享对象dsofile 。如果没有指定 -o 选项,则此输出文件名由files中的第一个文件名推测得到,也就是默认为mod_name.so 。

    3修改Apache的http.conf文件,去除mod_deflate.so前面的注释

    LoadModule deflate_module modules/mod_deflate.so

    4在根目录中新建.htaccess文件,定制压缩规则

    #GZIP压缩模块配置

    #启用对特定MIME类型内容的压缩

    SetOutputFilter DEFLATESetEnvIfNoCase Request_URI .(?:gif|jpe?g|png|exe|t?gz|zip|bz2|sit|rar|pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary #设置不对压缩的文件AddOutputFilterByType DEFLATE text/html text/css text/plain text/xml application/x-httpd-php application/x-javascript #设置对压缩的文件

    5对指定的文件配置缓存的生存时间,去除mod_headers.so模块前面的注释

    LoadModule headers_module modules/mod_headers.so

    6在根目录中新建.htaccess文件,定制压缩规则

    #文件缓存时间配置

    <FilesMatch “.(flv|gif|jpg|jpeg|png|ico|swf|js|css)$”>

    Header set Cache-Control “max-age=2592000”

    里面的文件MIME类型可以根据自己情况添加,至于PDF 、图片、音乐文档之类的这些本身都已经高度压缩格式,重复压缩的作用不大,反而可能会因为增加CPU的处理时间及浏览器的渲染问题而降低性能。所以就没必要再通过Gzip压缩。通过以上设置后再查看返回的HTTP头,出现以下信息则表明返回的数据已经过压缩。即网站程序所配置的Gzip压缩已生效。

    Content-Encoding: gzip

    注:不管使用mod_gzip 还是mod_deflate,此处返回的信息都一样。因为它们都是实现的gzip压缩方式。

    遇到的问题以及解决:

    1:

    apach2 安装mod_deflate后restart,直接

    load /opt/apache/modules/mod_deflate.so into server: /opt/apache/modules/mod_deflate.so: undefined symbol: deflate 异常的痛苦

    什么ldd mod_deflate.so后再export LIB_LIBRARY_PATH呀,都试了N次,google也go了N天

    终于在google上go出来一篇文章,终于解决,方法如下: vi /usr/local/apache2/bin/apr-config 修改LDFLAGS=" " 为 LDFLAGS="-lz" 然后再apxs -ica mod_deflate.c 就OK了.

    2:
    apach2 安装mod_deflate后restart,直接

    module deflate_module is built-in and can’t be loaded …

    这说明该模块已经安装,不必再LoadModule deflate_module启用它。

    只需做

    展开全文
  • gzip压缩 使用 gzip 压缩可以降低网站带宽消耗,同时提升访问速度。 主要在nginx服务端将页面进行压缩,然后在浏览器端进行解压和解析, 目前大多数流行的浏览器都迟滞gzip格式的压缩,所以不用担心。 默认情况下,...
  • 首先,如果你需要压缩静态文件(HTML),需要在硬盘上建一个目录,并给它“IUSR_机器名”这个用户的写权限。
  • 一般服务器不会胡乱返回gzip压缩的数据,一般是客户端请求的头部里包含你浏览器能接受的压缩方式, Accept-Encoding:gzip,deflate,sdch 这里是gzip 、deflate、sdch这三种方式,这里不一一说明是指什么...
  • 摘要 本文总结了如何为使用IIS托管的网站启用Gzip压缩, 从而减少网页网络传输大小, 提高用户显示页面的速度. 二.前言. 本文的知识点是从互联网收集整理, 主要来源于中文wiki. 使用YSlow检测网站启用了哪些优化时, ...
  • Nginx 之七 服务器Gzip压缩

    千次阅读 2018-10-21 20:01:56
       Gzip压缩可以在http块,server块和location块中配置   Nginx服务器是通过ngx_http_gzip_module模块、ngx_http_gzip_static_module模块、ngx_http_gunzip_module模块对这些指令进行解析和处理。 语法 说明...
  • 开启Gzip是需要服务器支持的,在这里我们简单的使用php来判断服务器是否支持Gzip功能,具体如下,感兴趣的朋友可以参考下
  • iOS与Java服务器GZip压缩问题

    千次阅读 2013-08-07 18:06:08
    昨天搞了一天的GZip压缩,试了三种方式(libz库,ZipArchive,ASIHttpRequest),一开始都不成功。 理论上三个应该都能用的,但我都不行。等我试到第三种方式的时候才知道,不是我的问题,而是后台的问题(Java端...
  • NodeJS 服务器实现 gzip 压缩

    千次阅读 2018-10-17 00:03:04
    在浏览器向服务器请求静态资源时,服务器为了减小在网络传输过程中消耗的流量和时间,都是将静态资源经过压缩后返回给服务器的,实现压缩的算法有 deflate 和 gzip 等,最常用的是 gzip 压缩gzip 简介 在...
  • 首先让我介绍一下,我们可以使用两种不同的方法压缩内容:GZip 和 deflate。 介绍 GZip方法在早期的apache版本中使用(在Apache 1.3之前)。但在那之后apache引入了deflate方法,相比GZip并没有太大的效果(但仍是...
  • 把图片进行了压缩,70kb以上的banner用的大图,压缩成50kb左右。图片质量稍微下降了一点,没钱连高清图片都用不起,所以还是得有钱,赚钱。 第2步: js压缩。 昨天,也用了网上下载的js/css...
  • 而这些好处并不仅仅限于静态内容,PHP动态页面和其他动态生成的内容均可以通过使用Apache压缩模块压缩,加上其他的性能调整机制和相应的服务器端 缓存规则,这可以大大提高网站的性能。因此,对于部署在Linux服务器...
  • nginx配置gzip压缩页面

    2021-01-09 23:32:37
    经过gzip压缩后页面大小可以变为原来的30%甚至更小,这样,用户浏览页面的时候速度会块得多。gzip的压缩页面需要浏览器和服务器双方都支持,实际上就是服务器端压缩,传到浏览器后浏览器解压并解析。 Nginx的压缩...
  • vue gzip压缩服务器开启gzip

    千次阅读 2019-06-15 17:33:06
    threshold: 10240, // 对超过10k的数据压缩 deleteOriginalAssets: false // 不删除源文件 }) ]) } } else { return { plugins: defaultPluins } } }, 配置参数详解: asset: 目标资源名称。 ...
  • 如下图找到对应的文件,productionGzip改为true,开启Gzip压缩 找到下图的文件,这里是Gzip的配置 代码如下: webpackConfig.plugins.push( new CompressionWebpackPlugin({ asset: '[path].gz[query]', ....
  • 本文主要讲解基于 Vue + Vant ,实现移动端图片选择,并用 Canvas 压缩图片,最后上传至服务器。还会封装一个工具类,方便直接调用。 一、工具类封装 废话不多说先上代码,封装一个 CompressImageUtils 工具类: *...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 102,262
精华内容 40,904
关键字:

服务器gzip压缩