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サービスに対しては行なわないようにしてください。