はじめに

トラフィックは、CDN を経由して Apache Web サーバーレイヤーに渡されます。このレイヤーは、Dispatcher を含むモジュールをサポートします。パフォーマンスを向上させるために、Dispatcher は主にキャッシュとして使用され、公開ノードでの処理を制限します。
Dispatcher の設定にルールを適用して、デフォルトのキャッシュ有効期限の設定を変更し、CDN でのキャッシュを可能にします。Dispatcher の設定で enableTTL が有効な場合、Dispatcher は、結果として生成されるキャッシュの有効期限のヘッダーも順守します。これは、再公開されるコンテンツの外部でも特定のコンテンツが更新されることを意味します。

また、このページでは、Dispatcher キャッシュの無効化の方法、およびクライアントサイドライブラリに関するブラウザーレベルでのキャッシュの動作についても説明します。

キャッシュ

HTML/Text

  • デフォルトでは、Apache レイヤーで生成される cache-control ヘッダーに基づいて、ブラウザーによって 5 分間キャッシュされます。CDN はこの値も順守します。
  • デフォルトの HTML/Text キャッシュ設定は、global.varsDISABLE_DEFAULT_CACHING 変数を次のように定義することで無効にできます。
Define DISABLE_DEFAULT_CACHING

これは、例えば、デフォルトで年齢ヘッダーが 0 に設定されているので、ビジネスロジックで(カレンダー日に基づいた値による)年齢ヘッダーの微調整が必要な場合に便利です。ただし、デフォルトのキャッシュをオフにする場合は注意が必要です。

  • AEM as a Cloud Service の SDK Dispatcher ツールを使用して、global.varsEXPIRATION_TIME 変数を定義することにより、すべての HTML/Text コンテンツに対して上書きできます。

  • 次の apache mod_headers ディレクティブを使用して、CDN とブラウザーキャッシュを独立に制御するなど、より詳細なレベルで上書きできます。

    <LocationMatch "^/content/.*\.(html)$">
         Header set Cache-Control "max-age=200"
         Header set Surrogate-Control "max-age=3600"
         Header set Age 0
    </LocationMatch>
    
    メモ

    サロゲート制御ヘッダーは、管理されるAdobeCDN に適用されます。 を使用している場合、 顧客管理 CDNの場合、CDN プロバイダーに応じて異なるヘッダーが必要になる場合があります。

    グローバルキャッシュコントロールヘッダーや、広い範囲の正規表現に一致するヘッダーを設定する場合は、非公開にするコンテンツに適用されないように注意が必要です。複数のディレクティブを使用して、ルールをきめ細かく適用することを検討してください。ただし、ディスパッチャーのドキュメントに記載されているように、ディスパッチャーが検出したキャッシュヘッダーにキャッシュを適用できないことが検出された場合、AEM as a Cloud Service によってキャッシュヘッダーが削除されます。AEM で常にキャッシュヘッダーを適用するように強制するには、次のように always オプションを追加します。

    <LocationMatch "^/content/.*\.(html)$">
         Header unset Cache-Control
         Header unset Expires
         Header always set Cache-Control "max-age=200"
         Header set Age 0
    </LocationMatch>
    

    src/conf.dispatcher.d/cache の下のファイルに次のルール(デフォルト設定)があることを確認する必要があります。

    /0000
    { /glob "*" /type "allow" }
    
  • 特定のコンテンツが CDN で​キャッシュされないようにするには、Cache-Control ヘッダーを private に設定します。例えば、次の例では、secure という名前のディレクトリ下の HTML コンテンツが CDN でキャッシュされないようにしています。

       <LocationMatch "/content/secure/.*\.(html)$">.  // replace with the right regex
       Header unset Cache-Control
       Header unset Expires
       Header always set Cache-Control “private”
      </LocationMatch>
    
    メモ

    dispatcher-ttl AEM ACS Commons プロジェクトを含む他のメソッドでは、値は上書きされません。

    メモ

    しかし、それでも Dispatcher は、独自のキャッシュルールに従ってコンテンツをキャッシュする可能性があります。コンテンツを本当にプライベートにするには、Dispatcher によってキャッシュされないようにする必要があります。

