一、gzip介绍

gzip是GNU zip的缩写,它是一个GNU自由软件的文件压缩程序,也经常用来表示gzip这种文件格式。软件的作者是Jean-loup Gailly和Mark Adler。1992年10月31日第一次公开发布,版本号是0.1,目前的稳定版本是1.2.4。

Gzip主要用于Unix系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。 当应用Gzip压缩到一个纯文本文件时,效果是非常明显的,经过GZIP压缩后页面大小可以变为原来的40%甚至更小,这取决于文件中的内容。

  HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。web开发中可以通过gzip压缩页面来降低网站的流量,而gzip并不会对cpu造成大量的占用,略微上升,也是几个百分点而已,但是对于页面却能压缩30%以上,非常划算。

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

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

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

二、Web服务器处理HTTP压缩的过程如下:

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

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

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

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

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

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

下面是两个演示图:

                                       未使用Gzip:


                                  开启使用Gzip后:

三、启用apache的gzip功能

Apache上利用Gzip压缩算法进行压缩的模块有两种:mod_gzip 和mod_deflate。要使用Gzip Web压缩,请首先确定你的服务器开启了对这两个组件之一的支持。

虽然使用Gzip同时也需要客户端浏览器的支持,不过不用担心,目前大部分浏览器都已经支持Gzip了,如IE、Mozilla Firefox、Opera、Chrome等。

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

  1. Accept-Encoding: gzip 支持mod_gzip
  2. Accept-Encoding: deflate 支持mod_deflate
  3. Accept-Encoding: gzip,deflate 同时支持mod_gzip 和mod_deflate

如firebug查看:

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

如果服务器开启了对Gzip组件的支持,那么我们就可以在http.conf或.htaccess里面进行定制,下面是一个.htaccess配置的简单实例:

mod_gzip 的配置:

  1. # mod_gzip:
  2. <ifModule mod_gzip.c>
  3. mod_gzip_on Yes
  4. mod_gzip_dechunk Yes
  5. mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$
  6. mod_gzip_item_include handler ^cgi-script$
  7. mod_gzip_item_include mime ^text/.*
  8. mod_gzip_item_include mime ^application/x-javascript.*
  9. mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
  10. <ifModule>

mod_deflate的配置实例:

打开打开apache
配置文件httpd.conf

将#LoadModule deflate_module modules/mod_deflate.so去除开头的#号

  1. # mod_deflate:
  2. <ifmodule mod_deflate.c>
  3. DeflateCompressionLevel 6 #压缩率, 6是建议值.
  4. AddOutputFilterByType DEFLATE text/plain
  5. AddOutputFilterByType DEFLATE text/html
  6. AddOutputFilterByType DEFLATE text/xml
  7. AddOutputFilterByType DEFLATE text/css
  8. AddOutputFilterByType DEFLATE text/javascript
  9. AddOutputFilterByType DEFLATE application/xhtml+xml
  10. AddOutputFilterByType DEFLATE application/xml
  11. AddOutputFilterByType DEFLATE application/rss+xml
  12. AddOutputFilterByType DEFLATE application/atom_xml
  13. AddOutputFilterByType DEFLATE application/x-javascript
  14. AddOutputFilterByType DEFLATE application/x-httpd-php
  15. AddOutputFilterByType DEFLATE image/svg+xml
  16. </ifmodule>

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

  1. Content-Encoding: gzip

firebug查看:

注意:

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

2)CompressionLevel
9是指压缩程度的等级(设置压缩比率),取值范围在从1到9,9是最高等级。据了解,这样做最高可以减少8成大小的传输量(看档案内容而定),最少也能够
节省一半。 CompressionLevel 预设可以采用 6 这个数值,以维持耗用处理器效能与网页压缩质量的平衡.
不建议设置太高,如果设置很高,虽然有很高的压缩率,但是占用更多的CPU资源.
3) 对已经是压缩过的图片格式如jpg,音乐档案如mp3、压缩文件如zip之类的,就没必要再压缩了。

四、mod_gzip 和mod_deflate的主要区别是什么?使用哪个更好呢?

第一个区别是安装它们的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_deflate?

第三个区别是对服务器资源的占用:

