Webキャッシングとは

Webキャッシングは、一般的に要求されるコンテンツをアクセスしやすい場所に保存できるようにすることで、サーバーのパフォーマンスを向上させる方法です。 これにより、訪問者は同じデータを複数回フェッチする代わりに、コンテンツにすばやくアクセスできます。

キャッシングルールを効果的に作成することにより、キャッシングに適したコンテンツが保存され、リソースが節約されますが、動的性の高いコンテンツは通常どおり提供されます。 このガイドでは、キャッシングモジュールを使用してApacheを構成する方法について説明します。

:このガイドはApache2.2を念頭に置いて作成されました。 Apache 2.4への変更により、このガイドで説明されているモジュールの一部が置き換えられました。 この考慮事項により、以下で推奨されるすべての手順がApache2.4のインストールで機能するわけではありません。

Apacheでのキャッシングの概要

Apacheには、頻繁にアクセスされるコンテンツをキャッシュするさまざまな方法があります。 この機能を有効にする2つの最も一般的なモジュールは、「mod_cache」と「mod_file_cache」と呼ばれます。

mod_file_cacheモジュール

mod_file_cacheモジュールは、2つのキャッシュメカニズムのうちのより単純なものです。 次のようなコンテンツをキャッシュすることで機能します。

  • 頻繁にリクエストされる
  • 非常にをめったに変更しない

これらの2つの要件が満たされている場合は、mod_file_cacheが役立つ可能性があります。 これは、サーバーの起動時に一般的に使用されるファイルに対していくつかのファイルアクセス操作を実行することによって機能します。

mod_cacheモジュール

mod_cacheモジュールは、HTTP対応のキャッシュスキームを提供します。 これは、ページが「フレッシュ」と見なされる期間を指定する命令に従ってファイルがキャッシュされることを意味します。

これらの操作は、「mod_mem_cache」モジュールまたは「mod_disk_cache」モジュールのいずれかを使用して実行されます。 これらはmod_file_cacheよりも複雑なキャッシュモデルであり、ほとんどの状況でより役立ちます。

Apacheでのmod_file_cacheの使用

mod_file_cacheモジュールは、現在のApacheインスタンスの存続期間中は変更されないファイルをキャッシュするのに役立ちます。 このモジュールで使用される手法により、サーバーが再起動されるまで、後続の変更は適用されません。

これらのキャッシュメカニズムは通常のファイルでのみ使用できるため、動的に生成されたコンテンツや特別なコンテンツハンドラーによって生成されたファイルはここでは機能しません。

このモジュールは、さまざまな方法でキャッシュを実行するために使用される2つのディレクティブを提供します。

MMapFile

MMapFileは、ファイルのリストを作成し、それらのファイルをメモリにマップするために使用されるディレクティブです。 これはサーバーの起動時にのみ行われるため、このタイプのキャッシュを使用するように設定されたファイルは変更されないことが重要です。

このタイプのキャッシュは、サーバー構成ファイルで設定できます。 これは、スペースで区切られたリストのメモリにキャッシュされるファイルを指定することによって行われます。

MMapFile /var/www/index.html /var/www/otherfile.html var/www/static-image.jpg

これらのファイルはメモリに保持され、リソースが要求されたときにそこから提供されます。 いずれかのファイルが変更された場合は、サーバーを再起動する必要があります。

CacheFile

このディレクティブは、リストされたファイルへのハンドルを開くことによって機能します。 これらの開いているファイル記述子のテーブルを維持し、それを使用してこれらのファイルを開くのにかかる時間を短縮します。

この場合も、サーバーの操作中のファイルへの変更はキャッシュによって認識されません。 サーバーが再起動されるまで、元のコンテンツは引き続き提供されます。

このディレクティブは、次のメソッドでキャッシュする必要があるファイルのスペースで区切られたリストを指定することによって使用されます。

CacheFile /this/file.html that/file.html another/file/to/server.html

これにより、これらのファイルはサーバーの起動時にキャッシュされます。

Apacheでのmod_cacheの使用

mod_cacheモジュールは、より柔軟で強力なキャッシングモジュールです。 これは、一般的にアクセスされるファイルのHTTP対応キャッシングを実装することによって機能します。

すべてのキャッシュメカニズムは永続的な状態でファイルを提供することに依存していますが、mod_cacheは、ファイルがキャッシュに有効である期間を構成することにより、コンテンツの変更を処理できます。

このモジュールは、他の2つのモジュールに依存して、キャッシュの実装の大部分を実行します。 これらは「mod_disk_cache」と「mod_mem_cache」です。

これら2つの違いは、キャッシュがそれぞれディスクまたはメモリに保持される場所です。 これらは、URIベースのキーを使用して保存および取得されます。 正規の名前付けをオンにすることでサイトのキャッシュを改善できるため、これは注意することが重要です。

これは、このディレクティブをサーバー構成または仮想ホスト定義に配置することで実現できます。

UseCanonicalName On

キャッシングを構成する方法

いくつかの一般的な構成ディレクティブと、それらがキャッシングメカニズムの機能にどのように影響するかを調べます。

「/etc/ apache2 / mods-available」ディレクトリを見ると、これらのモジュールのデフォルトの設定ファイルのいくつかを見ることができます。

mod_mem_cacheの構成

mod_mem_cacheの構成を見てみましょう。

