【linux-http】apache/php启用gzip网页压缩

  • 需求场景

    个人网站资源有限,网络带宽一般可怜的几MB,如此网页内容大的话,访友们浏览起来是十分缓慢的;如何能优化在一定程度上减少网络开销响应时间,这里就可以用到网页压缩的方式来减少网页大小,从而提高网络性能;本文就此举例apache的gzip压缩功能和php的zlib函数库;

  • 简单介绍

    目前网页压缩功能,同时也被主流浏览器支持的压缩方式大致支持gzip、deflate、sdch等;

    前两者,其实都是gzip的压缩方式,单纯gzip是一种数据格式,这里网页压缩默认且目前仅使用deflate算法压缩data部分;

    而单讲deflate是一种压缩算法,而sdch是一种压缩方式,通过字典压缩算法对各个页面相同的内容进行压缩,从而减少传输;是的,sdch其与ajax+pushstate想达到的效果是一样的,但是博主这里也没有弄明白怎么使用,有兴趣的道友自己找资料吧;

    没错,下面咱们要讲的gzip、deflate事实上是两种压缩方式,也就是apache支持的两个压缩格式;

    (以上可以通过浏览器F12开发者工具,查看网页http请求报头来判断浏览器是否支持)
    ♦Accept-Encoding: gzip 支持mod_gzip
    ♦Accept-Encoding: deflate 支持mod_deflate
    ♦Accept-Encoding: gzip,deflate,sdch 这三种都支持

特别注意

当然,如何判断请求到的网页也就是web服务器是否开启了压缩功能,则看http响应报头;

F12打开开发工具后,选择最上面network选项,找到左侧请求到的文件name,一般点击第一个也就是网页;会弹出报文窗口,选择headers报头选项,看以看到Response Headers响应报头和Request Headers请求报头,分别找到accept-Encoding一行;

①、让我们再次了解一下apache的gzip、deflate及php的zlib函数库

    首先咱们讲模块:gzip模块,我们应该知道gzip应用比较广泛,熟悉linux的道友绝对不陌生,其对纯文件的压缩效果明显,一般70%朝上,所以apache采用了它;而deflate其实算是apache的内建模块,说起渊源,apache1.x的早版本中因为没有压缩网页的模块,所以使用了gzip的第三方外链模块;而apache2.x版本以后,便开发内建了deflate也就是集成自带的模块,当然有没有加载就取决你安装是的编译了;且两者解压的代码几乎相同的;
    其次,我们讲gzip、deflate的压缩方式;gzip相比于deflate的压缩性能比较高,自然占用cpu资源也就大;这是因为deflate 是最基础的算法,gzip 在 deflate 的 raw data 前增加了 10 个字节的 gzheader,尾部添加了 8 个字节的校验字节(可选 crc32 和 adler32) 和长度标识字节。处理原理也是有点区别的;
    deflate虽然压缩率略差,但其速度自然要高一些;且其也可使用DeflateCompressionLevel指令来设置压缩级别,1-9,默认是6,速度和质量较为平衡;
    不过像本博主这样的个人小网站,使用gzip还是绰绰有余,如果访问量大则使用deflate更适宜;
    事实上存粹的deflate压缩格式并不友好;而mod_gzip、mod_deflate都没有使用deflate压缩方式;
    至于php的zlib方式,事实上也是利用php自身功能来达到gzip压缩方式的效果;
小小总结归纳

deflate(RFC1951):一种压缩算法,使用LZ77和哈弗曼进行编码;
zlib(RFC1950):一种格式,是对deflate进行了简单的封装,他也是一个实现库(delphi中有zlib,zlibex)
gzip(RFC1952):一种格式,也是对deflate进行的封装。
gzip = gzip头 + deflate编码的实际内容 + gzip尾
zlib = zlib头 + deflate编码的实际内容 + zlib尾
目前应该都支持静动态网页的压缩;
事实上归根mod_gzip、mod_deflate都是实现gzip格式;算法都是用的deflate;

②、Web服务器的HTTP网页压缩处理过程:

    Web服务器接收到浏览器的HTTP请求后,检查浏览器是否支持HTTP压缩(Accept-Encoding 信息);
    如果浏览器支持HTTP压缩,Web服务器检查请求文件的后缀名;
    如果请求文件是HTML、CSS等静态文件,Web服务器到压缩缓冲目录中检查是否已经存在请求文件的最新压缩文件;
    如果请求文件的压缩文件不存在,Web服务器向浏览器返回未压缩的请求文件,并在压缩缓冲目录中存放请求文件的压缩文件;
    如果请求文件的最新压缩文件已经存在,则直接返回请求文件的压缩文件;
    如果请求文件是动态文件,Web服务器动态压缩内容并返回浏览器,压缩内容不存放到压缩缓存目录中。
  • 具体操作

①、php的zlib配置gzip网页压缩

博主也是采用这种方式,配置比较简单,启用即可使用

首先打开php安装目录下php.ini文件,可以用locate命令查找一下:

zlib.output_compression = on
zlib.output_compression_level = 5
;zlib.output_handler =
; output_buffering =
操作提示

如上,找到这四行并进行相关修改,其实找到前两行就可以了,第一行on表示启用zlib;第二行表示压缩级别1-9建议是5;第三行是压缩方式也就是算法默认gzip;第四行是缓存默认是4k也就是4096;当然最后两行建议注释掉,保持默认就行;如此重启httpd服务即可进行压缩传输网页咯!

♥ 此外还有一种配置方式: 【显示↓/↑隐藏】

②、apache开启gzip压缩功能:

如上,apache利用gzip算法压缩有两种模块:mod_gzip、mod_deflate;

下面我们就配置apache的内联模块mod_deflate来启用gzip功能;

首先如果没有找到mod_deflate模块,还需要手动安装一次;

找到apache源码目录,找到mod_deflate.c文件,一般在源码目录下的modules/filters/mod_deflate.c;

[root@oxblog ~]#/usr/local/apache/bin/apxs -i -c -a mod_deflate.c

编辑apache配置文件httpd.conf,找到如下配置去掉开头注释符号,加载模块;

LoadModule deflate_module modules/mod_deflate.so

然后便是定制网页压缩的配置,这里咱们以mod_defalte模块来配置;(内建集成的比较好用嘛)

可以直接放在httpd.conf配置文件中,也可以放在指定目录下面的.htaccess文件中,如站点根目录;

这里咱们直接配置在httpd.conf文件中:

!--实现网页压缩功能并严格匹配需要压缩的文件内容--!
# mod_deflate:
<ifmodule mod_deflate.c>
DeflateCompressionLevel 6 #压缩率, 6是建议值.
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/php
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/atom_xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-httpd-php
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/gif image/png  image/jpe image/swf image/jpeg image/bmp
# Don’t compress images and other  #排除不需要压缩的文件
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
SetEnvIfNoCase Request_URI .(?:html|htm)$ no-gzip dont-varySetEnvIfNoCase
#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
</ifmodule>

(最后记得按照开头说的方法验证一下,看一下网页大小是否变小,压缩是否启用成功哦,)

(哈哈,就这么多了,不明白记得留言哦!)

Edit@bigmouth【原创博文】®【经验汇总】


原创文章,转载请注明:转自于公牛博客

本文链接地址:【linux-http】apache/php启用gzip网页压缩

4
祝福我们的祖国繁荣昌盛
  • 请尽情挥洒您的笔墨!

    欢迎来到公牛博客更多分享更多精彩记录美丽点亮生活

    公牛博客·统计碑运行:3060 D
    博文:215 P
    评论:452 S