Apache でキャッシュを削除する方法は、一応、公式なものは、htcachecleanを使っての削除のみです。
ただ、nginxと異なり、有効期限を過ぎてもキャッシュファイルは削除されません。
これについては、上記の記事の中でも書きました。
また、上記の方法以外にも、シェルからrm コマンドで キャッシュファイル、あるいはキャッシュディレクトリを直接削除することはできます。
そこで、今回は、Apacheのmod_disk_cacheで作成されたキャッシュファイルの削除方法にについてまとめてみます。
- 目次
- 履歴
2013年4月16日 初版
Apache でキャッシュを削除する方法(まとめ)
先のとおりキャッシュを削除する方法は、いろいろあります。それぞれについて簡単に解説してみます。
時間経過による無効を待つ
これは、削除ではなく、時間の経過によってキャッシュが無効になるだけで、使われないだけです。例えば、Apacheのキャッシュ設定(httpd.conf)が以下のような設定となっていた場合、
|
上記のCacheMaxExpireディレクティブに キャッシュの最大有効時間(秒)を設定することで、そのキャッシュの有効期限が設定されます。
ただ、有効期限が設定されるだけで、実際にキャッシュが削除されるわけではありません。
次に有効期限が切れたURLへアクセスした際にキャッシュが更新されるだけです。
上記の設定では、早くて1時間、長くて2時間後には、キャッシュが無効、あるいは更新されます。
キャッシュディレクトリの配下の全ファイルを丸ごと削除する
これは、非常に簡単なやり方で、例えば、Apacheのキャッシュ設定(httpd.conf)が以下のような設定となっていた場合、
|
キャッシュディレクトリとして、/tmp/cache を使用します。
このディレクトリを削除してしまえばよいわけです。
|
これで一発で削除できるというわけです。
ただ、これは、サイト全体のキャッシュを削除してしまうのには、非常に便利ですが、例えば、1つのページのみが更新された場合などは、
サイト全体のキャッシュを削除する必要はないわけで、毎回、1つ、2つのページの更新のためにサイト全体のキャッシュを削除していては
無駄も多いですし、負荷もかかりやすくなってしまうというデメリットもあります。
htcacheclean で削除する
→ Apacheのキャッシュを削除するhtcachecleanを使ってみる にて詳しく解説していますので、そちらを参照してください。
htcacheclean は、Apacheで公式に提供している mod_disk_cache でキャッシュされたファイルを削除するためのツールです。
ただ、これでも、URL指定で個別のキャッシュファイルを削除することはできません。
このツールは、あくまでキャッシュの総量をキープするために古いキャッシュから削除していくようになっているだけで、
無効(有効期限を過ぎた)となったキャッシュをリアルタイムで削除してくれません。先にも書いたように、あくまで、キャッシュの総量をトリガーに古いものから削除するだけです。
キャッシュファイルを検索して、該当するキャッシュファイルを削除する
これは、Unix系(Linuxも含む)OSでは、非常に便利、簡単なやり方です。
先のキャッシュディレクトリの一括削除と同じ以下の例で解説しています。
例えば、Apacheのキャッシュ設定(httpd.conf)が以下のような設定となっていた場合、
|
上記では、キャッシュディレクトリとして、/tmp/cache を使用しています。
このディレクトリからキャッシュを削除したいURL情報をもとにキャッシュファイルを検索し、削除してしまいます。
|
これは、キャッシュファイルの中に、以下の形式で有効期限情報が埋め込まれていることを利用して該当するキャッシュファイルをディレクトリから検索をかけています。
$scheme://$host:$port$request_uri[?]Expires:
キャッシュファイルが存在すれば まとめて削除する(キャッシュファイルは、.header ファイルと .data ファイルの2つが存在します) ということを1行で行っています。
- $scheme :
http
orhttps
などのスキーマ定義になります。 - $host : ホスト名になります。
- $port : ポート番号になります。デフォルトのHTTPであれば、80のはずです。
- $request_uri : 要求URLになります。ここで
?
が使用されない場合は、最後に?
を付けるようです。
例えば、
htp://www.exmaple.com/redme.html の場合、htp://www.exmaple.com:80/redme.html? となります。
また、
htp://www.exmaple.com/index.php?p=10 の場合、htp://www.exmaple.com:80/index.php?p=10 となります。
キャッシュファイル名を求めて、該当するキャッシュファイルを削除する(おまけ)
キャッシュファイルを検索せずにキャッシュファイル名をURLから変換して求めることもできます。
URLからキャッシュファイル名の変換方法は、nginxのやり方 に近いですが、URLの文字列 から md5sumへ変換した後、20文字列へ変換するところがひと手間あります。
このやり方は、シェル1行で変換できそうもないので、phpで記述したスクリプトを以下に載せておきます。参考までに。
|
|
ちょっと長くなりましたが、これは、nginxのやり方 とほぼ同じです。
ただ、34行目あたりから、58行目あたりまでが、Apache独自の処理で、32文字を20文字へ変換をかけています。
さらにディレクトリの文字列は、変換した20文字の先頭から取り出します。(nginxは後方から取り出します)残った文字列がファイル名になります。
ファイル名は、
・残った文字.header
・残った文字.data
の2つが存在し、.header
ファイルにキャッシュキーや有効期限などの情報が出力されています。
一応、念のためにキャッシュファイルの中の指定されたURLキー情報が存在するかを確認してから削除しています。
上記の exmaple.com の例をこのphpスクリプトで実行すると以下のようになります。
ここでは、このphpスクリプトのファイル名を rm_cache.php としています。
|
|
CacheDirLength : ディレクトリ名の文字列の長さなので、ディレクトリ名は1文字という意味になります。
つまり、1文字のディレクトリが2階層ということで、
-l=1:1
となり、それぞれの数値は、
1階層目ディレクトリの文字数:2階層目ディレクトリの文字数
ですから、それぞれ1文字という意味になります。
正直、Apacheのキャッシュは面倒です。
最近では、キャッシュを使う場合は、ほとんどがNginxを利用することが多いです。このキャッシュの取り扱いと不具合の多さから、Apacheを敬遠する方も多いのではないかと思います。
また、単純にキャッシュを使いたいなら、Squidなどのメジャーなサーバーもありますから、あえてApacheを使うという選択は、少ないのかもしれませんね。そのためのあってか、Apacheのキャッシュ系の記事は少ないです。
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない、検索ができないことがあります。
コメントを投稿 :