Speeding up your web site

網站的回應速度快慢一直是攸關於使用者會不會停留下來繼續瀏覽最主要的關鍵。最近工作上也面臨到同樣的問題,網站回應速度不佳,客戶抱怨導致客群流失。除了提昇硬體容量跟頻寬這種暴力辦法之外(上級長官已經指示了,沒多餘預算可做容量提升),最後還是得回頭來看看系統面與 AP 面是否還有調整的空間。

Best Practices for Speeding Up Your Web Site 是 Yahoo 做效能調校時整理出來的 14 項 Rule,涵蓋了系統面與網頁程式開發時需注意的事項。各個 Rule 的細節這兒就不提了,有興趣的可自行至上述網址研讀即可。我僅針對 Rule 3 “Add an Expires Header” 拿來套用在 Broso Web 的設定,套用的結果的確效果顯著。

Broso 上的應用不外乎是部落格與相簿,所以網站上大部分都是靜態的圖檔、JavaScript、CSS。在沒有設定 Expires Header 之前,即使靜態圖檔內容並未改變,Browser 仍然會發個 Request 來 Broso Web 問問圖檔是否有更新。由於圖檔並未更新,於是 Apache 便會回覆 HTTP Result Code 304 (Not Modified),因此 Browser 便繼續使用 local cache 上的原圖檔來顯示。下面的資料是從 Fiddler 所節錄出來的:

當網頁中的小圖檔眾多時,Browser 所發出詢問圖檔是否更新的 Request 以及 Web Server 所回覆的 304 (Not Modified) Response,將形成嚴重的 overhead。如果確定大部分的靜態資料都是很久才會做更新,便可以針對這類型的資料設定 Expires Header。

HTTP 協定中 Expires 這個 header tag,是由 Web Server 回覆給 Browser。舉例如下:


HTTP/1.1 200 OK
Date: Sun, 25 Nov 2007 15:58:58 GMT
Server: Apache/2.0.61 (Unix) mod_watch/4.3
Last-Modified: Sat, 17 Nov 2007 04:16:21 GMT
ETag: “1e6f13-216e-2d712f40”
Accept-Ranges: bytes
Content-Length: 8558
Cache-Control: max-age=259200
Expires: Wed, 28 Nov 2007 15:58:58 GMT
Content-Type: image/jpeg

Expires 欄位指示這個靜態圖檔一直到 2007/11/28 15:58:58 以後才會過期,因此 Browser 在這個時間之前都不會再發出任何 Request 到 Web Server 來詢問圖檔是否更新,直接使用 local cache 中的圖檔來顯示,所以所有的 304 (Not Modified) Response 都可以省了,便可減輕 Web Server loading 與頻寬,Browser 的顯示速度也會更迅速。

在 Apache 2.0 要啟用 Expires Header,需使用 mod_expires module。預設設定此模組並不會啟用,需重新編譯,並透過 configure 設定需加入此模組,Apache2 才會具有處理 Expires Header 的能力。

重新編譯 Apache2 的方法可以參考先前的文章 – Apache Basic / Digest Realm Authentication,這次我重新編譯 Apache 時使用的 configure 參數如下:

[root@broso httpd-2.0.61]# ./configure –prefix=/usr/local/apache2 –enable-auth-digest –enable-deflate –enable-expires

編譯完畢後,apache2 就具有處理 Expires Header 的能力了,此時便可進行 httpd.conf 的設定了(mod_expires 的詳細語法可參考 Apache Module mod_expires),針對需要設定 Expires Header 的文件種類與預計過期的時間進行設定。


# mod_expire 針對下列 MIME type 設定 Expires header
ExpiresActive On
ExpiresByType image/jpeg “access plus 3 days”
ExpiresByType image/gif “access plus 3 days”
ExpiresByType image/png “access plus 5 minutes”

ExpiresByType image/x-icon “access plus 4 weeks”
ExpiresByType application/x-javascript “access plus 2 weeks”
ExpiresByType text/css “access plus 2 weeks”
ExpiresByType application/x-shockwave-flash “access plus 4 weeks”

設定完畢,重新啟動 Apache2 即可。

再用 Fiddler 來驗證一下 Expires Header 有沒有生效。首先記得先清除 Browser cache,再瀏覽相簿首頁。隨便找一個圖檔來看看 Expires Header 是否已經出現?

再次瀏覽相簿首頁,看看第二次 Browser 是否還會發出 Request 來詢問圖檔是否更新?

敗 Expires 之賜,Browser 已經知道圖檔尚未過期,因此便只會發出 jsp 的 Request 了。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料