キャッシング · 2 min read · Dec 28, 2025

Debian Lenny における Apache の mod_cache を使用したキャッシング

Debian Lenny における Apache の mod_cache を使用したキャッシング

Version 1.0
Author: Falko Timme
Follow me on Twitter

この文書では、Debian Lenny 上で Apache の mod_cache を使用してウェブサイトのコンテンツをキャッシュする方法を説明します。各リクエストで多くのデータベースクエリを生成する高トラフィックの動的ウェブサイトがある場合、コンテンツを数分以上キャッシュすることでサーバーの負荷を劇的に減少させることができます(これはコンテンツの更新頻度によります)。

これがあなたにとって機能することを保証するものではありません!

1 前提条件

Debian リポジトリからの作動する Apache2 セットアップ (Apache 2.2.x - それ以前のバージョンでは mod_cache は実験的と見なされます) があると仮定しています - Debian Lenny リポジトリの Apache バージョンは 2.2.9 なので、問題なく進めることができます。

ここではテスト用の vhost に対して /var/www をドキュメントルートとして使用しています - ドキュメントルートが異なる場合は調整する必要があります。

2 mod_cache の有効化

mod_cache にはキャッシュストレージを管理する 2 つのサブモジュールがあり、mod_disk_cache (ハードドライブにコンテンツを保存するため) と mod_mem_cache (メモリにコンテンツを保存するため、ディスクキャッシングよりも高速) です。どちらを使用するか決定し、2.1 節 (mod_disk_cache) または 2.2 節 (mod_mem_cache) のいずれかを続けてください。

2.1 mod_disk_cache

mod_disk_cache の設定は /etc/apache2/mods-available/disk_cache.conf に保存されているので、それを編集しましょう:

vi /etc/apache2/mods-available/disk_cache.conf

CacheEnable disk / 行のコメントを解除して、最小限の設定が以下のようになることを確認してください:

| # キャッシュのクリーニングは htcacheclean によって行われ、 # /etc/default/apache2 で設定できます。 # # 詳細については、そのファイルのコメント、 # /usr/share/doc/apache2.2-common/README.Debian、および htcacheclean(8) # マンページを参照してください。 # このパスは /etc/default/apache2 のものと同じでなければなりません CacheRoot /var/cache/apache2/mod_disk_cache # これによりローカルドキュメントもキャッシュされます。通常、 # これは単一の仮想ホストの設定に入れる方が理にかなっています。 CacheEnable disk / CacheDirLevels 5 CacheDirLength 3 |

これらの設定オプションの説明とさらなる設定オプションについては http://httpd.apache.org/docs/2.2/mod/mod_disk_cache.html を参照してください。

これで mod_cache と mod_disk_cache を有効にできます:

a2enmod cache
a2enmod disk_cache

/etc/init.d/apache2 restart 

キャッシュディレクトリ /var/cache/apache2/mod_disk_cache が時間の経過とともにいっぱいにならないように、htcacheclean コマンドでクリーニングする必要があります。このコマンドは apache2-utils パッケージの一部で、以下のようにインストールします:

aptitude install apache2-utils 

その後、次のように htcacheclean をデーモンとして起動できます:

htcacheclean -d30 -n -t -p /var/cache/apache2/mod_disk_cache -l 100M -i

これにより、30 分ごとにキャッシュディレクトリがクリーニングされ、100MB を超えないようにします。htcacheclean について詳しく知りたい場合は、

man htcacheclean

もちろん、サーバーを再起動するたびに htcacheclean を手動で起動したくはないでしょう - そのため、/etc/rc.local を編集します…

vi /etc/rc.local

… そして exit 0 行の直前に次の行を追加します:

| [...] /usr/sbin/htcacheclean -d30 -n -t -p /var/cache/apache2/mod_disk_cache -l 100M -i [...] |

これにより、サーバーを起動するたびに htcacheclean が自動的に起動します。

2.2 mod_mem_cache

mod_mem_cache の設定は /etc/apache2/mods-available/mem_cache.conf にあります:

vi /etc/apache2/mods-available/mem_cache.conf   

| CacheEnable mem / MCacheSize 4096 MCacheMaxObjectCount 100 MCacheMinObjectSize 1 MCacheMaxObjectSize 2048 |

これはデフォルトの設定です - 必要に応じて変更できます。mod_mem_cache の設定ディレクティブのリストはここにあります: http://httpd.apache.org/docs/2.2/mod/mod_mem_cache.html

