VaryヘッダがあるとSquidがキャッシュから取り出さない
今日はちょっと呪文的なお話。
こんな構成になっているWebサーバがあります。
Apache(1)->Plone
Ploneが返してくるページの一部がちょっと複雑でレスポンスが悪いのでApacheとPloneの間にSquidをかまして、その一部のページだけをキャッシュしてやることにしました。
Apache(1)->Squid->Plone
ところが全然キャッシュしてくれません。Squidのログを参照するとTCP_MISS/200ばかりを返してくる。debug_optionを最高レベルにして丹念にしらべるとどうもキャッシュストアはしているけれども次回のリクエストでキャッシュから取り出してくれないみたい。
レスポンスヘッダはこんな。
Cache-Control:private Content-Encoding:gzip Content-Language:ja Content-Length:6904 Content-Type:text/html;charset=utf-8 Date:Fri, 31 May 2013 07:21:36 GMT Expires:Sat, 1 Jan 2000 00:00:00 GMT Server:Zope/(Zope 2.10.13-final, python 2.4.6, linux2) ZServer/1.1 Plone/3.3.6 Vary:Accept-Encoding
Expiresがよくないな。そりゃキャッシュしないよ。ということでPloneでヘッダコントロールすりゃいいんですが、正直良くわからない(笑)ので途中にもう一発Apacheをかませてmod_headerでコントロール。
構成をこうして、
Apache(1)->Squid->Apache(2)->Plone
で、Apache(2)のバーチャルホストでこんな設定。
<LocationMatch /destination_location> Header unset Expires </LocationMatch>
これで実験、しかしこれでもキャッシュしてくれない。うーんなぜだ。
うーん、Cache-Controlも消してみる?
<LocationMatch /destination_location> Header unset Expires Header unset Cache-Control </LocationMatch>
これでもだめ。あとなんだろ。Vary? 関係ないよなぁ。
<LocationMatch /destination_location> Header unset Expires Header unset Cache-Control Header unset Vary </LocationMatch>
をを、キャッシュヒット。
127.0.0.1 - - [31/May/2013:16:22:40 +0900] "GET http://127.0.0.1:3128/hogefuga/hoge HTTP/1.1" 200 7278 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36" TCP_MEM_HIT:HIER_NONE
最終的にはこうなりました。
<LocationMatch /hogehoge/cms/country> Header unset Vary Header unset Expires </LocationMatch>