原文地址:
Caching Tutorial for Web Authors and Webmasters1 什麼是web緩衝?人們為什麼使用它們?2 web緩衝的類型 2.1 瀏覽器緩衝 2.2 代理緩衝 2.3 網關緩衝4 web緩衝如何工作6 構建一個有緩衝意識的網站用到的技巧7 寫有緩衝意識的指令碼
1 什麼是web緩衝?人們為什麼使用它們?
web緩衝位於一個或者多個伺服器和一個或者多個用戶端之間,監視其中的請求,節約響應的數量。例如:頁面,圖片和檔案。如果對相同的url地址的另外一個請求,可以使用已有的響應,而不是向原始伺服器重新請求。
使用web緩衝有兩個主要原因:
1、減小延遲。因為請求從緩衝,這個離用戶端更近的地方,得到響應,而不是從原始伺服器。花費更少的時間擷取內容並且呈現出來,使得web看起來響應更快。
2、減少網路傳輸。因為響應被重用,減少了用戶端的頻寬使用。如果頻寬需要付費的話,還可以節省開支,保持對頻寬的較小需求。
2 web緩衝的類型2.1 瀏覽器緩衝
如果你開啟現代瀏覽器的設定對話方塊,都會發現一個快取項目設定。允許你使用硬碟來儲存緩衝的內容。緩衝都有相似的工作原理。它會檢查內容是否新鮮,每次會話都會檢查,也就是瀏覽器的一次調用。
這種緩衝在你瀏覽已經瀏覽過的頁面的時候非常有用,如果你查看同一張圖片,瀏覽器會緩衝起來,瞬間就可以顯示出來。
2.2 代理緩衝
代理緩衝以相似的方式工作,但是規模更大。代理以相同的方式服務於成百上千的使用者,大公司或者ISP通常在防火牆上面設定他們,或者是單獨的裝置。
因為代理緩衝不是用戶端或者原始伺服器的一部分,他們位於網路的某個地方,請求會經過他們。使用他們的一個辦法是設定你的瀏覽器代理,告訴瀏覽器使用那些代理。另外一個方法是攔截代理。攔截代理是通過網路底層是實現的,用戶端不需要設定,甚至不需要知道他們的存在。
代理緩衝是一種共用的緩衝,同時不止有一個使用者使用,同時有很多使用者使用,使得他更擅長於減小延遲和減少頻寬。因為常用的內容會被多次的使用。
2.3 網關緩衝
和“反向 Proxy緩衝”一樣,網關緩衝也位於用戶端和伺服器的中間,他不是ISP部署用來減少頻寬的,而是web網站管理員部署,使得網站更容易擴充,更可靠,擁有更好的效能。
有很多種方法可以將請求定位到網關緩衝,典型的是用負載平衡,在用戶端看來好像訪問了原始伺服器。
CDN(Content Delivery Network)也可以用來提供網關緩衝功能。
教程主要講述瀏覽器緩衝和代理緩衝,部分內容對於那些對網關緩衝感興趣的人也有用。
4 web緩衝如何工作
所有的緩衝都有一些列規則,用來決定在緩衝有效情況下,什麼時候為表現層服務。一部分規則在協議(http1.0 http1.1)中設定,一部分由管理員設定。
通常來講,包含下面的一些規則:
1、如果響應的頭部資訊中包含不需要緩衝的設定,那就不需要緩衝。
2、如果請求是驗證方面的,或者是安全連線(https),不會被緩衝。
3、在下列情況下,代表緩衝中的一個內容是新鮮的代表它可以在不訪問原始伺服器的情況下發送給用戶端)
3.1 包含expires設定,或者是age-controlling設定,並且還在保鮮期內。
3.2 如果緩衝的內容剛被表現層使用,而且它還沒有被修改過。
新鮮的內容直接從緩衝或者,不用去原始伺服器擷取。
4、如果表現層到期,將會訪問原始伺服器並且驗證它,或者告訴緩衝是否緩衝的拷貝可用。
5、在下列情況,例如,從網路中斷連線,緩衝會提供舊的響應內容,而不會訪問原始伺服器。
如果響應中沒有ETag or Last-Modified這些資訊,也沒有任何關於新鮮的明顯資訊,通常,不總是,將被認為不使用緩衝。
新鮮度和驗證的資訊對於緩衝的工作來說都是很重要內容,新鮮度的資訊直接從緩衝中擷取,驗證的資訊保證在沒有被修改的情況下,避免發送完整的內容。
6 構建一個有緩衝意識的網站用到的技巧
除了重新整理資訊和驗證,下面的技巧可以使你的網站更加緩衝友好。
1、使用一致的url地址。這是一條關於緩衝的黃金法則。如果你在不同的頁面,對不同的使用者,或者是不同的網站,提供相同的內容,應該使用相同的url地址。這是最容易,也是最有效,使你的網站緩衝友好的方式。例如:如果你使用“/index.html”在某個地方,那麼請一直使用這個地址。
2、在不同的地方使用公用的圖片庫,及公用的元素。
3、對於緩衝中不經常改變的圖片和頁面,使用Cache-Control: max-age,並且設計一個較大的值。
4、對於緩衝中有規律的改變的內容,給max-age或者是expire設定適當的值。
5、如果一個資源尤其是需要下載的檔案)的內容發生了變化,可以重新命名這個資源。那樣的話,你可以設定一個將來的到期時間,還可以確保提供了正確的版本。
6、不要改變那些沒有變化的檔案。如果你這麼做,所有的檔案都會有一個新Last-Modified日期,會導致緩衝失效。例如:當你更新網站的時候,不要拷貝覆蓋整個網站,只是替換那些變化了的檔案就可以了。
7、盡量少用ssl,因為加密的頁面不會緩衝,只在你需要的時候使用,而且在ssl頁面中少用圖片。
8、使用REDbot檢查你的網頁,它可以協助你應用這篇教程中的很多概念。
7 寫有緩衝意識的指令碼
預設情況下,很多指令碼不會返回驗證回應標頭中的Last-Modified or ETag),或者是重新整理資訊Expires or Cache-Control)。同時很多指令碼是動態,就是說每次請求會返回不同的響應,
通常來說,如果一個指令碼的產出,對於一段時間之後的相同請求,是可以重用的,它就應該可以緩衝。如果指令碼改變的內容依賴於url,它是可以緩衝的;如果產出依賴於cookie,驗證資訊,或者是其他外部條件,那麼就不要緩衝它。
1、使得一個指令碼緩衝友好效能更優)的最好辦法是,當指令碼變化的時候,把指令碼的內容輸出到一個普通檔案。這樣web服務就可以像對待其他web page一樣對待它,使得你的工作更輕鬆。記住,只在指令碼發生變化的時候,才寫檔案,這樣Last-Modified中的時間才會保留下來。
2、另一個緩衝指令碼為有限的新鮮的辦法是,設定age相關的header。儘管可以通過expires來做,不過最容易的辦法還是用Cache-Control: max-age,這樣可以使得在請求之後的一段時間儲存新鮮。
3、如果你沒有按照上面的方法做,你需要在指令碼上產生一個驗證,用來響應帶有If-Modified-Since or If-None-Match的請求。可以通過解析http header來實現,如果沒有修改,返回304 Not Modified響應。
4、不隨便使用POST,對於post的響應不會被緩衝;如果你使用get,緩衝才會儲存將來用到的資訊。
5、不要在url中嵌入特殊的使用者資訊,除非嵌入的資訊對使用者來說是唯一的。
6、在回應標頭中產生Content-Length。這很容易做到,它允許在長串連中使用指令碼的響應。允許用戶端在一次tcp/ip串連中做多次響應,而不是每次請求都建立一個串連。使得你的網站訪問更快。