一般来说mod_gzip 对服务器CPU的占用要高一些。mod_deflate
是专门为确保服务器的性能而使用的一个压缩模块,mod_deflate
需要较少的资源来压缩文件。这意味着在高流量的服务器,使用mod_deflate 可能会比mod_gzip 加载速度更快。

不太明白?简而言之,如果你的网站,每天不到1000独立访客,想要加快网页的加载速度,就使用mod_gzip。虽然会额外耗费一些服务器资源,
但也是值得的。如果你的网站每天超过1000独立访客,并且使用的是共享的虚拟主机,所分配系统资源有限的话,使用mod_deflate
将会是更好的选择。

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

P.S. 对于没有启用以上两种Gzip模块的虚拟空间,还可以退而求其次使用php的zlib函数库(同样需要查看服务器是否支持)来压缩文件,只是这种方法使用起来比较麻烦,而且一般会比较耗费服务器资源,请根据情况慎重使用。


五、zlib.output_compression和ob_gzhandler编码方式压缩

服务器不支持mod_gzip、mod_deflate模块,若想通过GZIP压缩网页内容,可以考虑两种方式,开启zlib.output_compression或者通过ob_gzhandler编码的方式

1)zlib.output_compression是在对网页内容压缩的同时发送数据至客户端。

2)ob_gzhandler是等待网页内容压缩完毕后才进行发送,相比之下前者效率更高,但需要注意的是,两者不能同时使用,只能选其一,否则将出现错误。

两者的实现方式做简单描述:

    1. zlib.output_compression实现方式

在默认情况下,zlib.output_compression是关闭:

  1. ; Transparent output compression using the zlib library
  2. ; Valid values for this option are 'off', 'on', or a specific buffer size
  3. ; to be used for compression (default is 4KB)
  4. ; Note: Resulting chunk size may vary due to nature of compression. PHP
  5. ;   outputs chunks that are few hundreds bytes each as a result of
  6. ;   compression. If you prefer a larger chunk size for better
  7. ;   performance, enable output_buffering in addition.
  8. ; Note: You need to use zlib.output_handler instead of the standard
  9. ;   output_handler, or otherwise the output will be corrupted.
  10. ; http://php.net/zlib.output-compression
  11. zlib.output_compression = Off
  12. ; http://php.net/zlib.output-compression-level
  13. ;zlib.output_compression_level = -1

如需开启需编辑php.ini文件,加入以下内容:

  1. zlib.output_compression = On
  2. zlib.output_compression_level = 6

可以通过phpinfo()函数检测结果。

当zlib.output_compression的Local
Value和MasterValue的值同为On时,表示已经生效,这时候访问的PHP页面(包括伪静态页面)已经GZIP压缩了,通过Firebug或
者在线网页GZIP压缩检测工具可检测到压缩的效果。

      2. ob_gzhandler的实现方式

如果需要使用ob_gzhandler,则需关闭zlib.output_compression,把php.ini文件内容更改为:

  1. zlib.output_compression = Off
  2. zlib.output_compression_level = -1

通过在PHP文件中插入相关代码实现GZIP压缩P压缩:

  1. if (extension_loaded('zlib')) {
  2. if (  !headers_sent() AND isset($_SERVER['HTTP_ACCEPT_ENCODING']) &&
  3. strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE)
  4. //页面没有输出且浏览器可以接受GZIP的页面
  5. {
  6. ob_start('ob_gzhandler');
  7. }
  8. }
  9. //待压缩的内容
  10. echo $context;
  11. ob_end_flush();

不管是zlib.output_compression还是ob_gzhandler,都仅能对PHP文件进行GZIP压缩,对于HTML、CSS、JS等静态文件只能通过调用PHP的方式实现。

最后想说的是,现在主流的浏览器默认使用的是HTTP1.1协议,基本都支持GZIP压缩,对于IE而言,假如你没有选中其菜单栏工具-》
Internet 选项-》高级-》HTTP 1.1 设置-》使用 HTTP 1.1,那么,你将感受不到网页压缩后的速度提升所带来的快感!

http://blog.csdn.net/hguisu/article/details/7793038

