最佳化AEM網站快取

最佳化AEM架構中的快取,是大幅提升效能的最快速方式之一。 本文主要說明如何最佳化AEM架構中可用的各種快取。

說明 description

環境

Adobe Experience Manager

問題/症狀

如何最佳化AEM網站快取?

AEM架構和快取

在所有AEM架構中,使用者造訪您的網站時會遇到多個快取階層。 在標準AEM架構中需考慮4個快取層。 這包括網頁瀏覽器、CDN、Dispatcher和AEM執行個體。

screenshot_2018-03-25160541

解決方法 resolution

A.瀏覽器快取

使用者重複造訪您的網站時遇到的第一個快取層級是自己的瀏覽器。 瀏覽器層級的快取通常透過 Cache-Control: max-age=… 回應 頁首. 此 max-age 設定會告訴瀏覽器,在嘗試「重新驗證」或再次從網站要求之前,它應該快取檔案的秒數。 這個快取的概念 max-age 通常稱為「快取有效期」或TTL (「存留時間」)。

「 」中有各種選項(或「指示」) Cache-Control 影響快取發生的標頭。 以下是一些常見的指示:

  1. private - Cache-Control標頭中的private指示詞可讓檔案只在瀏覽器中快取,不會在CDN等中繼快取中快取。 此指示的實用方式是如果您的頁面包含個人化/使用者特定內容。

    使用範例: Cache-Control: max-age=300, private

  2. s-maxage - Cache-Control標頭中的s-maxage指示詞可讓您為CDN之類的共用快取設定不同的TTL。 設定此值時,瀏覽器會使用max-age中設定的內容,而其他快取會改為遵循s-maxage設定。

    使用範例: Cache-Control: max-age=600, s-maxage=300

現代瀏覽器全都支援 Cache-Control 然而,HTTP/1.0中有些舊的已棄用標頭仍可能會對快取產生影響。 這些標題為 過期Pragma. 如果您不需要支援非常舊的瀏覽器,那麼請勿傳送這些回應標題。

除了快取以外,重新驗證也是一個重要的概念。 重新驗證仰賴 上次修改時間(回應) / If-Modified-Since (請求)標頭,以及 ETag (回應) / If-None-Match (請求)標頭。

測試瀏覽器時請小心:

在Google Chrome中測試快取時,如果您透過https進行測試,而且您具有自我簽署憑證,則不會快取任何內容。 當憑證不受信任或無效時,Chrome不會快取回應或執行重新驗證。

Dispatcher注意事項:

AEM Dispatcher v4.2.3及舊版有一個問題,其中 /enableTTL 僅快取使用 max-age 指令。 這表示即使 私人s-maxage 指令已設定,若符合下列條件,它仍會快取 max-age 已設定。 此問題在Dispatcher 4.2.4及更高版本中得以解決。

B. CDN快取

A CDN或「內容傳遞網路」,是Web伺服器的分散式網路,旨在從最接近使用者的位置快取及提供內容。 這樣可以減少網路躍點數,以及使用者電腦與您的內容之間的距離,進而降低 「來回時間」(RTT). RTT是瀏覽器傳送要求至您的網站及接收回應所花的時間。 由於CDN提供者領域的競爭,使得CDN變得極具成本效益。 因此,決定使用CDN來處理您的網站相當容易。 如果您尚未使用CDN,則務必應該在您的網站中融入CDN。

有許許多多的CDN提供者,每一家都提供不同的功能和設定。

CDN快取如何運作?

CDN會依照類似瀏覽器的規則快取內容。 他們仰賴 Cache-Control HTTP 回應 頁首,通常回退到 過期 頁首(若否) Cache-Control 找到標頭。

大部分的CDN都會提供觸發手動排清快取的方法。  在許多情況下,將快取排清傳播到具有您的檔案的所有邊緣伺服器會有一些延遲(例如15分鐘)。

最佳化CDN使用

