`

Web服务器处理HTTP压缩之gzip、deflate压缩

 
阅读更多

一、什么是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压缩模块配置<ifmodule mod_deflate.c>
#启用对特定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 #设置对压缩的文件</ifmodule>

 

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"
</FilesMatch>

 

里面的文件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启用它。

只需做<ifmodule mod_deflate.c>配置

分享到:
评论

相关推荐

    pako gzip 压缩和解压缩(支持中文)

    在本项目中,我们将关注如何使用pako库进行gzip压缩和解压缩,并解决在处理中英文内容时可能出现的乱码问题。 首先,让我们详细了解pako库。pako是基于zlib库的一个轻量级实现,它在浏览器和Node.js环境中都能运行...

    利用JAVASCRIPT即你想那个GZIP压缩与解压缩

    2. **解压缩过程**:同样使用`pako`库,我们可以调用`pako.ungzip`方法解压缩GZIP数据。解压缩后,我们通常会得到一个包含原始数据的ArrayBuffer,可以进一步转换回字符串或其他形式的数据。 **GZIP的工作原理** ...

    IIS上启用Gzip压缩(HTTP压缩)

    使用文本编辑器打开`C:\Windows\System32\inetsrv\MetaBase.xml`文件,定位至`"/LM/W3SVC/Filters/Compression/gzip"`和`"/LM/W3SVC/Filters/Compression/deflate"`节点,分别用于设置Gzip和Deflate压缩。...

    最简单的gzip压缩

    在本案例中,我们讨论的是“最简单的gzip压缩”,它是一种广泛使用的压缩格式,尤其在Web服务器上常用于减少HTTP响应大小,提高网页加载速度。 gzip是一种基于DEFLATE算法的压缩格式,它结合了LZ77的无损数据压缩和...

    apache开启gzip压缩网络传输减少带宽

    Gzip 压缩在 Web 服务器中广泛应用,因为它可以减少服务器的带宽成本和提高页面加载速度。 为什么需要开启 Gzip 压缩? 开启 Gzip 压缩可以带来以下几个好处: * 减少网络传输的带宽:Gzip 压缩可以将数据压缩到...

    pako gzip 压缩和解压缩(支持中文).rar

    gzip是一种广泛使用的数据压缩格式,它基于DEFLATE算法,常用于HTTP服务器上的文件传输以减少数据量。然而,由于编码问题,gzip在处理包含中文或其他非ASCII字符的文本时可能会出现乱码。pako库通过正确处理UTF-8...

    gzip压缩js,csss文件

    在Web服务器上启用gzip压缩,可以显著降低页面的加载时间,尤其是在带宽有限的情况下,效果尤为明显。 首先,我们要准备要压缩的js和css文件,并将它们放入一个名为“gzip”的文件夹下。这样做是为了方便管理和操作...

    ajax+pako.js实现gzip数据压缩上传,解决post数据过长问题

    在Web应用中,服务器通常支持gzip压缩,但客户端到服务器的数据传输默认不进行gzip压缩,需要我们手动处理。 接着,介绍pako.js。pako.js是一个JavaScript实现的压缩库,提供了gzip和deflate等算法的压缩与解压功能...

    C#实现页面GZip或Deflate压缩的方法

    总的来说,C#实现页面GZip或Deflate压缩是通过利用`System.IO.Compression`命名空间下的`GZipStream`和`DeflateStream`类,结合HTTP请求处理管道中的事件机制,对响应内容进行实时压缩,以提高网络传输效率。...

    php gzip压缩输出的实现方法

    除了Apache服务器,其他Web服务器软件如Nginx也提供了gzip压缩的功能。在实际部署时,还需要考虑服务器的性能和网络带宽等因素,以确保启用gzip压缩不会对服务器的正常运行产生负面影响。通常情况下,gzip压缩是推荐...

    IIS启用GZIP压缩js、css无效的原因及解决方法.docx

    IIS(Internet Information Services)是微软提供的一个Web服务器,支持多种功能,包括GZIP压缩。当用户发现IIS启用了GZIP压缩,但js和css文件并未被压缩时,这通常是因为默认配置仅针对HTML文件进行压缩。要解决这...

    java实现gzip ajax请求gzip压缩

    在IT行业中,gzip是一种广泛使用的数据压缩算法,尤其在Web服务中,用于减少网络传输的数据量,从而提高页面加载速度和降低服务器带宽消耗。Java作为后端开发的重要语言,支持处理gzip压缩,而Ajax(Asynchronous ...

    Gzip压缩.docx

    2. 服务器接收到请求后,检测到`Accept-Encoding`头,就会对响应内容进行gzip或deflate压缩。然后在HTTP响应头中设置`Content-Encoding: gzip`,告知客户端响应内容已被压缩。 3. 客户端接收到带有`Content-...

    启用 IHS GZip 压缩提高网络 IO 性能

    文档 `LWP HTTP_Server_Upgrde.doc` 可能提供了有关如何在 LWP (Lightweight Web Server) 或者 HTTP Server 升级过程中处理 GZip 压缩的详细信息,包括可能遇到的问题和解决方案,但具体内容无法在这里给出,因为它...

    文件Gzip解压缩,vs

    解压缩Gzip文件时,首先要识别文件头,然后使用DEFLATE算法对压缩数据进行逆向处理,恢复原始数据。在Windows系统中,可以使用命令行工具`gzip -d`或图形界面工具如7-Zip进行解压。在编程环境中,例如C++,可以使用...

    php gzip 压缩js或css

    在Web开发中,提高页面加载速度是提升用户体验的关键因素之一。`PHP Gzip`压缩是一种常见的优化技术,它能够有效地减小CSS和JS文件的大小,从而缩短客户端的响应时间。`Gzip`是一种广泛使用的数据压缩算法,通过在...

    【ASP.NET编程知识】.Net Core HttpClient处理响应压缩详细.docx

    HttpClient是.NET Core中用于发送HTTP请求的重要类,它支持自动处理服务器返回的压缩响应。本文将深入探讨HttpClient如何处理响应压缩以及如何在不同场景下使用。 一、HttpClient处理响应压缩的使用方式 在.NET ...

    gzip解压和压缩,在内存使用

    gzip是一种广泛使用的数据压缩算法,尤其在Web服务中,它被用来减少数据传输量,从而提高网络传输效率和用户体验。本文将深入探讨gzip压缩和解压缩的原理、使用方法以及在HTTP中的应用。 gzip的核心是DEFLATE算法,...

    httpwatch 服务器gzip响应导致不能查看stream的响应

    首先,gzip是一种常用的网络数据压缩格式,被广泛应用于Web服务器,以减少数据传输量,加快网页加载速度。Apache服务器通过启用如deflate模块来实现gzip压缩。当服务器返回gzip压缩的数据时,浏览器会自动解压并呈现...

Global site tag (gtag.js) - Google Analytics