クライアントサイドライブラリ(js、css)

  • AEM のクライアントサイドライブラリフレームワークを使用すると、変更が新しいファイルとして一意のパスで表示されるので、JavaScript と CSS コードは、ブラウザーで無期限にキャッシュできるように生成されます。つまり、クライアントライブラリを参照する HTML は必要に応じて作成されるので、顧客は公開時に新しいコンテンツを体験できます。「immutable」値を考慮しない古いブラウザーでは、cache-control は「immutable」または 30 日に設定されます。
  • 詳しくは、クライアントサイドライブラリとバージョンの整合性を参照してください。

BLOB ストレージに格納されるほど大きい画像とコンテンツ

  • デフォルトではキャッシュされません。

  • 次の Apache mod_headers ディレクティブを使用して、より詳細なレベルに設定できます。

       <LocationMatch "^/content/.*\.(jpeg|jpg)$">
         Header set Cache-Control "max-age=222"
         Header set Age 0
       </LocationMatch>
    

    広範囲にキャッシュしすぎないように注意し、AEM に「always」オプションを指定して常にキャッシュを適用させる方法については、上記の html/text セクションの説明を参照してください。

    src/conf.dispatcher.d/ cache の下のファイルに、次のルール(デフォルト設定)があることを確認する必要があります。

    /0000
    { /glob "*" /type "allow" }
    

    キャッシュせずに非公開にするアセットが、LocationMatch ディレクティブフィルターの一部ではないことを確認します。

    メモ

    dispatcher-ttl AEM ACS Commons プロジェクトを含む他のメソッドでは、値は上書きされません。

ノードストア内の他のコンテンツファイルタイプ

  • デフォルトのキャッシュなし
  • HTML/Text ファイルタイプに使用する EXPIRATION_TIME 変数はデフォルトに設定できません
  • キャッシュの有効期限は、HTML/Text の節で説明したのと同じ LocationMatch 方法で、適切な正規表現を指定することで設定できます

