虽然我们之前通过mod_deflate模块启用了压缩,从很大程度上节约了企业带宽,降低了企业成本,可是由于现在越来越多的图片、脚本、Css和Flash被嵌入到页面中,当客户访问站点势必会做很多次的http请求,因此我们还可以通过mod_expries缓存模块来设置ExpiresHeader来缓存这些文件。
Expires是通过header报文来指定特定类型的文件在浏览器中的缓存时间的,平时,我们大多数的图片,flash在发布之后都是不需要经常修改的,做了缓存之后,浏览器第一次服务器下载之后,就不需要再从服务器下载这些文件而是直接从浏览器缓存中读取了,这样客户访问页面的速度就会大大加快,企业的宽带压力也得到了缓解。
一、检查mod_expires模块是否安装
[root@localhost ~]# /usr/local/apache/bin/apachectl -M | grep expires #什么输出否没有,证明并没有安装;
所以需要安装mod_expires,安装的方式有两种:
a)编译方式安装
在安装Apache的时候,进行预编译阶段使用--enable-expirs即可实现安装
b)DSO方式安装
[root@localhost ~]# /usr/local/apache/bin/apachectl -M | grep expirs
[root@localhost ~]# cd /usr/local/src/httpd-2.4.16/modules/metadata/ #cd 到Apache源码包mod_expires所在目录下
[root@localhost metadata]# ls mod_expires.c
mod_expires.c
[root@localhost metadata]#
以DSO的方式编译安装到apache中:
[root@localhost metadata]# /usr/local/apache/bin/apxs -c -i -a /usr/local/src/httpd-2.4.16/modules/metadata/mod_expires.c
三个小参数说明:
-c 此选项表明需要执行编译操作
-i 此选项表示需要执行安装操作,以安装一个或多个动态共享对象到服务器的modules目录。
-a 此选项自动增加一个loadModule行到httpd.conf文件中,以激活此模块,或者,如果此行已经存在,则启用之。
安装了mod_expires.so之后进行以下权限设置:
[root@localhost metadata]# chmod 755 /usr/local/apache/modules/mod_expires.so
注意如果我们是编译安装时候已经编译进去的,要先在Apache的配置文件中,解锁以下行,在进行操作,不然会报错!!
[root@localhost metadata]# vim /etc/httpd/httpd.conf
通过DSO的方式编译安装的,在apache的配置文件中,就自动将#号取消掉了,这个是由于 -a参数决定的!!
此时再检查缓存模块是否安装:
[root@localhost metadata]# /usr/local/apache/bin/apachectl -M | grep expires
expires_module (shared) #安装的apache中已经存在了缓存模块
二、配置缓存
缓存的用法有三种,分别对全局、对目录、对虚拟主机
对目录和对全局差不多,只是将配置放在目录模块下面,所以不进行记录,下面做对全局和对虚拟主机的实验;
1、对全局
对全局的配置就是在apache主配置文件httpd.conf的末尾加入如下参数即可
[root@localhost metadata]# vim /etc/httpd/httpd.conf
在末尾插入以下参数:<IfModule mod_expires.c>
ExpiresActive on #缓存开启
ExpiresDefault "access plus 12 month" #缓存默认的时间12个月
ExpiresByType text/html "access plus 12 months" #以下的都是针对各种类型做缓存
ExpiresByType text/css "access plus 12 months"
ExpiresByType image/gif "access plus 12 months"
ExpiresByType image/jpeg "access plus 12 months"
ExpiresByType image/jpg "access plus 12 months"
ExpiresByType image/png "access plus 12 months"
EXpiresByType application/x-shockwave-flash "access plus 12 months"
EXpiresByType application/x-javascript "access plus 12 months"
ExpiresByType video/x-flv "access plus 12 months"
</IfModule>
access = now =A ===> 从访问开始到缓存失效时间 plus只是关键词,用来添加时间的,上面就是从访问开始到失效是12个月
modication = M ===> 从最后一次修改到缓存失效的时间
具体时间可以自定义: days weeks months 都可以!!
检测以下httpd.conf的语法: 如果出问题,有可能是windows往linux中复制的时候存在符号问题;手敲一遍就可以解决,
语法不存在问题,就直接重启;
然后使用本地浏览器去访问测试,查看缓存时间:如下
第一次访问:返回code 200;
刷新访问:服务端返回code 304,说明来自于缓存;并且查看到缓存时间12 个月!
将HTTP配置文件中html格式的修改成 3 days,来进行反复测试:
重启Apache服务,进行测试:如下 缓存时间已经变为 3 days;同理修改为 3 weeks 也是可以的;
2、对虚拟主机
对虚拟主机的配置就是在apache的虚拟主机配置文件httpd-vhost.conf中添加如下参数即可
修改配置文件,如下
[root@localhost ~]# vim /etc/httpd/httpd.conf
DocumentRoot "/usr/local/apache/htdocs" #需要将该行在配置文件中注释掉,因为这个是访问我们根路径的;
Include /etc/httpd/extra/httpd-vhosts.conf #需要将虚拟主机的include调用开起来;
修改httpd-vhosts.conf文件;如下:
[root@localhost ~]# cd /etc/httpd/extra/
[root@localhost extra]# vim httpd-vhosts.conf
[root@localhost extra]# mkdir -pv /www/html #创建目录-P递归创建,-v显示创建过程
[root@localhost extra]# echo "<h1>www.zhanggeng.cn</h1>" > /www/html/index.html
# 编辑/www/html/index.html 文件[root@localhost extra]# /etc/init.d/apachectl restart #重启apache
测试在虚拟主机里是否生效:第一次访问返回code 200:
再次刷新,第二次访问:缓存时间 3 weeks ;和在虚拟主机部分设置的一样;
三、扩展:expires模块的语法
expires模块用到了ExpiresDefault和ExpiresByType两个指令,下面是这两个指令的语法。
ExpiresDefault “<base>” [plus] {<num><type>}*"
ExpiresByType type/encoding "<base> [plus] {<num><type>}"
其中<base>的参数有三个:access、now(等价于access)、modification
access、now以及A
三种写法的意义相同,指过期时间从访问时开始计算
modification以及M
意义相同,指过期时间是以被访问文件的最后修改时间开始计算。
Plus关键字是可选的:
<num> 必须是整数,确保可以atoi()所接收。(atoi可以把字符串转换成长整型数)
<type>参数类型:years、months、weeks、days、hours、minutes、seconds
例如:下面3个指令都表示文档默认的有效期是一个月
ExpiresDefault “access plus 1 months”
ExpiresDefault “access plus 4 weeks”
ExpiresDefault “access plus 30 days”
有效期可以通过增加 “<num><type>” 子句进一步调整
ExpiresByType text/html “access plus 1 month 15 days 2 hours”
ExpiresByType image/gif “modification plus 5 hours 3 minutes”
缓存优化对企业来说是至关重要了的,不同的业务类型,对于缓存的类型和时间又各不相同,大家具体可以对
淘宝、京东、新浪、谷歌等站点进行测试,看看他们的缓存时间是多少,并思考下为什么那样设置?
一般来说,图前的缓存时间设置时间长一点,对于文字的缓存略少;
缓存的设置有如下优点:
1、缩短服务的响应时间
2、减轻服务器负担
3、减少网络带宽使用量,降低企业成本
但是他的缺点也是显而易见的,由于使用了缓存设置,导致被缓存的内容更新了,但是客户看到的却还是旧的;
如何解决被缓存文件及时更新这个问题呢?
第一种:缩短缓存时间,根据情况,不一定要过短
第二宗:对缓存的对象改名;