これで mod_cache と mod_mem_cache を次のように有効にします:

a2enmod cache
a2enmod mem_cache

/etc/init.d/apache2 restart

これで完了です! mod_mem_cache を使用すると、キャッシュディレクトリをクリーンアップする必要はありません。

3 テスト

残念ながら mod_cache はログ機能を提供していないため、ログが機能しているかどうかを知るのが難しいです。そのため、HTTP ヘッダーを送信して mod_cache にファイルを 300 秒間キャッシュするように指示し、単にタイムスタンプを表示する小さな PHP テストファイル /var/www/cachetest.php を作成します:

vi /var/www/cachetest.php

| "; ?> |

ブラウザでそのファイルを呼び出してください - 現在のタイムスタンプが表示されるはずです。次に、ブラウザのアドレスバーをクリックして ENTER を押し、ページが再度読み込まれるようにします(F5 やリロードボタンを押さないでください - これにより、キャッシュではなくサーバーから常に新しいコピーが取得されます!) - すべてがうまくいけば、古いキャッシュされたタイムスタンプがまだ表示されるはずです。300 秒待つと、キャッシュではなくサーバーから新しいコピーが取得されるはずです。

4 HTTP ヘッダー

キャッシングはデフォルトでは機能しません - キャッシングが機能するようにウェブアプリケーションを変更する必要があります(ウェブアプリケーションがすでにキャッシングをサポートしている可能性があります - それについてはアプリケーションのドキュメントを参照してください)。mod_cache は、ウェブアプリケーションが送信する HTTP ヘッダーがキャッシュするように指示しない限り、ウェブページをキャッシュしません。

以下は、mod_cache に キャッシュしない ように指示するヘッダーのいくつかの例です:

  • 過去の日付の Expires ヘッダー: “Expires: Sun, 19 Nov 1978 05:00:00 GMT”
  • 特定の Cache-Control ヘッダー: “Cache-Control: no-store, no-cache, must-revalidate” または “Cache-Control: must-revalidate, max-age=0”
  • Set-Cookie ヘッダー: クッキーが設定されている場合、ページはキャッシュされません。

したがって、mod_cache にページをキャッシュさせたい場合は、そのようなヘッダーを送信しないようにアプリケーションを変更してください。

mod_cache にページをキャッシュさせたい場合は、将来の日付の Expires ヘッダーを設定できますが、推奨される方法は max-age を使用することです:

"Cache-Control: must-revalidate, max-age=300"

これにより、mod_cache にページを 300 秒間キャッシュするように指示します (max-age) - 残念ながら mod_cache は s-maxage オプションを認識しないため (http://www.mnot.net/cache_docs/#CACHE-CONTROL を参照)、max-age オプションを使用する必要があります(これにより、ブラウザにもキャッシュするように指示します - 予期しない結果が出た場合はこれを念頭に置いてください!)。mod_cache が s-maxage オプションを認識していれば、”Cache-Control: must-revalidate, max-age=0, s-maxage=300” を使用でき、これは mod_cache にキャッシュするように指示しますが、ブラウザには指示しません。

もちろん、このヘッダーは、同時に上記の非キャッシュヘッダー(過去の日付の Expires、Set-Cookie など)を送信する場合は無意味です!

キャッシングにとって非常に重要なヘッダーは次のものです:

"Vary: Accept-Encoding"

これにより、mod_cache は各キャッシュページの 2 つのコピーを保持します。1 つは圧縮された (gzip) もので、もう 1 つは非圧縮のもので、ユーザーエージェント/ブラウザの機能に応じて適切なバージョンを配信できます。一部のユーザーエージェントは gzip 圧縮を理解しないため、非圧縮バージョンを取得する必要があります。

要約すると、mod_cache にキャッシュさせたい場合は、次の 2 つのヘッダーを使用してください:

“Cache-Control: must-revalidate, max-age=300”
“Vary: Accept-Encoding”

そして、過去の日付の Expires、クッキーなどが送信されないことを確認してください。

アプリケーションが PHP で書かれている場合、PHP の header() 関数を使用して HTTP ヘッダーを送信できます。例えば、次のように:

header(“Cache-Control: must-revalidate, max-age=300”);
header(“Vary: Accept-Encoding”);

このページは、HTTP ヘッダーとキャッシングについてもっと学びたい場合は必見です: http://www.mnot.net/cache_docs/

5 リンク

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。