Linux网站架构系列之Apache调优全解
环境:
1.
CentOS6.4
x86_64位 采用最小化安装,系统经过了基本优化篇
2.
apache版本:httpd-2.4.6
3.
apr版本:apr-1.4.8
4.
apr-util版本:apr-util-1.5.2
5.
pcre版本:pcre-7.8
6.
源码包存放位置:/server/tools
7.
源码包编译安装位置:/etc/
local
/软件名称
一、源码官方下,补丁及时打
正如我们在apache部署篇讲到的我们需要对下载的源码包进行验证一样,我们在挑选apache源码安装包的时候,一定要去官网,不要去乱七八糟的站点进行下载,防止源码包被别有用心的人动过手脚,导致后面对公司业务造成不必要损失。
另外为了apache的安全性和性能考虑,我们一定要多多关注apache的官网的补丁发布情况,一旦有新的补丁,我们一定要及早打上。特别是一些安全补丁,防止受到损失。
二、屏蔽apache版本等敏感信息
1)我们在apache主配置文件httpd.conf中,找到包含httpd-default.conf的行,并解开注释
1.
[[email protected]
/]
#
grep "httpd-default.conf" /usr/local/apache/conf/httpd.conf
2.
#Include
conf/extra/httpd-default.conf
3.
[[email protected]
/]
#
sed -i 's#\#Include conf/extra/httpd-default.conf#Include conf/extra/httpd-default.conf#g' /usr/local/apache/conf/httpd.conf
注意:编译安装的情况下,只有此行解开注释了,后面的修改才能生效。
2)打开httpd-default.conf文件,修改如下两个地方
1.
[[email protected]
/]
#
grep Server conf/extra/httpd-default.conf|grep -v "#"
2.
ServerTokens
full
3.
ServerSignature
Off
修改为
1.
ServerTokens
Prod
2.
ServerSignature
Off
经过上面的修改,当你在curl-Iwww.sunsky.pw的时候,还是会出现下面的信息
1.
Server:
Apache
彻底让版本等敏感信息消失
如果你需要彻底将版本之类的信息进行改头换面,你就需要在编译之前做准备或者进行从新编译了。在重新编译时,修改源码包下include目录下的ap_release.h文件
1.
#define
AP_SERVER_BASEVENDOR "Apache Software Foundation" #服务的供应商名称
2.
#define
AP_SERVER_BASEPROJECT "Apache HTTP Server" #服务的项目名称
3.
#define
AP_SERVER_BASEPRODUCT "Apache" #服务的产品名
4.
#define
AP_SERVER_MAJORVERSION_NUMBER 2 #主要版本号
5.
#define
AP_SERVER_MINORVERSION_NUMBER 4 #小版本号
6.
#define
AP_SERVER_PATCHLEVEL_NUMBER 6 #补丁级别
7.
#define
AP_SERVER_DEVBUILD_BOOLEAN 0 #
上述列出的行,我已经给出了注释,大家可以修改成自己想要的,然后编译安装之后,再对httpd-default.conf文件进行修改,对方就彻底不知道你的版本号了。
三、更改apache的默认用户
我们通过更改apache的默认用户,可以提升apache的安全性。这样,即使apache服务被攻破,黑客拿到apache普通用户也不会对系统和其他应用造成破坏。这里创建的apache用户,将用于对子进程和线程的控制。
1.
[[email protected]
/]
#
useradd -M -s /sbin/nologin apache 创建apache用户
编辑apache配置文件,修改默认的用户。
1.
[[email protected]
/]
#
vim /usr/local/apache/conf/httpd.conf
2.
User
apache
#更改默认的daemon用户为apache用户
3.
Group
apache
#更改默认的daemon用户为apache用户
四、apache目录及文件权限设置
在生产环境的网站架构中,我们应把资源文件,例如用户上传的图片及附件等和程序做好分离,最好是把上传程序也分离开来。这样才能更方便我们做好授权,保证apache服务和整个服务器安全。
这里我们设置apache的网站目录属主和属组是root,权限是755,文件的权限为644。
1.
lrwxr-xr-x
1 root root 23 11月 5 02:04 apache -&
gt
;
/usr/
local
/apache-2.4.6
2.
drwxr-xr-x
14 root root 4096 11月 5 12:37 apache-2.4.6
并且,在对日志的授权商,我们要将属主和属组都设置为root,权限设置为700。
1.
drwx------
2 root root 4096 11月 5 02:46 logs
由于apache日志的记录是由apache的主进程进行操作的,而apache的主进程又是root用户启动的,所以这里设置700是不影响日志记录了。这也是日志记录的最安全的方法。
五、配置cronolog进行日志轮询
由于apache自带的日志轮询工具rotatelogs,据专家说在进行日志切割时容易丢日志,因此我们通常使用cronolog进行日志轮询。
1、下载并安装cronolog
1.
[[email protected]
/]
#
cd /server/tools/
2.
[[email protected]
tools]
#
wget http://cronolog.org/download/cronolog-1.6.2.tar.gz
3.
[[email protected]
tools]
#
tar zxf cronolog-1.6.2.tar.gz
4.
[[email protected]
tools]
#
cd cronolog-1.6.2
5.
[[email protected]
cronolog-1.6.2]
#
./configure
6.
[[email protected]
cronolog-1.6.2]
#
make&&make install
2、配置apache使用cronolog
由于实验用的apache开启了虚拟主机功能,所以以下范例配置都在虚拟主机中进行。
1.
[[email protected]
cronolog-1.6.2]
#
vim /usr/local/apache/httpd/extra/httpd-vhosts.conf
将配置文件中的CustomLog和ErrorLog替换为下面的(由于我们要对多站点,所以这里要替换两个虚拟主机的,并且将日志存放名字做有效的区分才好)
1.
CustomLog
"|/usr/local/sbin/cronolog
/app/logs/sunsky_access_%Y%m%d.log"
combined
2.
ErrorLog
"|/usr/local/sbin/cronolog
/app/logs/sunsky_error_%Y%m%d.log"
更多日志格式参考:
1.
按天轮询(生产环境常见用法,推荐使用):
2.
CustomLog
"|/usr/local/sbin/cronolog
/app/logs/access_www_%Y%m%d.log"
combined
3.
按小时轮询(生产环境较常见用法):
4.
CustomLog
"|/usr/local/sbin/cronolog
/app/logs /access_www_ %Y%m%d%H.log"
combined
六、错误页面优雅显示
为了提升网站的用户体验,避免404,403之类的丑陋的默认错误提示出现,我们需要对错误页面进行优化,让他们变的漂亮一点。错误页面不仅在于告诉用户访问出现了问题,而且需要引导用户到正确的页面。
错误页面优雅化显示的实现方式主要有两种,下面我们主要以404错误为例:
第一种:在apache的主配置文件httpd.conf中的<Directory></Directory>标签内添加ErrorDocument配置。
1.
[[email protected]
/]
#
vi /usr/local/apache/conf/httpd.conf
2.
&
lt
;Directory
"/www/html"
&
gt
;
3.
AllowOverride
None
4.
Options
None
5.
Require
all granted
6.
ErrorDocument
404 /404.html
#将404错误跳转到/www/html下的404.html页面上
7.
&
lt
;/Directory&
gt
;
第二种方法:在apache的虚拟主机配置文件httpd-vhost.conf中的<VirtualHost*:80></VirtualHost>中添加ErrorDocument配置。
01.
&
lt
;VirtualHost
*:80&
gt
;
02.
ServerAdmin
[email protected]
03.
DocumentRoot
"/www/html"
04.
ServerName
www.sunsky.pw
05.
ServerAlias
sunsky.pw
06.
CustomLog
"|/usr/local/sbin/cronolog
/app/logs/www_access_%Y%m%d.log"
combined
07.
ErrorLog
"|/usr/local/sbin/cronolog
/app/logs/www_error_%Y%m%d.log"
08.
ErrorDocument
404 http://www.sunsky.pw ;
#将404错误跳转到http://www.sunsky.pw页面上
09.
&
lt
;/VirtualHost&
gt
;
从上面的两种解决方案,我们可以看出ErrorDocument的命令格式如下
1.
ErrorDocument
错误代码 跳转到的页面或文件
另外这里需要注意,你若设置跳转到文件,必须要有这个文件才行。另外文件必须在站点目录内,不然会报错。
在跳转到文件的测试中,我用全路径和别名路径进行测试,当把404错误页面跳转文件放到其他目录的时候,不报错,但是页面跳转不过去。若跳转为未链接,则不影响。
七、启用压缩模块mod_deflate
网站随着用户访问量的增加和内容量的增加,网站的带宽会不断的增加,随之就是网站成本的增加。并且当内容量增大的时候,客户端如果带宽小,就会影响用户的体验。因此从这两方面考虑,网站的某些内容必须经过压缩之后再传给用户,然后在用户客户端进行解压,来实现双方共赢的效果。
apache的压缩要用到mod_deflate模块,该模块提供了DEFLATE输出过滤器,允许服务器在将输出内容发送到客户端以前进行压缩,以节约带宽。它的核心思想就是把文件先在服务器进行压缩,然后再进行传输,这样可以显著减少文件传输的大小。当传输完毕后,客户端游览器会重新对压缩过的内容进行解压缩。如果没特殊情况的话,所以的文本内容都应该能被gzip压缩,例如:html(php),js,css,xml,txt等。特殊情况就是像一些首页上有很多广告投放的js代码,由于需要每次加载进而进行来访信息统计,所以这些广告代码拥有者网站的js不会经过gzip压缩,
mod_deflate模块,在我们前篇部署的时候已经编译安装进去了。
那么如果没有安装,如何安装呢?并且如果不知道到是否安装了,如何查看呢?
1、mod_deflate模块检查及安装
由于apache2.2.x和2.4.x这两个版本在检查mod_deflate模块是否安装方法方法是不同的。最后,我无奈做了很多测试,下面建议大家这样来检查。
1.
[[email protected]
/]
#
/usr/local/apache/bin/apachectl -M | grep deflate
2.
deflate_module
(static)
#此种结果为编译安装时装的
3.
[[email protected]
/]
#
/usr/local/apache/bin/apachectl -M | grep deflate
4.
deflate_module
(shared)
#此种结果为DSO方式安装的
安装了的话,就可以直接进行压缩配置了,如果没有安装,下面为安装方法
a)编译时安装方法
编译的时候跟上--enable-deflate即可实现安装
b)DSO方式安装
1.
[[email protected]
/]
#
cd /server/tools/httpd-2.4.6/modules/filters/ #切到apache源码包mod_deflate所在的目录下
2.
[[email protected]
filters]
#
/usr/local/apache/bin/apxs -c -i -a mod_deflate.c #以dso的方式编译安装到apache中
3.
[[email protected]
filters]
#
ll /usr/local/apache/modules/mod_deflate.so #检查mod_deflate是否安装,成功安装这里会显示出该文件
4.
-rwxr-xr-x
1 root root 76697 11月 5 07:50 /usr/
local
/apache/modules/mod_deflate.so
扩展:使用DSO方式安装,apxs后跟的参数详解
1.
-c
此选项表明需要执行编译操作。它首先会编译c源程序(.c)files为对应的目标代码文件(.c),然后连接这些目标代码和files中其余的目标代码文件(.c和.a),以生成动态共享对象dsofile。如果没有指定-s选项,则此输出文件名由files中的第一个文件名推测得出,也就是默认mod_name.so。
2.
-i
此选项表示需要执行安装操作,以安装一个或多个动态共享对象到服务器的modules目录。
3.
-a
此选项自动增加一个LoadModule行到httpd.conf文件中,以**此模块,或者,如果此行已经存在,则启用之。
4.
压缩模块配置
2、配置压缩参数
注意如果我们是编译安装时已经编译进去的,此时我们需要先将httpd.conf主配置文件中
1.
LoadModule
deflate_module modules/mod_deflate.so
此行解锁后再进行下面操作,不然下面的操作会报错。
我们需要在虚拟机的<VirtualHost*:80></VirtualHost>中添加如下配置即可实现压缩
01.
<
ifmodule
mod_deflate.c>
02.
DeflateCompressionLevel
9 #压缩等级,越大效率越高,消耗CPU也越高
03.
SetOutputFilter
DEFLATE #启用压缩
04.
AddOutputFilterByType
DEFLATE text/html text/plain text/xml #仅压缩限制特定的MIME类型文件:
05.
AddOutputFilterByType
DEFLATE application/javascript
06.
AddOutputFilterByType
DEFLATE text/css
07.
AddOutputFilterByType
DEFLATE image/gif image/png image/jpe image/swf image/jpeg image/bmp
08.
#DeflateFilterNote
ratio #在日志中放置压缩率标记,下面是记录日志的,这个功能一般不用
09.
#LogFormat
'"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
10.
#CustmLog
logs/deflate_log.log deflate
11.
</
ifmodule
>
下面是朋友公司的另外一种压缩配置,有兴趣的朋友们也可以操作操作。
01.
<
ifmodule
mod_deflate.c>
02.
DeflateCompressionLevel
9
03.
SetOutputFilter
DEFLATE
04.
DeflateFilterNote
Input instream #声明输入流的byte数量
05.
DeflateFilterNote
Output outstream #声明输出流的byte数量
06.
DeflateFilterNote
Ratio ratio #声明压缩的百分比
07.
#LogFormat
'"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate #声明日志类型
08.
#CustomLog
logs/deflate_log.log deflate #声明日志类型
09.
AddOutputFilterByType
DEFLATE text/html text/plain text/xml text/css application/javascript #仅压缩限制特定的MIME类型文件
10.
</
ifmodule
>
执行上面的添加后,我们对apache进行优雅重启
1.
[[email protected]
/]# /usr/local/apache/bin/apachectl graceful
下面访问我们的网站,然后用火狐或者google游览器的YSLOW插件进行压缩效果的查看
怎么样,是不是已经进行压缩了啊!
我们在企业生产环境中时,在启用mod_deflate时,一定要注意,对于太小的文件和某些格式的图片不要对它们进行压缩,有可能越压越大。
下面给出大家几乎是所有的AddOutputFilterByTypeDEFLATE后跟的压缩文件类型,大家可以参照选择。
1.
text/plain
text/html text/php text/xml text/css text/javascript
2.
application/xhtml+xml
application/xml application/rss+xml application/atom_xml application/x-javascript application/x-httpd-php image/svg+xml image/gif image/png image/jpe image/swf image/jpeg image/bmp
八、mod_expires缓存功能
虽然我们上面通过mod_deflate模块启用了压缩,从很大程度上节约了企业带宽,降低了企业成本。可是由于现在越来越多的图片、脚本、css和flash被嵌入到页面中,当客户访问站点势必会做很多次的http请求,因此我们还可以通过mod_expires缓存模块来设置ExpiresHeader来缓存这些文件。Expires是通过header报文来指定特定类型的文件在游览器中的缓存时间的。平时,我们大多数的图片,flash在发布之后都是不需要经常修改的,因此做了缓存之后,游览器第一次从服务器下载之后,就不需要再从服务器下载这些文件而是直接从游览器缓存中读取了。这样客户访问页面的速度就会大大加快,企业的带宽压力也得到了缓解。
1、mod_expires模块检查及安装
检查mod_expires模块是否安装的方法如下:
1.
[[email protected]
/]
#
/usr/local/apache/bin/apachectl -M | grep deflate
2.
expires_module
(static)
#此种结果为编译安装时装的
3.
[[email protected]
/]
#
/usr/local/apache/bin/apachectl -M | grep deflate
4.
expires_module
(shared)
#此种结果为DSO方式安装的
安装了的话,就可以直接进行压缩配置了,如果没有安装,下面为安装方法
a)编译方式安装
编译的时候跟上--enable-expires即可实现安装
b)DSO方式安装
1.
[[email protected]
/]
#
cd /server/tools/httpd-2.4.6/modules/filters/ #切到apache源码包mod_expires所在的目录下
2.
[[email protected]
filters]
#
/usr/local/apache/bin/apxs -c -i -a mod_expires.c #以dso的方式编译安装到apache中
3.
环境:
1.
CentOS6.4
x86_64位 采用最小化安装,系统经过了基本优化篇
2.
apache版本:httpd-2.4.6
3.
apr版本:apr-1.4.8
4.
apr-util版本:apr-util-1.5.2
5.
pcre版本:pcre-7.8
6.
源码包存放位置:/server/tools
7.
源码包编译安装位置:/etc/
local
/软件名称
一、源码官方下,补丁及时打
正如我们在apache部署篇讲到的我们需要对下载的源码包进行验证一样,我们在挑选apache源码安装包的时候,一定要去官网,不要去乱七八糟的站点进行下载,防止源码包被别有用心的人动过手脚,导致后面对公司业务造成不必要损失。
另外为了apache的安全性和性能考虑,我们一定要多多关注apache的官网的补丁发布情况,一旦有新的补丁,我们一定要及早打上。特别是一些安全补丁,防止受到损失。
二、屏蔽apache版本等敏感信息
1)我们在apache主配置文件httpd.conf中,找到包含httpd-default.conf的行,并解开注释
1.
[[email protected]
/]
#
grep "httpd-default.conf" /usr/local/apache/conf/httpd.conf
2.
#Include
conf/extra/httpd-default.conf
3.
[[email protected]
/]
#
sed -i 's#\#Include conf/extra/httpd-default.conf#Include conf/extra/httpd-default.conf#g' /usr/local/apache/conf/httpd.conf
注意:编译安装的情况下,只有此行解开注释了,后面的修改才能生效。
2)打开httpd-default.conf文件,修改如下两个地方
1.
[[email protected]
/]
#
grep Server conf/extra/httpd-default.conf|grep -v "#"
2.
ServerTokens
full
3.
ServerSignature
Off
修改为
1.
ServerTokens
Prod
2.
ServerSignature
Off
经过上面的修改,当你在curl-Iwww.sunsky.pw的时候,还是会出现下面的信息
1.
Server:
Apache
彻底让版本等敏感信息消失
如果你需要彻底将版本之类的信息进行改头换面,你就需要在编译之前做准备或者进行从新编译了。在重新编译时,修改源码包下include目录下的ap_release.h文件
1.
#define
AP_SERVER_BASEVENDOR "Apache Software Foundation" #服务的供应商名称
2.
#define
AP_SERVER_BASEPROJECT "Apache HTTP Server" #服务的项目名称
3.
#define
AP_SERVER_BASEPRODUCT "Apache" #服务的产品名
4.
#define
AP_SERVER_MAJORVERSION_NUMBER 2 #主要版本号
5.
#define
AP_SERVER_MINORVERSION_NUMBER 4 #小版本号
6.
#define
AP_SERVER_PATCHLEVEL_NUMBER 6 #补丁级别
7.
#define
AP_SERVER_DEVBUILD_BOOLEAN 0 #
上述列出的行,我已经给出了注释,大家可以修改成自己想要的,然后编译安装之后,再对httpd-default.conf文件进行修改,对方就彻底不知道你的版本号了。
三、更改apache的默认用户
我们通过更改apache的默认用户,可以提升apache的安全性。这样,即使apache服务被攻破,黑客拿到apache普通用户也不会对系统和其他应用造成破坏。这里创建的apache用户,将用于对子进程和线程的控制。
1.
[[email protected]
/]
#
useradd -M -s /sbin/nologin apache 创建apache用户
编辑apache配置文件,修改默认的用户。
1.
[[email protected]
/]
#
vim /usr/local/apache/conf/httpd.conf
2.
User
apache
#更改默认的daemon用户为apache用户
3.
Group
apache
#更改默认的daemon用户为apache用户
四、apache目录及文件权限设置
在生产环境的网站架构中,我们应把资源文件,例如用户上传的图片及附件等和程序做好分离,最好是把上传程序也分离开来。这样才能更方便我们做好授权,保证apache服务和整个服务器安全。
这里我们设置apache的网站目录属主和属组是root,权限是755,文件的权限为644。
1.
lrwxr-xr-x
1 root root 23 11月 5 02:04 apache -&
gt
;
/usr/
local
/apache-2.4.6
2.
drwxr-xr-x
14 root root 4096 11月 5 12:37 apache-2.4.6
并且,在对日志的授权商,我们要将属主和属组都设置为root,权限设置为700。
1.
drwx------
2 root root 4096 11月 5 02:46 logs
由于apache日志的记录是由apache的主进程进行操作的,而apache的主进程又是root用户启动的,所以这里设置700是不影响日志记录了。这也是日志记录的最安全的方法。
五、配置cronolog进行日志轮询
由于apache自带的日志轮询工具rotatelogs,据专家说在进行日志切割时容易丢日志,因此我们通常使用cronolog进行日志轮询。
1、下载并安装cronolog
1.
[[email protected]
/]
#
cd /server/tools/
2.
[[email protected]
tools]
#
wget http://cronolog.org/download/cronolog-1.6.2.tar.gz
3.
[[email protected]
tools]
#
tar zxf cronolog-1.6.2.tar.gz
4.
[[email protected]
tools]
#
cd cronolog-1.6.2
5.
[[email protected]
cronolog-1.6.2]
#
./configure
6.
[[email protected]
cronolog-1.6.2]
#
make&&make install
2、配置apache使用cronolog
由于实验用的apache开启了虚拟主机功能,所以以下范例配置都在虚拟主机中进行。
1.
[[email protected]
cronolog-1.6.2]
#
vim /usr/local/apache/httpd/extra/httpd-vhosts.conf
将配置文件中的CustomLog和ErrorLog替换为下面的(由于我们要对多站点,所以这里要替换两个虚拟主机的,并且将日志存放名字做有效的区分才好)
1.
CustomLog
"|/usr/local/sbin/cronolog
/app/logs/sunsky_access_%Y%m%d.log"
combined
2.
ErrorLog
"|/usr/local/sbin/cronolog
/app/logs/sunsky_error_%Y%m%d.log"
更多日志格式参考:
1.
按天轮询(生产环境常见用法,推荐使用):
2.
CustomLog
"|/usr/local/sbin/cronolog
/app/logs/access_www_%Y%m%d.log"
combined
3.
按小时轮询(生产环境较常见用法):
4.
CustomLog
"|/usr/local/sbin/cronolog
/app/logs /access_www_ %Y%m%d%H.log"
combined
六、错误页面优雅显示
为了提升网站的用户体验,避免404,403之类的丑陋的默认错误提示出现,我们需要对错误页面进行优化,让他们变的漂亮一点。错误页面不仅在于告诉用户访问出现了问题,而且需要引导用户到正确的页面。
错误页面优雅化显示的实现方式主要有两种,下面我们主要以404错误为例:
第一种:在apache的主配置文件httpd.conf中的<Directory></Directory>标签内添加ErrorDocument配置。
1.
[[email protected]
/]
#
vi /usr/local/apache/conf/httpd.conf
2.
&
lt
;Directory
"/www/html"
&
gt
;
3.
AllowOverride
None
4.
Options
None
5.
Require
all granted
6.
ErrorDocument
404 /404.html
#将404错误跳转到/www/html下的404.html页面上
7.
&
lt
;/Directory&
gt
;
第二种方法:在apache的虚拟主机配置文件httpd-vhost.conf中的<VirtualHost*:80></VirtualHost>中添加ErrorDocument配置。
01.
&
lt
;VirtualHost
*:80&
gt
;
02.
ServerAdmin
[email protected]
03.
DocumentRoot
"/www/html"
04.
ServerName
www.sunsky.pw
05.
ServerAlias
sunsky.pw
06.
CustomLog
"|/usr/local/sbin/cronolog
/app/logs/www_access_%Y%m%d.log"
combined
07.
ErrorLog
"|/usr/local/sbin/cronolog
/app/logs/www_error_%Y%m%d.log"
08.
ErrorDocument
404 http://www.sunsky.pw ;
#将404错误跳转到http://www.sunsky.pw页面上
09.
&
lt
;/VirtualHost&
gt
;
从上面的两种解决方案,我们可以看出ErrorDocument的命令格式如下
1.
ErrorDocument
错误代码 跳转到的页面或文件
另外这里需要注意,你若设置跳转到文件,必须要有这个文件才行。另外文件必须在站点目录内,不然会报错。
在跳转到文件的测试中,我用全路径和别名路径进行测试,当把404错误页面跳转文件放到其他目录的时候,不报错,但是页面跳转不过去。若跳转为未链接,则不影响。
七、启用压缩模块mod_deflate
网站随着用户访问量的增加和内容量的增加,网站的带宽会不断的增加,随之就是网站成本的增加。并且当内容量增大的时候,客户端如果带宽小,就会影响用户的体验。因此从这两方面考虑,网站的某些内容必须经过压缩之后再传给用户,然后在用户客户端进行解压,来实现双方共赢的效果。
apache的压缩要用到mod_deflate模块,该模块提供了DEFLATE输出过滤器,允许服务器在将输出内容发送到客户端以前进行压缩,以节约带宽。它的核心思想就是把文件先在服务器进行压缩,然后再进行传输,这样可以显著减少文件传输的大小。当传输完毕后,客户端游览器会重新对压缩过的内容进行解压缩。如果没特殊情况的话,所以的文本内容都应该能被gzip压缩,例如:html(php),js,css,xml,txt等。特殊情况就是像一些首页上有很多广告投放的js代码,由于需要每次加载进而进行来访信息统计,所以这些广告代码拥有者网站的js不会经过gzip压缩,
mod_deflate模块,在我们前篇部署的时候已经编译安装进去了。
那么如果没有安装,如何安装呢?并且如果不知道到是否安装了,如何查看呢?
1、mod_deflate模块检查及安装
由于apache2.2.x和2.4.x这两个版本在检查mod_deflate模块是否安装方法方法是不同的。最后,我无奈做了很多测试,下面建议大家这样来检查。
1.
[[email protected]
/]
#
/usr/local/apache/bin/apachectl -M | grep deflate
2.
deflate_module
(static)
#此种结果为编译安装时装的
3.
[[email protected]
/]
#
/usr/local/apache/bin/apachectl -M | grep deflate
4.
deflate_module
(shared)
#此种结果为DSO方式安装的
安装了的话,就可以直接进行压缩配置了,如果没有安装,下面为安装方法
a)编译时安装方法
编译的时候跟上--enable-deflate即可实现安装
b)DSO方式安装
1.
[[email protected]
/]
#
cd /server/tools/httpd-2.4.6/modules/filters/ #切到apache源码包mod_deflate所在的目录下
2.
[[email protected]
filters]
#
/usr/local/apache/bin/apxs -c -i -a mod_deflate.c #以dso的方式编译安装到apache中
3.
[[email protected]
filters]
#
ll /usr/local/apache/modules/mod_deflate.so #检查mod_deflate是否安装,成功安装这里会显示出该文件
4.
-rwxr-xr-x
1 root root 76697 11月 5 07:50 /usr/
local
/apache/modules/mod_deflate.so
扩展:使用DSO方式安装,apxs后跟的参数详解
1.
-c
此选项表明需要执行编译操作。它首先会编译c源程序(.c)files为对应的目标代码文件(.c),然后连接这些目标代码和files中其余的目标代码文件(.c和.a),以生成动态共享对象dsofile。如果没有指定-s选项,则此输出文件名由files中的第一个文件名推测得出,也就是默认mod_name.so。
2.
-i
此选项表示需要执行安装操作,以安装一个或多个动态共享对象到服务器的modules目录。
3.
-a
此选项自动增加一个LoadModule行到httpd.conf文件中,以**此模块,或者,如果此行已经存在,则启用之。
4.
压缩模块配置
2、配置压缩参数
注意如果我们是编译安装时已经编译进去的,此时我们需要先将httpd.conf主配置文件中
1.
LoadModule
deflate_module modules/mod_deflate.so
此行解锁后再进行下面操作,不然下面的操作会报错。
我们需要在虚拟机的<VirtualHost*:80></VirtualHost>中添加如下配置即可实现压缩
01.
<
ifmodule
mod_deflate.c>
02.
DeflateCompressionLevel
9 #压缩等级,越大效率越高,消耗CPU也越高
03.
SetOutputFilter
DEFLATE #启用压缩
04.
AddOutputFilterByType
DEFLATE text/html text/plain text/xml #仅压缩限制特定的MIME类型文件:
05.
AddOutputFilterByType
DEFLATE application/javascript
06.
AddOutputFilterByType
DEFLATE text/css
07.
AddOutputFilterByType
DEFLATE image/gif image/png image/jpe image/swf image/jpeg image/bmp
08.
#DeflateFilterNote
ratio #在日志中放置压缩率标记,下面是记录日志的,这个功能一般不用
09.
#LogFormat
'"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
10.
#CustmLog
logs/deflate_log.log deflate
11.
</
ifmodule
>
下面是朋友公司的另外一种压缩配置,有兴趣的朋友们也可以操作操作。
01.
<
ifmodule
mod_deflate.c>
02.
DeflateCompressionLevel
9
03.
SetOutputFilter
DEFLATE
04.
DeflateFilterNote
Input instream #声明输入流的byte数量
05.
DeflateFilterNote
Output outstream #声明输出流的byte数量
06.
DeflateFilterNote
Ratio ratio #声明压缩的百分比
07.
#LogFormat
'"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate #声明日志类型
08.
#CustomLog
logs/deflate_log.log deflate #声明日志类型
09.
AddOutputFilterByType
DEFLATE text/html text/plain text/xml text/css application/javascript #仅压缩限制特定的MIME类型文件
10.
</
ifmodule
>
执行上面的添加后,我们对apache进行优雅重启
1.
[[email protected]
/]# /usr/local/apache/bin/apachectl graceful
下面访问我们的网站,然后用火狐或者google游览器的YSLOW插件进行压缩效果的查看
怎么样,是不是已经进行压缩了啊!
我们在企业生产环境中时,在启用mod_deflate时,一定要注意,对于太小的文件和某些格式的图片不要对它们进行压缩,有可能越压越大。
下面给出大家几乎是所有的AddOutputFilterByTypeDEFLATE后跟的压缩文件类型,大家可以参照选择。
1.
text/plain
text/html text/php text/xml text/css text/javascript
2.
application/xhtml+xml
application/xml application/rss+xml application/atom_xml application/x-javascript application/x-httpd-php image/svg+xml image/gif image/png image/jpe image/swf image/jpeg image/bmp
八、mod_expires缓存功能
虽然我们上面通过mod_deflate模块启用了压缩,从很大程度上节约了企业带宽,降低了企业成本。可是由于现在越来越多的图片、脚本、css和flash被嵌入到页面中,当客户访问站点势必会做很多次的http请求,因此我们还可以通过mod_expires缓存模块来设置ExpiresHeader来缓存这些文件。Expires是通过header报文来指定特定类型的文件在游览器中的缓存时间的。平时,我们大多数的图片,flash在发布之后都是不需要经常修改的,因此做了缓存之后,游览器第一次从服务器下载之后,就不需要再从服务器下载这些文件而是直接从游览器缓存中读取了。这样客户访问页面的速度就会大大加快,企业的带宽压力也得到了缓解。
1、mod_expires模块检查及安装
检查mod_expires模块是否安装的方法如下:
1.
[[email protected]
/]
#
/usr/local/apache/bin/apachectl -M | grep deflate
2.
expires_module
(static)
#此种结果为编译安装时装的
3.
[[email protected]
/]
#
/usr/local/apache/bin/apachectl -M | grep deflate
4.
expires_module
(shared)
#此种结果为DSO方式安装的
安装了的话,就可以直接进行压缩配置了,如果没有安装,下面为安装方法
a)编译方式安装
编译的时候跟上--enable-expires即可实现安装
b)DSO方式安装
1.
[[email protected]
/]
#
cd /server/tools/httpd-2.4.6/modules/filters/ #切到apache源码包mod_expires所在的目录下
2.
[[email protected]
filters]
#
/usr/local/apache/bin/apxs -c -i -a mod_expires.c #以dso的方式编译安装到apache中
3.