Nginxで特定のキャッシュを手作業で掘り当てる

Nginxが速い理由の一つでもある強力なキャッシュですが、スクリプトテストやページデザインをしているとキャッシュが邪魔になる時があります。

そんなときにはcacheディレクトリをまるごと削除してnginx -s reloadなんてしてましたが、ある程度ページが増えてくるとそうもいかなくなってきます。
そこで、非常に原始的な方法ですが一番理解しやすくて、いろいろと応用が効きそうな方法で削除してみました。

Nginxキャッシュ構造の簡単な説明

$ echo -n "http://host.example.com/" | md5
aae337ac0aaeb61700542b3db5643c7c

FreeBSDではデフォルトでmd5が入っていたのでそれを使ってます。
Linux等の場合はmd5sumだと思います。

これでキャッシュが消えるわけではありません。
MD5でハッシュ変換されるだけです。

FastCGI設定時にfastcgi_cache_pathに書いたlevels=1:2という部分、あれおまじないじゃなかったんですね。

cacheディレクトリの中を覗くと更に2段階ディレクトリがあります。

cache
 ┗━ a b c d e f 0 1 2  ← 1階層目
     ┗ ab be c7 50 7d  ← 2階層目

これが先程のMD5ハッシュの末尾3文字になっています。
aae337ac0aaeb61700542b3db5643c7c

fastcgi_cache_path
       ┌ 1階層目の文字数は1文字
levels=1:2
       └ 2階層目の文字数は2文字

この2階層目のディレクトリc7の中に、ハッシュ値がファイル名となって保存されていますので、それを削除すれば無事にキャッシュが消えました。

$ echo -n "http://host.example.com/" | md5
aae337ac0aaeb61700542b3db5643c7c
$ cd cache/c/c7
$ ls
aae337ac0aaeb61700542b3db5643c7c
$ rm aae*

fastcgi_cache_pathのlevelsについて

fastcgi_cache_pathの設定で、レベルは1~3階層、値(文字数)は1~2文字を設定できるようです。
最小設定だと16個、最大設定で16,777,216個のディレクトリになるって事ですかね。

Nginxのドキュメント

(英語ですがGoogle翻訳が素晴らしくなったので、Chromeで開いて翻訳すると快適です)
Module ngx_http_fastcgi_module