キャッシュについて

このドキュメントでは、ディスパッチャーのキャッシュがどのようにおこなわれるか、およびキャッシュの設定方法について説明します。

キャッシュディレクトリ

ベースラインインストールでは、次のデフォルトキャッシュディレクトリを使用します

  • オーサー
    • /mnt/var/www/author
  • パブリッシャー
    • /mnt/var/www/html

各リクエストがディスパッチャーを走査する際、リクエストは設定されたルールに従い、適格なアイテムの応答に対して、ローカルにキャッシュされているバージョンを保持します。

注意:

Apache が DocumentRoot でファイルを探す際、どの AEM インスタンスのものかわからなくなるので、オーサーワークロードと公開済みワークロードを意図的に分離しています。  つまり、オーサーファームでキャッシュが無効になっていても、オーサーの DocumentRoot がパブリッシャーと同じ場合、キャッシュがあればそこからファイルを提供します。  つまり、公開されたキャッシュからオーサーファイルを提供することになり、訪問者にとっては本当にひどい経験となります。

 

異なる公開済みコンテンツ用に別々の DocumentRoot ディレクトリを保持するのもよい考えではありません。  clientlibs のように、別のサイトでも違いがない、再キャッシュされた複数のアイテムを作成する必要があります。また、セットアップする DocumentRoot ごとにレプリケーションフラッシュエージェントをセットアップする必要があります。  ページをアクティブ化するたびに、フラッシュのオーバーヘッドの量が増加します。  ファイルの名前空間と完全にキャッシュされたパスに依存し、公開済みサイトに対する複数の DocumentRoot の使用を避けます。

構成ファイル

