我站的速度一直以來(lái)都是比較引以自豪的,據(jù)alexa統(tǒng)計(jì),我站平均打開(kāi)時(shí)間是0.274秒,全球有98%的網(wǎng)站速度比我站慢。
Average Load Time for Webkaka.com
Very Fast (0.274 Seconds), 98% of sites are slower.
這雖然更多歸功于較好的服務(wù)器性能以及比較充足的帶寬,但在網(wǎng)站服務(wù)器優(yōu)化方面也是功不可沒(méi)的。
今天要說(shuō)的是服務(wù)器性能優(yōu)化策略之啟用網(wǎng)頁(yè)緩存。
網(wǎng)頁(yè)緩存包含客戶端瀏覽器緩存和服務(wù)器緩存,這里說(shuō)的是服務(wù)器端網(wǎng)頁(yè)的緩存,這是服務(wù)器性能優(yōu)化的策略之一。由于本站使用的是IIS服務(wù)器,因此Apache、lighttpd等不在本文內(nèi)容談及之內(nèi)。
為什么要啟用服務(wù)器緩存?
有人作了形象的說(shuō)明,緩存就像是一個(gè)大箱子,以頁(yè)面緩存為例,在第一位客戶訪問(wèn)具有緩存機(jī)制的頁(yè)面時(shí),iis會(huì)將該頁(yè)面地址及內(nèi)容記錄下來(lái)放入大箱子中,后續(xù)的客戶在訪問(wèn)該頁(yè)面時(shí),iis直接根據(jù)該地址調(diào)出頁(yè)面內(nèi)容展現(xiàn)在客戶端。這樣減好了訪問(wèn)服務(wù)器的操作,提高了效率。
動(dòng)態(tài)內(nèi)容頁(yè)面也能緩存
我以前一直以為,只有靜態(tài)的內(nèi)容頁(yè)面可以緩存,后來(lái)經(jīng)過(guò)實(shí)驗(yàn),動(dòng)態(tài)內(nèi)容頁(yè)面也可以緩存的。比如webkaka的網(wǎng)站速度診斷首頁(yè),有個(gè)最近測(cè)試列表,那10個(gè)網(wǎng)址是實(shí)時(shí)從測(cè)試列表里讀出來(lái)的,但是因采用了1小時(shí)的網(wǎng)頁(yè)緩存,也就是說(shuō),這個(gè)頁(yè)面的內(nèi)容,只是每小時(shí)變化一次,而不是時(shí)時(shí)刻刻都去讀數(shù)據(jù)的。
動(dòng)態(tài)頁(yè)面也緩存,這樣將大大減少對(duì)服務(wù)器的讀寫(xiě)操作,對(duì)服務(wù)器起了保護(hù)的作用,同時(shí),必將大大減少服務(wù)器內(nèi)存和CPU的使用率,從而提高服務(wù)器的性能。
IIS設(shè)置網(wǎng)頁(yè)內(nèi)容過(guò)期時(shí)間
在Google網(wǎng)站速度優(yōu)化建議里,有一條是“使用瀏覽器緩存”技術(shù),這個(gè)其實(shí)不是什么高深的技術(shù),我們?cè)贗IS里便可輕松設(shè)置。
如下圖
1. 在 IIS 管理器中,單擊“HTTP 頭”選項(xiàng)卡。
2. 選中“啟用內(nèi)容過(guò)期”復(fù)選框。
3. 單擊“立即過(guò)期”、“此時(shí)間段后過(guò)期”或“過(guò)期時(shí)間”,然后在對(duì)應(yīng)的框中輸入所需的過(guò)期信息。
4. 單擊“確定”。
如何檢測(cè)你的網(wǎng)站是否啟用了緩存?
你可以到卡卡網(wǎng)的網(wǎng)站速度診斷平臺(tái),診斷你的網(wǎng)站,然后點(diǎn)擊“性能優(yōu)化”標(biāo)簽,再點(diǎn)擊“使用瀏覽器緩存”項(xiàng),便可知道了。
相關(guān)知識(shí)
我們?cè)诳淳W(wǎng)頁(yè)的header信息時(shí),經(jīng)??吹竭@幾個(gè)參數(shù):Expires、Cache-Control、Last-Modified、ETag,它們是RFC 2616(HTTP/1.1)協(xié)議中和網(wǎng)頁(yè)緩存相關(guān)的幾個(gè)字段。前兩個(gè)用來(lái)控制緩存的失效日期,后兩個(gè)用來(lái)驗(yàn)證網(wǎng)頁(yè)的有效性。要注意的是, HTTP/1.0有一個(gè)功能比較弱的緩存控制機(jī)制:Pragma,使用HTTP/1.0的緩存將忽略Expires和Cache-Control頭。
Expires
Expires字段聲明了一個(gè)網(wǎng)頁(yè)或URL地址不再被瀏覽器緩存的時(shí)間,一旦超過(guò)了這個(gè)時(shí)間,瀏覽器都應(yīng)該聯(lián)系原始服務(wù)器。RFC告訴我們:“由于推斷的失效時(shí)間也許會(huì)降低語(yǔ)義透明度,應(yīng)該被謹(jǐn)慎使用,同時(shí)我們鼓勵(lì)原始服務(wù)器盡可能提供確切的失效時(shí)間。”
Cache-Control
Cache-Control字段中可以聲明多些元素,例如no-cache, must-revalidate, max-age=0等。這些元素用來(lái)指明頁(yè)面被緩存最大時(shí)限,如何被緩存的,如何被轉(zhuǎn)換到另一個(gè)不同的媒介,以及如何被存放在持久媒介中的。但是任何一個(gè) Cache-Control指令都不能保證隱私性或者數(shù)據(jù)的安全性。“private”和“no-store”指令可以為隱私性和安全性方面提供一些幫助,但是他們并不能用于替代身份驗(yàn)證和加密。
Last-Modified
Last-Modified和ETag是條件請(qǐng)求(Conditional Request)相關(guān)的兩個(gè)字段。如果一個(gè)緩存收到了針對(duì)一個(gè)頁(yè)面的請(qǐng)求,它發(fā)送一個(gè)驗(yàn)證請(qǐng)求詢問(wèn)服務(wù)器頁(yè)面是否已經(jīng)更改,在HTTP頭里面帶上” ETag”和”If Modify Since”頭。服務(wù)器根據(jù)這些信息判斷是否有更新信息,如果沒(méi)有,就返回HTTP 304(NotModify);如果有更新,返回HTTP 200和更新的頁(yè)面內(nèi)容,并且攜帶新的”ETag”和”LastModified”。
使用這個(gè)機(jī)制,能夠避免重復(fù)發(fā)送文件給瀏覽器,不過(guò)仍然會(huì)產(chǎn)生一個(gè)HTTP請(qǐng)求。
ETag
既然有了Last-Modified,為什么還要用ETag字段呢?因?yàn)槿绻谝幻腌娭畠?nèi)對(duì)一個(gè)文件進(jìn)行兩次更改,Last-Modified就會(huì)不正確。因此,HTTP/1.1利用Entity Tag頭提供了更加嚴(yán)格的驗(yàn)證。