sudo nano /etc/apache2/mods-available/mem_cache.conf
<IfModule mod_mem_cache.c>
	CacheEnable mem /
	MCacheSize 4096
	MCacheMaxObjectCount 100
	MCacheMinObjectSize 1
	MCacheMaxObjectSize 2048
</IfModule>
These directives are only read if the mod_mem_cache module is loaded.  This can be done by typing the following:
sudo a2enmod mem_cache
sudo service apache2 restart
This will enable mod_mem_cache and also mod_cache.
CacheEnable mem /

「CacheEnablemem/」行は、「/」(すべて)の下に格納されているコンテンツのメモリキャッシュを作成するようにapacheに指示します。

MCacheSize 4096
MCacheMaxObjectCount 100

次の数行は、キャッシュの合計サイズと保存されるオブジェクトの種類を示しています。 「MCacheSize」ディレクティブと「MCacheMaxOjectCount」ディレクティブはどちらも、最初にメモリ使用量の観点から、次にオブジェクトの最大量の観点から、キャッシュの最大サイズを記述します。

MCacheMinObjectSize 1
MCacheMaxObjectSize 2048

次の2行は、メモリ使用量の観点から、キャッシュされるデータの種類を示しています。 デフォルト値は、1バイトから2キロバイトの間のファイルがキャッシュの対象となることを指定します。

mod_disk_cacheの構成

mod_disk_cache構成ファイルを調べることで、さまざまなディレクティブのセットについて知ることができます。

sudo nano /etc/apache2/mods-available/disk_cache.conf
<IfModule mod_disk_cache.c>
	CacheRoot /var/cache/apache2/mod_disk_cache
	#CacheEnable disk /
	CacheDirLevels 5
	CacheDirLength 3
</IfModule>

この構成は、mod_disk_cacheモジュールを有効にするとロードされます。これは、次のように入力することで実行できます。

sudo a2enmod disk_cache
sudo service apache2 restart

このコマンドは、正しく機能するためにmod_cacheも有効にします。

CacheRoot /var/cache/apache2/mod_disk_cache
#CacheEnable disk /

「CacheRoot」ディレクティブは、キャッシュされたコンテンツが保持される場所を指定します。 「CacheEnabledisk/」ディレクティブはデフォルトで無効になっています。 何がキャッシュされるかをよりよく理解するために、仮想ホストベースでこれを有効にすることをお勧めします。

CacheDirLevels 5
CacheDirLength 3

他の2つのディレクティブは、キャッシュルート内のキャッシュ構造を決定します。 キャッシュされた各要素はそのURLによってハッシュされ、ハッシュはファイル名とディレクトリパスとして使用されます。

CacheDirLevelは、ハッシュ文字列から作成するディレクトリの数を決定し、CacheDirLengthは、各ディレクトリ名に含まれる文字数を決定します。

たとえば、「abcdefghijklmnopqrstuvwxyz」にハッシュされるファイルがある場合、CacheDirLevelが2でCacheDirLengthが4の場合、このファイルは次の場所に保存されます。

[path_of_cache_root]/abcd/efgh/ijklmnopqrstuv

コンテンツの有効期限によっては、ディスクに保存されるキャッシュが大きくなる場合があります。 Apacheには、キャッシュを構成されたサイズに縮小するための「htcacheclean」と呼ばれるツールが含まれています。 これは、このガイドの範囲外です。

CacheLockを使用してバックエンドを圧倒しないようにする

キャッシュされたリソースの有効期限が切れると、ビジー状態のサーバーで問題が発生する可能性があります。

更新する必要のあるキャッシュは、通常のファイルリソースからファイルを再フェッチする必要があります。 この間に、ファイルに対するリクエストがさらにある場合。 これにより、キャッシュされたバージョンが更新されるときに、バックエンドサーバーへのリクエストが急増する可能性があります。

この状況を回避するために、リソースが再キャッシュされていること、および問題が解決されているため、後続の要求がバックエンドに送信されないことを示すロックファイルを有効にすることができます。

このロックにより、apacheが最初のキャッシュ時に同じリソースを複数回キャッシュしようとするのを防ぐことができます。 また、更新されたキャッシュが完了するまで、古いリソースを提供します。

CacheLockを制御するために、次の3つのディレクティブが使用されます。

CacheLock [ On | Off ]
CacheLockMaxAge [time_in_seconds]
CacheLockPath [/path/to/lock/directory]

最初のディレクティブは機能をオンにし、3番目のディレクティブはリソースロックが作成されるディレクトリを確立します。

2番目のディレクティブCacheLockMaxAgeは、ロックファイルが有効であると見なされる最長時間を秒単位で確立するために使用されます。 これは、リソースの更新に障害や異常な遅延が発生した場合に重要です。

結論

Apacheでのキャッシュは、必要に応じて簡単な場合と複雑な場合があります。 どのような種類のキャッシュでもサイトのパフォーマンスを向上させることができますが、構成をテストして、正しく動作していることを確認することが重要です。

また、不適切に構成されたキャッシングの影響に精通していることも重要です。 プライベートリソースが誤ってパブリック消費のためにキャッシュされていないことを確認するために、キャッシュを実装した後にセキュリティ慣行を再評価する必要がある場合があります。

apacheのユーザードキュメントには、キャッシュの構成方法に関する情報がたくさんあります。 構成を理解している場合でも、役立つリファレンスであり、優れたリソースです。

ジャスティン・エリングウッド