一般默认没有装 Deflate ,最直接的方法就是重装 Apache ,在原来的配置文件后加上 --enable-deflate --enable-headers 。
如果不想重装,就单独编译, mod_deflate.c 在源文件目录的 modules/filters 下, mod_hearders.c 则在 modules/metadata 目录下。如果用 apxs -i -a -c 的方法不行,请参考下面的办法,以安装 mod_headers 为例。
cd modules/metadata/
apxs -i -a -c mod_headers.c
Warning! dlname not found in /usr/local/apache2.2.0/modules/mod_headers.la.
Assuming installing a .so rather than a libtool archive.
chmod 755 /usr/local/apache2.2.0/modules/mod_headers.so
chmod: 无法访问 ‘/usr/local/apache2.2.0/modules/mod_headers.so’: 没有那个文件或目录
apxs:Error: Command failed with rc=65536
gcc -shared -o mod_headers.so mod_headers.o
cp mod_headers.so /usr/local/apache2.2.0/modules
/usr/local/apache2.2.0/bin/apxs -i -a -c mod_headers.c
Warning! dlname not found in /usr/local/apache2.2.0/modules/mod_headers.la.
Assuming installing a .so rather than a libtool archive.
chmod 755 /usr/local/apache2.2.0/modules/mod_headers.so
[activating module `headers' in /usr/local/apache2.2.0/conf/httpd.conf]
如安装mod_deflate.c失败,提示zlib未找到时,可用yum install zlib-devel.i386先安装zlib后再试。
安装成功了。
装完后,其在 conf/httpd.conf 中加了如下两句:
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
其实安装 deflate 时 mod_headers 并不是必须,那为什么要安装呢?主要是其官方配置文件中使用了 header 模块来确保不会发送错误的内容。
<Location />
# 插入过滤器
SetOutputFilter DEFLATE
# Netscape 4.x 有一些问题 ...
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 有更多的问题
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE 会伪装成 Netscape ,但是事实上它没有问题
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# 不压缩图片
SetEnvIfNoCase Request_URI \\.(?:gif|jpe?g|png)$ no-gzip dont-vary
# 确保代理不会发送错误的内容
Header append Vary User-Agent env=!dont-vary
</Location>
另有一种简单的设置:
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php
AddOutputFilter DEFLATE css js
很好理解,可以放在 Directory,Virtualhost,Location 任意地方。
怎么看是否生效了呢?来记录下日志:
# 声明输入流的 byte 数量
DeflateFilterNote Input instream
# 声明输出流的 byte 数量
DeflateFilterNote Output outstream
# 声明压缩的百分比
DeflateFilterNote Ratio ratio
# 声明日志类型
LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
CustomLog logs/deflate_log deflate
大部分 CSS,htm 页面都可以压缩到 30% ,即文章开头我提到的能压缩 70% 。
参考文档:
Apache 模块 mod_deflate
http://www.itlearner.com/code/apache2.2/mod/mod_deflate.html
Apache deflate 模块配置说明
http://www.itlearner.com/article/2007/3819.shtml
如果出现如下错误
Cannot load /usr/local/apache/modules/mod_deflate.so into server: /usr/local/apache/modules/mod_deflate.so: undefined symbol: inflateEnd
需要在 LoadModule deflate_module modules/mod_deflate.so 的前面加载zlib.so
如32 操作系统增加以下内容:
LoadFile /usr/lib/libz.so
LoadModule deflate_module modules/mod_deflate.so
如64 操作系统增加以下内容:
LoadFile /usr/lib64/libz.so
LoadModule deflate_module modules/mod_deflate.so
备注: 请以zlib实际文件为准,有时为libz.so.1