# mod_expires模块介绍与应用指南 [TOC] ## mod_expires 介绍   `mod_expires`允许通过apache的配置文件控制HTTP的`"Expires:"`和`"Cache-Control:"`头内容,这个模块控制服务器应答时的`expires`头内容和`Cache-Control`头的max-age指令。有效期可以设置为相对于源文件的最后修改时刻或者客户端访问时刻。   这些HTTP头像客户端表名内容的有效性和持久性,如果客户端本地有缓存,则内容就可以从缓存(除非已经过期)而不是从服务器读取,然后客户端会检查缓存中的副本,看看是否已经过期或者失效,已决定是否重新从服务器获取内容更新。   要修改Cache-Control头中max-age(参见[RFC 2616 section 14.9](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9)) ## 模块安装方法 ### 检查是否已安装mod_expires模块 1. 编译安装http情况时是否已经安装mod_expires,如下命令: ~~~ [root@luo.centos6.5 ~] # apachectl -l|grep mod_expires mod_expires.c #或者使用如下命令: [root@luo.centos6.5 ~] # apachectl -M|grep expires expires_module (static) Syntax OK ~~~ 2. 如果是以DSO方式编译的则查看方法为: ~~~ [root@luo.centos6.5 ~] # ls -l /usr/local/apache/modules/|grep expires -rwxr-xr-x 1 root root 30231 Apr 4 05:55 mod_expires.so # 如果查询到了mod_expires表示已经安装此模块支持了 [root@luo.centos6.5 ~] # grep mod_expires.so /usr/local/apache/conf/httpd.conf LoadModule expires_module module/mod_expires.so ~~~ ### mod_expires模块的常规安装方式 #### 编译配置时可加入参数:`--enable-expires` 可以通过查看模块编译的帮助信息,如下: ~~~ [root@luo.centos6.5 /usr/local/src/httpd-2.2.31] # ./configure --help|grep expires --enable-expires Expires header control ~~~ > 允许激活通过配置文件控制HTTP的`'Expires:'`和`'Cache-Control:'`头内容,即对网站图片、JS和CSS等内容,提供在客户端浏览器缓存的设置,**这是apache调优的重要选项之一。** 具体编译配置如下: ~~~ [root@curder-CenOS-6.5 /usr/local/src/httpd-2.2.31] # ./configure --prefix=/application/apache2.2.31 \ --enable-deflate \ --enable-expires \ ~~~ #### mod_expires DSO方式安装 ~~~ [root@luo.centos6.5 /usr/local/src/httpd-2.2.31] # cd /usr/local/src/httpd-2.2.31/modules/metadata/ # 切换到apache源码所在模块程序下 # /usr/local/apache/bin/apxs -c -i -a mod_expires.c # 以dso的方式编译加入apache中 # ls /usr/local/apache/modules/mod_expires.so # 检查是否成功安装 ~~~ > **apxs 参数说明** `-c` 此选项表示需要执行编译操作,它首先会编译c源程序(.c)files为对应的目标代码文件(.o),然后连接这些目标代码和files中其余的目标代码文件(.o和.a),以生成动态共享对象.dsofile,如果没有指定`-o`选项,则此输入文件名由files中的第一个文件名推测得到,也就是默认为 mod_name.so `-i` 此选项表示需要执行安装操作,以安装一个或多个动态共享对象到服务器的modules目录中。 `-a` 此选项自动增加一个LoadModule 行到apache的主配置文件中,用以激活此模块或者如果此行已经存在则启用之。 **操作实践过程** ~~~ # cd /usr/local/src/httpd-2.2.31/modules/metadata # /usr/local/apache/bin/apxs -i -c -a mod_expires.c chmod 755 /usr/local/apache/modules/mod_expires.so [activating module `expires' in /usr/local/apache/conf/httpd.conf] 出现上面的信息表示已经编译成功 ~~~ **检查安装结果** ~~~ # ls /usr/local/apache/modules/mod_expires.so /usr/local/apache/modules/mod_expires.so # grep expires /usr/local/apache/conf/httpd.conf LoadModule expires_module modules/mod_expires.so ~~~ **查看当前http的响应头** ~~~ # curl -I localhost HTTP/1.1 200 OK Date: Sat, 12 Dec 2015 09:47:26 GMT Server: Apache/2.2.31 (Unix) DAV/2 Last-Modified: Fri, 11 Dec 2015 15:32:14 GMT ETag: "14d65b-11-526a107159b80" Accept-Ranges: bytes Content-Length: 17 Content-Type: application/x-httpd-php ~~~ ## mod_expires 模块应用 ### mod_expires在httpd.conf中应用 将下列内容完整的追加到apahce的主配置文件`httpd.conf`最后即可对所有虚拟主机生效。 ~~~ ExpiresActive On ExpiresDefault "access plus 12 month" ExpiresByType text/html "access plus 12 month" ExpiresByType text/css "access plus 12 month" ExpiresByType image/gif "access plus 12 month" ExpiresByType image/jpeg "access plus 12 month" ExpiresByType image/jpg "access plus 12 month" ExpiresByType image/png "access plus 12 month" ExpiresByType application/x-shockwave-flash "access plus 12 month" ExpiresByType application/x-javascript "access plus 12 month" ExpiresByType video/x-flv "access plus 12 month" ~~~ ### expires在http-vhosts.conf中的应用 将上述内容完整的写入到apahce的虚拟主机配置文件`httpd-vhosts.conf`中即可对当前虚拟主机生效。**(注意:放在`<VirtualHost></VirtualHost>标签内`)** * * * * * ## 生产环境mod_expires优点 ### 提升用户体验   由于用户读本地缓存,所以访问的页面就快了,用户体验提升。 ### 节约网站带宽成本   用户读取本地缓存和服务器的交互就少了,也节省了网站的带宽流量成本。既满足了用户,也为公司省钱。 ### 节约网站服务器以及维护成本   用户读取本地缓存和服务器的交互就少了,也节省了网站的带宽流量成本。既满足了用户,也为公司省钱。 ## `expires`失效条件 ### 用户主动清空缓存   当使用了`mod_expires`功能后,当用户访问了一次资源后,在expires时间过期之前,就不会再去服务器下载资源了,除非用户浏览器端主动清空浏览器缓存。 ### 内容缓存期已到   `expires`的时间到了设定时间,此时则内容缓存失效,用户又会重新请求服务器。 ## 控制缓存的方法   如果网站更新功能或更新文件后,用户再访问时的内容还是旧的,怎么解决这个问题呢?   1. 对于大公司业务而言,图片等资源一般很少会去修改,将`expires`设置为10年有效期,节约了网站成本。   2. 对于js、css偶尔会变化的资源,一般expires设置时间会比较短,如1~30天。   3. 在更新文件上采取措施,如更新后以新的文件名发布,这样对于用户就又是新的资源了。 ## `expires`特殊缓存情况 1. 特殊缓存,google首页expires一日(经常更改logo图片); 2. 网站的js统计代码不会设置缓存,如http://www.baidu.com/js/bdsug.js?v=1.5.2.2 >[info] **有关`mod_expires`模块的详情可以参考apache手册。**