為了確保在CDN中快取檔案的方式最佳化,有以下幾點:

  1. 使用支援 stale-while-revalidatestale-if-error 中的指示 Cache-Control 標頭。

    • stale-while-revalidate — 指令可告知CDN在快取檔案過期後擷取新的檔案時,提供該檔案的舊(已快取)版本。
    • stale-if-error — 同樣地,當來源在重新驗證期間回應錯誤時,該指示可告知CDN提供檔案的舊(已快取)版本。
  2. 未預先壓縮的所有檔案型別的GZip壓縮回應。

    您應該從排程程式層級執行這項操作。 這將確保您減少傳送至CDN的位元組數。 CDN通常依傳輸的位元組收費,因此壓縮回應可降低成本。

    • 在Dispatcher層級上啟用GZip壓縮: Apache - 使用mod_deflate. 當mod_deflate使用Vary時,請務必小心。 在某些情況下,Vary標題可能會導致CDN和瀏覽器完全略過快取。

    • Microsoft IIS — 使用 動態壓縮.

    • 不允許大型檔案或已經壓縮的檔案使用gzip壓縮。 請注意,大部分的影像和視訊格式都已預先壓縮。 在Web伺服器層級即時壓縮這些檔案時,效能成本非常高。

      • 在Apache上,這可透過AddOutputFilterByType指示詞來完成: AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
      • 在IIS上,這可以透過 < dynamicType> 設定。
    • 如果您的CDN提供者支援 Edge-side包含 (ESI)然後運用此功能。 AEM元件可使用ESI進行分組。 要執行此操作,請使用Apache \[ Sling Dynamic包含\] 或實施自訂解決方案。 如果您有相當多的靜態頁面,但需要在頁面的某些部分提供較動態的內容,這個選項會很有用。 針對這些情況,您基本上是將頁面分割為多個CDN檔案。 如此一來,您就可以將頁面的不同部分快取至不同時段。

受歡迎的CDN提供者

以下為部分熱門CDN提供者的清單:

此外還有數種功能,各有不同功能。

注意:

請留意 Vary 回應標頭。 在某些情況下, Vary 可能會導致CDN和瀏覽器完全略過快取。 一般而言,請避免新增 Vary 除了 Vary: Accept-Encoding (僅在回應經gzip壓縮後套用)。 換言之,如果您需要「變更」回應的輸出,請使用不同的URL。

例如,如果您的行動版與案頭版的HTML版本不同,則使用不同的URL。 這可讓CDN和瀏覽器更有效地進行快取。

C. AEM Dispatcher快取

如果CDN快取已過期,則要求會送達AEM Dispatcher快取。 在此層級,有許多操作可以執行以最佳化快取。

由於這是一個較大的主題,請參閱 本文 以取得有關如何最佳化Dispatcher快取的詳細資訊。

D. AEM Publish執行個體

在AEM層級,應執行幾項操作以最佳化各種快取層:

  1. 設定下列HTTP回應標頭,這些標頭在AEM預設情況下未設定。

    1. Cache-Control: max-age=… — 若要設定此標題, ACS Commons - Dispatcher TTL 可使用,或您可實作自訂程式碼以進行設定。
    2. 上次修改時間 — 如果頁面內容保持相對靜態(例如文章),則您可以將其last-modified標題設為cq:lastModified date/time (上次修改文章的時間)。 不過,如果頁面是動態的,且元件內容包含JCR查詢結果,則最好將其設定為使用目前的日期/時間。
    3. ETag — 如果您決定使用這個而非 上次修改時間,您可以撰寫 ReplicationEventListener 接聽頁面啟用並產生頁面內容的md5雜湊。 這可以在作者執行個體的頁面上設定為頁面jcr:content節點上的屬性。 復寫頁面時,系統會將頁面傳送至發佈執行個體。 對於內容相對靜態的頁面元件,這可以正常運作,但如果頁面有點動態或參考了大量內容,則必須省略(或計算) ETag。
  2. 如果網站有個人化/動態內容:

    1. 使用 Apache Sling Dynamic包含 將內容分組,以便可以在不同時段快取頁面的不同部分。

      1. 快取可透過下列技術完成:

        • CDN上的Edge-side Include (ESI)
        • 網頁伺服器上的Server-side Include (SSI)
        • 瀏覽器上的非同步Javascript和XML (AJAX)
      2. 頁面上的元件可以分成不同的請求,以便針對不同的時段進行快取。 相對靜態的頁面部分可以快取較長的一段時間。

    2. 考慮使用 ACS Commons的HTTP快取功能.

  3. 最佳化使用者端程式庫。

    1. 在使用者端資料庫上啟用縮制。

    2. 如果使用者端資料庫中的檔案已預先縮制,則停用該使用者端資料庫上的縮制。 編輯cq:ClientLibraryFolder節點:

      1. 將屬性jsProcessor設為字串型別[ ] 使用值min:none
      2. 並將屬性cssProcessor設定為字串型別[ ] 使用值min:none
      3. 檢視更多詳細資料, 此處.
    3. 內嵌使用者端程式庫 以精簡及減少js和css檔案。

    4. 實作 ACS Commons的versioned-clientlibs 以允許CDN和Dispatcher在較長的時間內快取js和css檔案。

recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f