linux服务器的Gzip文件压缩方法[转]的更多相关文章

  1. Linux服务器删除乱码文件和文件夹的方法

    Linux服务器删除乱码文件和文件夹的方法 首页进入乱码文件所在文件夹由于php大势所趋,所以接触Linux服务器的机会越来越多.不同于Windows服务器,Linux服务器只支持数字.英文等字符,对 ...

  2. 两台linux服务器相互拷贝文件的两个方法

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...

  3. Linux命令(20)linux服务器之间复制文件和目录

    linux的scp命令: scp就是secure copy的简写,用于在linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器. 有时我们需要获得远程服务器上 ...

  4. 在linux服务器之间复制文件和目录命令scp

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...

  5. linux的scp命令可以在linux服务器之间复制文件和目录

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...

  6. linux下执行.sh文件的方法和语法

    linux下执行.sh文件的方法    .sh文件就是文本文件,如果要执行,需要使用chmod a+x xxx.sh来给可执行权限.       是bash脚本么   可以用touch test.sh ...

  7. Linux系统下查找文件的方法

    Linux系统下查找文件的方法 作者:Vashon 时间:20150419 方法一.在当前目录里查找所有名为以 java 开头的文件: find ./ -name "java*" ...

  8. 如何使用sftp下载Linux服务器上的文件到本地

    下载Linux服务器上的文件到本地 Linux服务器上的操作 sftp xxxxx@jumper.xxxx.com 使用put命令进行文件上传,put app.log 本地操作 sftp xxxxx@ ...

  9. [转帖]Linux下批量替换文件内容方法

    Linux下批量替换文件内容方法 https://www.cnblogs.com/fjping0606/p/4428850.html 刚才用到的命令 原作者写的挺好的记录一下 以后 用. 1:查找fi ...

随机推荐

  1. iOS:UIImageView图像视图控件

    UIImageView:图像视图控件:    它是UIView的子类,因此也是视图控件,可以用来显示图像.因为它具有帧动画属性和操作方法,因此可以用来制作动画,其实动画就是很短的时间内,执行显示连续的 ...

  2. 第二章 Javac编译原理

    注:本文主要记录自<深入分析java web技术内幕>"第四章 javac编译原理" 1.javac作用 将*.java源代码文件转化为*.class文件 2.编译流程 ...

  3. [置顶] ios 无限循环翻页源码例子

    原创文章,转载请注明出处:http://blog.csdn.net/donny_zhang/article/details/9923053 demo功能:ios 无限循环翻页源码例子.iphone 6 ...

  4. sql-的int和varchar类型拼接的问题

    将int类型转换为varchar ,如cast(1 as varchar(10)),再进行连接set @sql =@sql+'update User set Medal='+@count+' wher ...

  5. _com_util::ConvertBSTRToString的使用问题

    #include <comutil.h> 然后调用_com_util::ConvertBSTRToString提示如下错误: error LNK2019: unresolved exter ...

  6. redis常用命令记录

    cd App/opt/redis/bin/ ./redis-cli 1.查看所有key值 keys 前缀* 2.删除指定key值 删除一条 del key全名 删除多条 exit ./redis-cl ...

  7. select设置高度的兼容问题

    在IE678下,我们给select设置高度的话,里面的option无法居中,折中的兼容方式就是,我们给select的border:0:外面套一层div,这个div给他设置padding,让select ...

  8. IIS 之 连接数、并发连接数、最大并发工作线程数、队列长度、最大工作进程数

    一.IIS连接数 一般购买过虚拟主机的朋友都熟悉购买时,会限制IIS连接数,顾名思义即为IIS服务器可以同时容纳客户请求的最高连接数,准确的说应该叫“IIS限制连接数”. 客户请求的连接内容包括: [ ...

  9. 把mysql数据库生成数据字典,直接可用

    便于查看数据库表.字段,做一个数据字典是很有必要的,下面只需要简单更改下配置就可以用了,样式也是挺好的. <?php header('content-type:text/html;charset ...

  10. 商业价值:苹果iTV,再一次改变世界?

    苹果(Apple)公司打算进军智能电视领域,这在行业里已经不是秘密,有关苹果智能电视的消息也是不绝于耳,结合苹果产品线的命名规则,苹果智能 电视基本上就是iTV.就目前而言,Android智能系统已经 ...