先日、いつものようにサーバから送られてきたlogwatchを眺めていたら、いつの間にかファイルの使用量が全体の60%以上になっていることに気が付きました。
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 97G 57G 36G 62% /
そうなる前に気が付きそうなものですが、基本、このサーバではブログしか動かしてない上に画像はほとんどFlickrにアップしているため、ディスクの使用量については完全に油断してました。そんなわけで、先日、まじまじとログを見て「これ、なんかおかしくないか?」と気付いた次第です。
Head Cleanerのキャッシュが溜まりまくっていた
「アクセスログ辺りがしこたま蓄積しちゃってるんだろうか?」なんて思って調べ始めたのですが、ログは1GBにすら満たない量でした。
「じゃあ、WordPressあたりか?」と思ってファイルをたどっていったところ、WordPressで使っているプラグイン「Head Cleaner」のキャッシュが50GB超という世にも恐ろしいサイズに膨らんでいることが判明。それもjsの方だけで、cssの方は割と普通。何らかの理由でJavascriptのキャッシュが作成されまくってるみたいでした。
キャッシュを確認しようにもlsで開くこともままならず、かといってそのままにしておいてもしょうがないので、とりあえず、ファイルを削除して様子見することに。しかし、削除した後も順調にキャッシュは増えていきます。なんか、1PVあたり1キャッシュ作られているような……
WordPress Popular Postsが原因でした
なにがどうなってるのか調べるため、キャッシュの一部をダウンロードしてdiffったところ、どうやら「Wordpress Popular Posts(以下、WPP)」がページに埋め込むJavascriptが原因っぽいことが分かりました。
WPPはページのアクセス数をカウントするため(?)に以下のようなJavascriptをページに埋め込むようになっています。
<!-- WordPress Popular Posts v2.3.2 -->
<script type="text/Javascript">
/* <![CDATA[ */
jQuery.post('https://ex.icoro.com/wp-admin/admin-ajax.php', {action: 'wpp_update', token: '0123456789', id: 321}, function(data){/*alert(data);*/});
/* ]]> */
</script>
<!-- End WordPress Popular Posts v2.3.2 -->
この中で、idの値としてページのPostIDが埋め込まれるようになってるみたいです。そうなると、当然、idの部分はページごとに異なるものとなり、結果として、各ページで別のJavascriptを読み込んでいるのと同じ事になります。そして、それを真に受けたHead Cleanerは各ページごとに別のJavascriptのキャッシュを吐き出すことになります。
それだけなら記事数を上限にファイルの増加は収まるはずなのですが、それに加えてtokenの値も変化するため(たぶん、ユーザごととか期間ごととか)、その組合せは無限大。そしてキャッシュも無限に増えていくことに。
Head Cleanerでフィルタするだけ
このキャッシュファイルの無限1アップを終わらせるのは簡単です。
Head Cleanerの設定画面に入り、「有効なフィルタ」の項目にリストされている「WordpressPopularPosts::wpp_print_ajax」の「対象外」チェックボックスにチェックを入れて、「更新」ボタンを押します。
こうすることで、WPPが出力するJavascriptだけキャッシュから除外されるようになります。
WPPを使ってるのに項目が表示されないという場合は、ブログの投稿を表示したりした後にまた設定に戻ると表示されていたりします。
もっと何かしたかったですか? これだけです!
プラグインが吐くキャッシュファイルをわざわざチェックすることなんてあんまりないと思いますが、WPPのように、動的に内容が変化するJavascriptやCSSを出力するプラグインなどを導入している場合は、Head Cleanerのキャッシュが無限1アップし続けているかもしれません。ちょっとチェックしてみることをオススメします。
あと(どうでもいいですが)、溜まりに溜まったキャッシュを消すときはターミナルで「rm -v js/*」などとすると、削除してるファイル名が画面をどぁーっと流れていき、なんかすげー計算をしてるような、マトリックスな感じになります。あのコの前で出来る男子を演出しちゃえ☆