不重新编译Apache,让服务器支持Gzip压缩
在百度站长工具平台提供了很多站长工具,其中有一款是页面优化建议。由于博客刚建立不久,所以想检测下自己博客还有什么可以优化的。于是使用页面优化建议检测自己的博客,检测完后其中百度有一项建议是:启用Gzip压缩,开启Gzip压缩可以减少页面加载时间。
在linux下有用过gzip压缩命令,不过在服务端之前从来没用过Gzip压缩来传输文件。于是便查找了下关于Gzip的一些资料:
Gzip是一种流行的文件压缩算法,现在的应用十分广泛,尤其是在Linux平台。当应用Gzip压缩一个纯文本文件时,效果是非常明显的,大约可以减少70%以上的文件大小。这取决于文件中的内容。gzip的压缩页面需要浏览器和服务器双方都支持,实际上就是服务器端压缩,传到浏览器后浏览器解压并解析。服务端文件经过压缩后实际上降低了网络传输的字节数,最明显的好处就是可以加快网页加载的速度。
Gzip除了节省流量,改善用户的浏览体验外,另一个潜在的好处是Gzip与搜索引擎的抓取工具有着更好的关系,更加符合搜索引擎的喜欢。
WEB服务器处理过程总结如下:
Web服务器接收到浏览器的HTTP请求后,检查浏览器是否支持HTTP压缩(Accept-Encoding 信息);
如果浏览器支持HTTP压缩,Web服务器检查请求文件的后缀名;
如果请求文件是HTML、CSS等静态文件,Web服务器到压缩缓冲目录中检查是否已经存在请求文件的最新压缩文件;
如果请求文件的压缩文件不存在,Web服务器向浏览器返回未压缩的请求文件,并在压缩缓冲目录中存放请求文件的压缩文件;
如果请求文件的最新压缩文件已经存在,则直接返回请求文件的压缩文件;
如果请求文件是动态文件,Web服务器动态压缩内容并返回浏览器,压缩内容不存放到压缩缓存目录中。
目前大部分浏览器都已经支持Gzip了,如IE、Mozilla Firefox、Opera、Chrome等。
我们可以通过查看HTTP头,快速判断浏览器和服务端是否支持与及使用了gzip压缩。
在Request Headers选项中,如果包含以下信息,则表明你的浏览器支持相应的gzip压缩:
Accept-Encoding:gzip,deflate,sdch 说明该流量器同时支持gzip,deflate,sdch这三种压缩方法。
其中gzip支持mod_zip,deflate支持mod_deflate,sdch是Shared Dictionary Compression over HTTP的缩写,即通过字典压缩算法对各个页面中相同的内容进行压缩,减少相同的内容的传输,这是一种比较新的HTTP传输压缩算法,感兴趣的可以去查找相应的资料。
在Response Headers选项中,如果有包含Content-Encoding:gzip则说明对方的服务器支持Gzip压缩。
在linux下Apache支持Gzip压缩的方法比较简单,只要开启了对Gzip组件的支持就可以。下面主要以Apache服务器来讲解。为了开启Apache服务器中的Gzip压缩功能,mod_deflate模块是必须安装加载的。首先先检查下你的Apache服务器是否已经加载mod_deflate模块,命令如下:
[root@lmode]# httpd –M
如果出现deflate_module (shared)项说明你的Apache服务器已经支持了mod_deflate模块。否则你要开启相应的模块,在不重新编译Apache安装mod_deflate模块的步骤如下:
首先到你的Apache源码目录(不是安装成功后的目录,是tar.gz类似文件解压后的目录),查找到mod_deflate.c文件,,通常位置:你的Apachehttpd源码目录/modules/filters/mod_deflate.c,进入上面的目录后运行下面的命令:
[root@lmode filters]# /usr/local/httpd/bin/apxs -i -c -a mod_deflate.c
/usr/local/httpd/bin/apxs:该目录请参照您自己的机器,通常在你Apache安装目录的bin目录下。这个目录是你Apache的安装目录,而上面那个mod_deflate.c所在的目录是Apache源码目录,要十分注意两者的区别。
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 。
apxs是一个为Apache超文本传输协议(HTTP)服务器编译安装扩展模块的工具, 用于编译一个或多个源程序或目标代码文件为动态共享对象, 使之可以用mod_so中的LoadModule指令 在运行时刻加载到Apache服务器中。
命令执行成功后,不要急着重启Apache,要确保你httpd.conf配置文件中这两个选项都存在并且都是开启状态:
LoadModule deflate_module modules/mod_deflate.so LoadModule headers_module modules/mod_headers.so
如果未开启则去掉前面的“#”号手动开启。开启成功后,可以先测试下是否正确:
[root@lmode conf]# /usr/local/httpd/bin/httpd –t
如果出现Syntax OK提示,那么恭喜你,模块安装成功。上面命令要参照你自己的Apache目录。
我自己在测试的时候发现了一个提示错误:
httpd: Syntax error on line 101 of /usr/local/httpd/conf/httpd.conf:Cannot load /usr/local/httpd/modules/mod_deflate.so into server: /usr/local/httpd/modules/mod_deflate.so: undefined symbol: inflateEnd
查了下资料发现产生这种错误的原因可能是:因为mod_deflate模块没有找到zlib库。正常时mod_deflate.so是会加载libz.so的。一般libz.so文件存放在/usr/lib或者/usr/lib64(64位操作系统)目录下,你只要重新加载/usr/lib/libz.so或者/usr/lib64/libz.so即可。
在我本地下,我发现加载这个动态链接库并没有出现问题,折腾了半天,最后发现产生错误的原因原来是:在修改httpd.conf配置文件时,没有把deflate_module 放在php5_module后面,在httpd.conf配置文件正确的存放位置是:
LoadModule php5_module modules/libphp5.so LoadModule deflate_module modules/mod_deflate.so
deflate_module 必须在php5_module 之后。修改配置文件后,重新测试下提示成功。
如果服务器开启了对Gzip组件的支持,那么我们就可以在http.conf或.htaccess里面进行定制,下面是一个定制该配置的简单实例: <IfModule mod_deflate.c>
# Insert filters AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE application/x-httpd-php AddOutputFilterByType DEFLATE application/x-httpd-fastphp AddOutputFilterByType DEFLATE image/svg+xml # Drop problematic browsers BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4.0[678] no-gzip BrowserMatch bMSI[E] !no-gzip !gzip-only-text/html # Make sure proxies don't deliver the wrong content Header append Vary User-Agent env=!dont-vary </IfModule>
这里要十分注意的是在你的httpd.conf配置文件或.htaccess文件中成功的添加了配置实例后,你重新访问你的网站后你的网站打开不了,出现这种原因除了你的配置文件出错外,最有可能的是你本地访问的浏览器就不支持gzip压缩或者不支持你配置实例项中的某一个配置项。我自己就碰到这个错误,在上面配置项中添加了一堆文件压缩配置,然后也没指定哪些浏览器访问时不让Gzip生效,导致的结果是自己用不支持Gzip的浏览器一直不能访问自己的站点,导致重复修改配置文件浪费了很多时间。还好最后在配置文件中添加了# Drop problematic browsers 选项。
最后你可以通过:http://tool.chinaz.com/Gzips/或者通过查看HTTP头信息来看自己的站点是否成功的支持了Gzip。
欢迎转载,转载请注明:http://coderschool.cn/203.html
下一篇: 如何强制Apache返回一个HTTP 410-状态码