« Image::Sizeで読めないjpegファイルへ対応するpatch | メイン | WEB+DB PRESSで連載やります »

Squidのキャッシュの消し方

Net::Squid::Purgeというモジュールがでてたので。

Squidのcacheの消し方は、Squidから特定のキャッシュのみを削除する方法にsquidclientを使ったやりかたが紹介されているのですが、上のモジュールはそれをPerlから便利に使えるようにしたもの見たいですね。

主にReverse Proxyとして使っているパターンですが、最近ではsquidclient使ったり、IO::Socketやtelnetで叩くのが面倒なので、HTTPの仕様を利用しています。

HTTP/1.1の仕様でキャッシュサーバは

 Cache-Control: max-age=n

のようなリクエストを受け付けた場合に、キャッシュの経過時間がn秒よりも古かった場合、expires等が切れてなくても、オリジンのサーバにリクエストを行うことになっています。

そこでこれを利用して

Cache-Control: max-age=1

を付けてリクエストを行なえば、だいたい常にオリジンのサーバへ確認をしてくれます。
オリジナルコンテンツが無くなっていた場合は、元のキャッシュが消えて、404がキャッシュされるような感じですね。なので厳密なキャッシュ削除とはちょっと違います。
なんで、max-ageが 0 ではなくて、1 なのかというと、squidの設定で、ignore-no-cacheがあるためです。このオプションが有効になっている場合、Cache-Control: no-cacheやPragma: no-cacheと同じように、max-age=0は無視されてしまします。


このリクエストを実際に運用しているサーバに大量に送ると負荷になってしまう可能性があるので、他人/他社のWebサービスに対しては行なわないようにしてください。