今後の最適化

  • を使用しない User-Agent の一部として Vary ヘッダー。 デフォルトの Dispatcher 設定(アーキタイプバージョン 28 以前)の古いバージョンには、これが含まれていました。次の手順を使用して削除することをお勧めします。

    • で vhost ファイルを見つけます。 <Project Root>/dispatcher/src/conf.d/available_vhosts/*.vhost
    • 次の行を削除またはコメントアウトします。 Header append Vary User-Agent env=!dont-vary すべての vhost ファイルから、default.vhost を除き、読み取り専用です。
  • 以下を使用: Surrogate-Control ブラウザーのキャッシュとは無関係に CDN キャッシュを制御するヘッダー

  • 適用を検討 stale-while-revalidate および stale-if-error ディレクティブを使用して、バックグラウンドでの更新を許可し、キャッシュのミスを回避し、ユーザーのコンテンツを迅速かつ新しく保ちます。

    • これらのディレクティブを適用する方法は多数ありますが、30 分を追加します。 stale-while-revalidate すべてのキャッシュ制御ヘッダーへの接続は、出発点として適切です。
  • 様々なコンテンツタイプの例が次に示されています。独自のキャッシュルールを設定する際に、ガイドとして使用できます。 具体的な設定と要件を慎重に検討し、テストしてください。

    • 12 時間後に可変クライアントライブラリリソースをキャッシュし、12 時間後にバックグラウンド更新をおこないます。

      <LocationMatch "^/etc\.clientlibs/.*\.(?i:json|png|gif|webp|jpe?g|svg)$">
         Header set Cache-Control "max-age=43200,stale-while-revalidate=43200,stale-if-error=43200,public" "expr=%{REQUEST_STATUS} < 400"
         Header set Age 0
      </LocationMatch>
      
    • MISS を避けるために、不変のクライアントライブラリリソースをバックグラウンド更新で長期(30 日)にキャッシュします。

      <LocationMatch "^/etc\.clientlibs/.*\.(?i:js|css|ttf|woff2)$">
         Header set Cache-Control "max-age=2592000,stale-while-revalidate=43200,stale-if-error=43200,public,immutable" "expr=%{REQUEST_STATUS} < 400"
         Header set Age 0
      </LocationMatch>
      
    • HTMLページを 5 分間キャッシュし、バックグラウンド更新をおこなうと、ブラウザーでは 1 時間、CDN では 12 時間をキャッシュします。 Cache-Control ヘッダーは常に追加されるので、/content/*の下の一致する html ページが公開されるようにすることが重要です。 そうでない場合は、より具体的な正規表現を使用することを検討してください。

      <LocationMatch "^/content/.*\.html$">
         Header unset Cache-Control
         Header always set Cache-Control "max-age=300,stale-while-revalidate=3600" "expr=%{REQUEST_STATUS} < 400"
         Header always set Surrogate-Control "stale-while-revalidate=43200,stale-if-error=43200" "expr=%{REQUEST_STATUS} < 400"
         Header set Age 0
      </LocationMatch>
      
    • ブラウザーではバックグラウンド更新 1 時間、CDN では 12 時間で、コンテンツサービス/Sling モデルエクスポーターの json 応答を 5 分間キャッシュします。

      <LocationMatch "^/content/.*\.model\.json$">
         Header set Cache-Control "max-age=300,stale-while-revalidate=3600" "expr=%{REQUEST_STATUS} < 400"
         Header set Surrogate-Control "stale-while-revalidate=43200,stale-if-error=43200" "expr=%{REQUEST_STATUS} < 400"
         Header set Age 0
      </LocationMatch>
      
    • MISS を避けるために、コア画像コンポーネントからの不変 URL をバックグラウンド更新で長期(30 日)にキャッシュします。

      <LocationMatch "^/content/.*\.coreimg.*\.(?i:jpe?g|png|gif|svg)$">
         Header set Cache-Control "max-age=2592000,stale-while-revalidate=43200,stale-if-error=43200,public,immutable" "expr=%{REQUEST_STATUS} < 400"
         Header set Age 0
      </LocationMatch>
      
    • MISS を避けるために、24 時間の画像やビデオなど、DAM の可変リソースをキャッシュし、12 時間後にバックグラウンド更新をおこないます

      <LocationMatch "^/content/dam/.*\.(?i:jpe?g|gif|js|mov|mp4|png|svg|txt|zip|ico|webp|pdf)$">
         Header set Cache-Control "max-age=43200,stale-while-revalidate=43200,stale-if-error=43200" "expr=%{REQUEST_STATUS} < 400"
         Header set Age 0
      </LocationMatch>
      

HEADリクエスト動作

AdobeCDN で、以下のHEADに関するリソースリクエストを受信したとき not キャッシュされた場合、リクエストは、Dispatcher インスタンスやAEMインスタンスによってGETリクエストとして変換され、受け取られます。 応答がキャッシュ可能な場合、以降のHEADリクエストは CDN から提供されます。 応答がキャッシュできない場合、後続のHEAD要求は、 Cache-Control TTL。

Dispatcher キャッシュの無効化

一般に、Dispatcher キャッシュを無効にする必要はありません。代わりに、コンテンツが再公開される際に Dispatcher がキャッシュを更新し、CDN がキャッシュの有効期限のヘッダーを考慮することを信頼できます。

アクティベーション/非アクティベーション中の Dispatcher キャッシュの無効化

以前のバージョンの AEM と同様に、ページの公開または非公開では、Dispatcher のキャッシュからコンテンツがクリアされます。キャッシュの問題の疑いがある場合は、問題のページを再公開し、ServerAlias localhost(Dispatcher キャッシュの無効化に必要)に一致する仮想ホストが使用可能であることを確認する必要があります。

パブリッシュインスタンスは、オーサーから新しいバージョンのページまたはアセットを受け取ると、フラッシュエージェントを使用して Dispatcher 上の適切なパスを無効にします。更新されたパスは、親と共に、Dispatcher キャッシュから削除されます(削除されるレベルは statfilelevel で設定できます)。

明示的な Dispatcher キャッシュの無効化

一般的に、Dispatcher 内のコンテンツを手動で無効にする必要はありませんが、必要に応じて無効にすることができます。

メモ

AEM as a Cloud Service 以前は、Dispatcher キャッシュを無効にする方法が 2 通りありました。

  1. パブリッシュ Dispatcher のフラッシュエージェントを指定して、レプリケーションエージェントを呼び出す
  2. invalidate.cache API を直接呼び出す(例:POST /dispatcher/invalidate.cache

Dispatcher の invalidate.cache API アプローチは、特定の Dispatcher ノードのみを指すので、今後サポートされなくなります。AEM as a Cloud Service は、個々のノードレベルではなくサービスレベルで動作するので、 AEM からのキャッシュページの無効化 ページで説明されている無効化手順は、AEM as a Cloud Service では無効になります。

レプリケーションフラッシュエージェントを使用する必要があります。これは、レプリケーション API を使用して実行できます。フラッシュエージェントエンドポイントは設定できませんが、フラッシュエージェントを実行するパブリッシュサービスと一致する Dispatcher を指すように事前設定されています。フラッシュエージェントは、通常、OSGi のエージェントまたはイベントによってトリガーされます。

次に図で示します。

CDN

Dispatcher キャッシュがクリアされない問題が発生した場合は、カスタマーサポートにお問い合わせください。必要に応じて Dispatcher キャッシュをフラッシュします。

アドビが管理する CDN は TTL に従うので、フラッシュする必要はありません。問題の疑いがある場合は、カスタマーサポートにお問い合わせください。必要に応じてアドビが管理する CDN キャッシュをフラッシュします。

クライアントサイドライブラリとバージョンの整合性

ページは、HTML、JavaScript、CSS、画像で構成されます。JS ライブラリ間の依存関係を考慮して、クライアントサイドライブラリ(clientlibs)フレームワークを活用し、JavaScript および CSS リソースを HTML ページに読み込むことをお勧めします。

clientlibs フレームワークは、自動バージョン管理を提供します。つまり、開発者はソース管理で JS ライブラリに対する変更をチェックインでき、最新バージョンは、顧客がリリースをプッシュしたときに利用可能になります。この機能がないと、開発者は新しいバージョンのライブラリを参照して HTML を手動で変更する必要があります。同じライブラリを共有する HTML テンプレートが多い場合は特に負担がかかります。

新しいバージョンのライブラリが実稼動環境にリリースされると、参照する HTML ページは、更新されたライブラリバージョンへの新しいリンクで更新されます。特定の HTML ページのブラウザーキャッシュの有効期限が切れると、(AEM から)更新されたページが新しいバージョンのライブラリを参照することが保証されるので、古いライブラリがブラウザーキャッシュから読み込まれる心配はありません。更新された HTML ページには、最新のライブラリバージョンがすべて含まれます。

このメカニズムはシリアル化されたハッシュで、クライアントライブラリリンクに追加され、ブラウザーが CSS/JS をキャッシュするための一意のバージョン付き URL を確保します。シリアル化されたハッシュは、クライアントライブラリの内容が変更された場合にのみ更新されます。つまり、新しいデプロイメントでも、関係ない更新(クライアントライブラリの基になる CSS/JS の変更はなし)が発生した場合、参照は同じままになるので、ブラウザーのキャッシュの中断が少なくなります。

クライアントサイドライブラリの Longcache バージョンの有効化 - AEM as a Cloud Service の SDK クイックスタート

HTML ページにインクルードされるデフォルトの clientlib は、次の例のようになります。

<link rel="stylesheet" href="/etc.clientlibs/wkndapp/clientlibs/clientlib-base.css" type="text/css">

厳密な clientlib のバージョン管理が有効な場合、クライアントライブラリに長期ハッシュキーがセレクターとして追加されます。その結果、clientlib の参照は次のようになります。

<link rel="stylesheet" href="/etc.clientlibs/wkndapp/clientlibs/clientlib-base.lc-7c8c5d228445ff48ab49a8e3c865c562-lc.css" type="text/css">

厳密な clientlib のバージョン管理は、すべての AEM as a Cloud Service 環境で、デフォルトで有効になっています。

ローカル SDK クイックスタートで厳密な clientlib のバージョン管理を有効にするには、次の操作を実行します。

  1. OSGi Configuration manager <host>/system/console/configMgr へ移動する。
  2. Adobe Granite HTML Library Manager の OSGi Config を探します。
    • 「厳密なバージョン管理」チェックボックスをオンにして有効にします。
    • 「長期クライアントサイドキャッシュキー」というラベルの付いたフィールドに、値「/.*;hash」を入力します。
  3. 変更内容を保存します。AEM as a Cloud Service は、開発、ステージ、実稼動環境でこの設定を自動的に有効にするので、この設定をソース管理に保存する必要はありません。
  4. クライアントライブラリのコンテンツが変更されるたびに、新しいハッシュキーが生成され、HTML 参照が更新されます。

このページ