Apache2.4のキャッシュ機能を使いたいと長年願い続けていました。少し前のOSのアップグレードの時だったか、mod_eventとphp-fpmを導入した時だったか、何かのきっかけでmod_cache_diskを設定しました。
それが約半年前。
そして昨日、当ウェブサイトに問題が起きました。
・・・というのはわたしの誤解で、実は使い始めたAndroid版Firefoxのキャッシュの問題だったようですが、瓢箪から駒が出る如く設定の誤りの修正に至りました。
あるべき設定に直す
わたしは混乱した頭でログを漁りました。
あれこれ見た結果、ウェブサーバーのエラーログに以下の警告が出ていたことから、Apacheのキャッシュに何かが起きていることを察知しました。
Premature end of cache headers.
httpd.confの該当箇所を見てみると、なぜかCacheSocacheMaxSizeというmod_cache_socacheの設定が混ざっていました。使っているのはmod_cache_diskなのに!
それをまず書き直しました。
#LoadModule cache_socache_module libexec/apache24/mod_cache_socache.so
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CacheEnable disk /
CacheRoot /var/cache/www
CacheMaxFileSize 20971520
CacheDirLevels 4
CacheDirLength 5
キャッシュにはクリアが必要だ
mod_cache_diskのドキュメントを見てみるとhtcachecleanというツールがあることを初めて知りました。
コマンドで打ってもうまく動かないので、デーモンの起動を試すことにしました。しかし以下のエラーが出て動きません。/etc/rc.conf の htcacheclean_flags に記述した -p オプションが効きません。
/usr/local/etc/rc.d/htcacheclean: WARNING: /usr/local/www/proxy is not a directory.
起動スクリプト /usr/local/etc/rc.d/htcacheclean を開いてみたところ、オプションの書き方が誤っていました。以下に抜粋します。
# less /usr/local/etc/rc.d/htcacheclean
htcacheclean_enable="${htcacheclean_enable:-"NO"}"
htcacheclean_cache="${htcacheclean_cache:-"/usr/local/www/proxy"}"
htcacheclean_cachelimit="${htcacheclean_cachelimit:-"512M"}"
htcacheclean_interval="${htcacheclean_interval:-"60"}"
htcacheclean_args="${htcacheclean_args:-"-t -n -i"}"
これに倣って、以下のようにしました。
# vi /etc/rc.conf
htcacheclean_enable="YES"
htcacheclean_cache="/var/cache/www"
htcacheclean_cachelimit="256M"
htcacheclean_interval="60"
起動はいつもの通りです。
# service htcacheclean start
教師のいない学習の道は長いですね。