設定 IIS 7 輸出快取
由 Tali Smith
網際網路資訊服務 (IIS) 包含輸出快取功能,可在記憶體中快取動態 PHP 內容(或 Microsoft® ASP.NET 或傳統 ASP 或其他動態頁面的輸出)。 這會產生巨大的效能改善,因為用來產生動態輸出的腳本不需要針對每個要求執行。 快取可能會根據查詢字串值以及從用戶端傳送至伺服器的 HTTP 標頭來變更快取的輸出。 快取也會與Http.sys內核模式驅動程式整合,以改善效能。
使用輸出快取的時機
Web 內容可分為兩個主要類別:靜態內容和動態內容。
- 靜態內容不會從要求變更為要求。 傳回至網頁瀏覽器的內容一律相同。 靜態內容的範例包括 HTML、JPG 或 GIF 檔案。
- 動態內容是隨每個要求變更的輸出。 範例包括 ASP.NET 或 PHP 內容。
在這兩個類別之間是半動態內容。 想像一下執行資料庫查詢的動態 ASP.NET 頁面。 如果基礎資料庫數據表不常變更,則不會在每個要求上執行此查詢。
IIS 會自動快取靜態內容(例如 HTML 頁面、影像和樣式表單),因為這些類型的內容不會從要求變更為要求。 IIS 也會在進行更新時偵測檔案的變更,而 IIS 會視需要排清快取。
IIS 輸出快取功能是以半動態內容為目標。 它可讓您快取動態要求的靜態回應,並增加延展性。
請注意,並非所有動態頁面都可以利用輸出快取。 高度個人化頁面(例如購物車或電子商務交易)不是很好的候選項目,因為動態輸出不太可能重複要求,而且會浪費用來快取內容的記憶體。 由於對 HTML 表單的 POST 類型要求而輸出的內容也無法快取。
輸出快取的最佳候選專案是動態產生數據的頁面,但不太可能根據URL或標頭資訊從要求變更為要求。 例如,動態調整網頁中顯示影像大小的應用程式是輸出快取的絕佳候選專案,因為快取數據會儲存伺服器,而不需要針對每個要求重新處理影像大小調整。 另一個可以利用輸出快取功能的應用程式類型良好範例是股票刻度器應用程式。
選取快取原則
IIS 支援兩種類型的快取原則:
- varyByQuerystring,其中 URL 相同,但查詢字串值會有所不同。
- varybyHeaders,會根據從用戶端傳送到伺服器的 HTTP 標頭來變更快取。
使快取失效
使用動態內容時,數據可能會經常變更,而且您必須排清快取,以便擷取並重新快取新數據。 請注意,即使數據每秒變更頻率一樣頻繁,快取數據可能仍然很有用:月臺每秒可能會取得數百個要求,而快取可減少資料庫擷取數據、儲存網頁伺服器和資料庫伺服器的額外工作。
IIS 支援兩種方式來使動態內容失效:
- 使用簡單的逾時期間 - 組態屬性為 CacheForTimePeriod。
- 偵測基礎資源的變更 - 組態屬性為 CacheUntilChange。 只有在基礎資源變更時,才想要快取排清時,才使用這種類型的無效配置。
設定 Cache Worthiness
即使您啟用輸出快取,IIS 也不會立即快取要求。 在 IIS 將要求視為「值得快取」之前,必須先要求幾次。快取價值可以透過 ServerRuntimeSection 類別一文中所述的 ServerRuntime 區段來設定。
兩個屬性會決定快取價值:
- frequentHitTimePeriod
- frequentHitThreshold
只有在超過 <frequentHitThreshold>
可快取 URL 的要求抵達 內 <frequentHitTimePeriod>
時,才會快取要求。 的預設設定 frequentHitTimePeriod
為10秒。 的預設設定 frequentHitThreshold
為2次點擊。
透過 IIS 管理員設定輸出快取
使用新 IIS 管理工具中的使用者介面功能,快取相當容易設定。
從 [開始] 功能表中,單擊 [管理員 工具],然後單擊 [網際網路資訊服務 [IIS] 管理員。
在左側的樹檢視中,尋找您的應用程式。
選取 [ 輸出快取 ] 功能表項。
在右欄中,按兩下 [動作] 選單中的 [新增]。 您可以在這裏新增輸出快取規則。
例如,在 [ 擴展名] 字段中,輸入 .php,然後選取 [使用者模式快取]。
按兩下 [ 進階],然後選取 [ 查詢字串變數] 複選框。
在 [查詢字串變數(s)] 文字框中輸入適當的變數。
圖 1:輸出快取範例
透過 Web.config 檔案設定輸出快取
您也可以在內容目錄中找到的本機 Web.config 檔案中設定快取功能。 以下是ShowStockPrice.asp頁面所需的組態範例,其具有 * 的 varyByQueryString 參數 (這表示快取查詢字串參數的所有唯一變化),以及 1 秒的逾時。
<configuration>
<location path="showStockPrice.asp">
<system.webserver>
<caching>
<profiles>
<add varybyquerystring="*"location="Any"
duration="00:00:01" policy="CacheForTimePeriod"
extension=".asp">
</profiles>
</caching>
</system.webserver>
</location>
</configuration>
如果您想要在核心中快取此數據,以獲得更快的效能,只需要將原則屬性變更為 kernelCachePolicy 即可。
注意
Microsoft ASP.NET 已包含輸出快取功能;IIS 輸出快取功能與 ASP.NET 快取平行運作,適用於所有類型的應用程式。
檢查性能計數器
若要查看輸出快取中的效能,您可以在可靠性和效能監視器中查看輸出快取計數器。
- 從 [開始] 功能表中,按兩下 [管理員 工具],然後按兩下 [可靠性] 和 [效能監視器]。 (在 Windows Vista® 或 Windows® 7 上,管理員 控制台 中找到工具。
- 選取右側樹視圖中 效能監視器,然後按下+工具列。
- 流覽至 Web 服務快取 計數器,然後按下它以開啟它。
- 新增總計 URI 快取計數器。
如果您執行效能測試,您可以看到快取 URI 的數目會隨著您要求的專案而增加。
使用內核模式快取
IIS 輸出快取支援兩個快取原則:
- 使用者模式輸出快取原則,其使用位於 IIS 背景工作進程的快取。
- 內核模式快取原則,其使用位於Http.sys核心模式驅動程式的快取。
在核心模式中快取內容可讓您加速網站效能。 您可以在 IIS 輸出快取一文中找到 使用內核模式快取的 範例。
請注意,使用者模式和內核模式輸出快取之間有兩個顯著差異。
- 內核模式輸出快取不支援必須在使用者模式中執行的模組和功能,例如驗證或授權。 例如,如果已啟用基本身份驗證或 Windows® 驗證等驗證配置,快取原則將無法運作。 內容會提供,但不會快取。 您可以在此 知識庫文章中找到更多關於回應為何無法在核心模式中快取的詳細數據。
- 內核模式輸出快取支援 varyByHeaders 屬性,但不支援 varyByQuerystring。
針對快取進行疑難解答
失敗的要求事件緩衝處理 (FREB) 是找出您的要求是否已快取的最佳方式;您也可以了解為什麼不會快取要求。 例如,FREB 記錄中的HTTPSYS_CACHEABLE事件可以告訴您要求未快取,因為未啟用內核模式快取。
下列命令可用來找出核心模式中快取的內容:
netsh http show cachestate
快取您最受歡迎的頁面
您可以將輸出快取設定為只快取預設頁面(最常要求的頁面):
在 %systemdrive%\inetpub\wwwroot\<您的應用程式>目錄中建立名為 default.aspx 的檔案,並新增下列程式代碼:
<%=DateTime.Now%>
從 [開始] 功能表中,單擊 [管理員 工具],然後單擊 [網際網路資訊服務 [IIS] 管理員。
使用左側的樹檢視來瀏覽至您的應用程式。
按兩下 頁面底部的內容檢視 。
選取您的預設檔(例如,Default.aspx頁面)。
在右側的 [ 動作] 功能表中,按兩下 [ 切換至功能 檢視]。 您設定的每個設定現在只會套用至預設檔。
開啟 [ 輸出快取規則] 設定。
將 .aspx 新增為擴展名。
選取 內核模式快取,選取 [ 時間間隔],啟用 [監視快取的檔案], 然後輸入時間間隔,例如 00:00:30。
使用 Windows® Internet Explorer® 瀏覽至
http://localhost//<your application>
。 藉由不斷重新整理頁面(按 Ctrl+F5 確定您未使用瀏覽器快取),您會看到時間不會變更 30 秒。
注意
本文是根據 2007 年 5 月 2 日發行的 Bill Staples 所撰寫的「動態內容的 IIS 7 輸出快取 - 加速 ASP 和 PHP 應用程式」一文中的資訊。