Dispatcher は、任意のファームファイルの /cache { セクションで、何をキャッシュできるかを制御します。  AMS ベースライン構成ファームには、次のようなインクルードがあります。

/cache { 
    /rules { 
        $include "/etc/httpd/conf.dispatcher.d/cache/ams_author_cache.any" 
    }

キャッシュするものとしないものに関するルールを作成する際には、こちらのドキュメントを参照してください。

オーサーのキャッシュ

ユーザーがオーサーコンテンツをキャッシュしない実装は多数あります。  このようなユーザーは、パフォーマンスとオーサーへの応答性を大幅にアップグレードする機会を見逃しています。

オーサーファームが適切にキャッシュされるように設定する際の戦略について説明します。

オーサーファームファイルのベースオーサー /cache { セクションは次のようになります。

/cache { 
    /docroot "/mnt/var/www/author" 
    /statfileslevel "2" 
    /allowAuthorized "1" 
    /rules { 
        $include "/etc/httpd/conf.dispatcher.d/cache/ams_author_cache.any" 
    } 
    /invalidate { 
        /0000 { 
            /glob "*" 
            /type "allow" 
        } 
    } 
    /allowedClients { 
        /0000 { 
            /glob "*.*.*.*" 
            /type "deny" 
        } 
        $include "/etc/httpd/conf.dispatcher.d/cache/ams_author_invalidate_allowed.any" 
    } 
}

ここで注意すべき重要なことは、/docroot がオーサーのキャッシュディレクトリに設定されているという点です。

注意:

オーサーの .vhost ファイルで DocumentRoot が、ファームの /docroot パラメーターと一致していることを確認します。

キャッシュルールインクルードステートメントには、次のルールを含むファイル /etc/httpd/conf.dispatcher.d/cache/ams_author_cache.any が含まれます。

/0000 { 
 /glob "*" 
 /type "deny" 
} 
/0001 { 
 /glob "/libs/*" 
 /type "allow" 
} 
/0002 { 
 /glob "/libs/*.html" 
 /type "deny" 
} 
/0003 { 
 /glob "/libs/granite/csrf/token.json" 
 /type "deny" 
} 
/0004 { 
 /glob "/apps/*" 
 /type "allow" 
} 
/0005 { 
 /glob "/apps/*.html" 
 /type "deny" 
} 
/0006 { 
 /glob "/libs/cq/core/content/welcome.*" 
 /type "deny" 
}

オーサーシナリオでは、コンテンツは常時意図的に変化しています。  頻繁に変更されないアイテムのみをキャッシュしたい場合。  /libs はベースライン AEM インストールの一部であり、サービスパック、累積修正パック、アップグレード、またはホットフィックスファイルをインストールするまで変更されないので、/libs をキャッシュするルールがあります。  したがって、これらの要素をキャッシュすることは非常に理にかなっており、サイトを使用するエンドユーザーのオーサーエクスペリエンスという点でも大きなメリットがあります。

注意:

これらのルールでは、/apps カスタムアプリケーションコードが格納されている場所)もキャッシュすることに注意してください。  このインスタンスでコードを開発している場合、ファイルを保存する際には非常にわかりにくく、キャッシュされたコピーを提供しているので、UI に反映されているかどうかがわかりません。  AEM にコードをデプロイするという処理も頻度が低いので、デプロイメント手順の一部としてオーサーキャッシュをクリアする必要があります。  繰り返しになりますが、メリットは、エンドユーザーがキャッシュ可能なコードを迅速に実行できるという点です。

ServeOnStale(Serve on Stale/SOS)

ディスパッチャーの重要な機能の 1 つです。  パブリッシャーに負荷がかかっている場合や応答しない場合、通常は 502 または503 http 応答コードが返されます。  これらのエラーが返され、この機能が有効になっている場合、ディスパッチャーは、キャッシュ内に残っているコンテンツが最新のコピーでなくてもベストエフォートとして引き続き提供するように指示します。  何の機能も提供しないエラーメッセージを表示するだけであれば、何かを提供する方がよいでしょう。

注意:

パブリッシャーレンダラーでソケットタイムアウトまたは 500 エラーメッセージが表示される場合、この機能はトリガーされないことに注意してください。  AEM に到達できない場合、この機能は何も実行しません。

この設定はどのファームでも設定できますが、publish ファームファイルにのみ適用する意味があります。  ファームファイルで有効になっている機能の構文例を次に示します。

/cache { 
    /serveStaleOnError "1"

クエリパラメーター/引数を使用したページのキャッシュ

注意:

Dispatcher モジュールの通常の動作の 1 つとして、リクエストの URI にクエリパラメーターがある場合(通常は /content/page.html?myquery=value のように表示される)ファイルのキャッシュをスキップして、AEM インスタンスに直接移動します。  このリクエストは動的なページなので、キャッシュしないでください。  これにより、キャッシュの効率に影響を与える可能性があります。

AEM のページで、アドレス行に GET 引数/クエリパラメーターを使用しており、ページの操作には役立つけれど、別の html をレンダリングしない場合は、この構成要素を使用するとよいでしょう。

どの引数を無視してページのキャッシュをおこなうかをディスパッチャーに伝えることができます。

たとえば、誰かが URI で引数参照を使用してその人物がどこから来たかを把握する、ソーシャルメディアのディープリンク参照メカニズムを構築したとします。

使用例:

https://www.weretail.com/home.html?reference=android

https://www.weretail.com/home.html?reference=facebook

ページは 100%キャッシュ可能ですが、引数があるのでキャッシュされません。  これを回避するには、ファーム構成ファイルに次のセクションを追加します。

/cache { 
    /ignoreUrlParams { 
        /0001 { /glob "*" /type "deny" } 
        /0002 { /glob "reference" /type "allow" } 
    }

これで、ディスパッチャーがリクエストを確認すると、リクエストに ?reference クエリパラメーターが含まれるという事実を無視して、ページをキャッシュするようになりました。

応答ヘッダーのキャッシュ

ディスパッチャーが .html ページと clientlib をキャッシュすることは明白ですが、特定の応答ヘッダーとともに、名前が同じで .h ファイル拡張子が付いたファイルのコンテンツもキャッシュできることをご存知でしょうか。  これにより、コンテンツだけでなく、キャッシュから送信される応答ヘッダーに対する次回の応答が可能になります。 

AEM で処理できるのは UTF-8 エンコーディングだけではありません

アイテムには、キャッシュ TTL のエンコードの詳細と最終変更日のタイムスタンプの制御に役立つ特別なヘッダーが含まれている場合があります。

これらの値は、キャッシュ時にはデフォルトで取り除かれ、Apache httpd Web サーバーは、通常のファイル処理方法でアセットを処理する独自のジョブを実行します。通常、ファイル拡張子に基づいて推測される MIME タイプに制限されます。

ディスパッチャーでアセットと目的のヘッダーをキャッシュする場合、適切なエクスペリエンスを公開し、すべての詳細がクライアントブラウザーに表示されるようにします。

キャッシュ対象ヘッダーを指定したファームの例を次に示します。

/cache { 
 /headers { 
  "Cache-Control" 
  "Content-Disposition" 
  "Content-Type" 
  "Expires" 
  "Last-Modified" 
  "X-Content-Type-Options" 
 } 
}

この例では、AEM がヘッダーを提供するように設定し、CDN がこのヘッダーを検索してキャッシュを無効にするタイミングを確認するようにしました。  つまり、AEM はヘッダーに基づいてどのファイルを無効にするかを適切に指示できるようになりました。

注意:

正規表現またはグロブマッチングを使用することはできません。  これは、キャッシュ対象ヘッダーのリテラルリストです。  キャッシュするリテラルヘッダーのリストのみを配置してください。

猶予期間の自動無効化

AEM システムでオーサーのアクティビティが多数あり、多くのページのアクティベーションがおこなわれる場合、競合状態となって無効化が繰り返し発生する可能性があります。  フラッシュを頻繁に繰り返す必要はないので、猶予期間が終了するまでフラッシュを繰り返さないよう、ある程度の許容範囲を設けることができます。

この仕組みの例:

/content/exampleco/en/ を無効にするリクエストが 5 つある場合は、すべてが 3 秒以内に発生します。

この機能をオフにすると、キャッシュディレクトリ /content/exampleco/en/ が 5 回無効にされます。

この機能をオンにして 5 秒に設定すると、キャッシュディレクトリ /content/exampleco/en/ が 1 回無効になります。

猶予期間が 5 秒に設定されているこの機能の構文の例を次に示します。

/cache { 
    /gracePeriod "5"

TTL ベースの無効化

ディスパッチャモジュールの新しい機能は、キャッシュされたアイテムを、有効期間(TTL)に基づいて無効化するオプションでした。  アイテムがキャッシュされると、キャッシュ制御ヘッダーの存在を検索し、同じ名前と.ttl 拡張子を使用して、キャッシュ ディレクトリ内にファイルを生成します。

ファーム構成ファイルで構成されている機能の例を次に示します。

/cache { 
    /enableTTL "1"
注意:

AEM を設定し、ディスパッチャーがそれに従って TTL ヘッダーを送信するようにする必要があります。  この機能を切り替えても、ディスパッチャーは、AEM がキャッシュ制御ヘッダーを送信したファイルを削除するタイミングを把握できるようになるだけです。  AEM が TTL ヘッダーの送信を開始しない場合、ディスパッチャーはここでは特別な処理をおこないません。

キャッシュフィルタールール

パブリッシャーでキャッシュする要素のベースライン構成の例を次に示します。

/cache{ 
    /0000 { 
        /glob "*" 
        /type "allow" 
    } 
    /0001 { 
        /glob "/libs/granite/csrf/token.json" 
        /type "deny" 
    }

公開されたサイトのマッチ率をできるだけ増やし、すべてをキャッシュしたい場合。

キャッシュ時にエクスペリエンスを中断する要素がある場合は、ルールを追加して、そのアイテムをキャッシュするオプションを削除できます。  上記の例でわかるように、csrf トークンがキャッシュされることはなく、除外されています。  これらのルールの記述に関する詳細については、こちらを参照してください。

アドビのロゴ

アカウントにログイン