# 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手冊。**