ZopeとZopeの間にキャッシュを効かせる
以前のエントリで書いた件。Zopeが二段階になっていて、前段のZopeからAPIで後段のZopeへコンテンツを問い合わせて取り出す。
これが結構バカにならない負荷があって、なんとかキャッシュを効かせたいなあという案件でした。
このときはApacheのソースをいじくってなんとかしたんですが、後日に禍根を残しそうな気がするのでSquidでなんとかすることに。
Squidのサイトには動的コンテンツをキャッシュする設定例もあって、比較的スムーズに設定できました。ちょっと引っかかったのは、localhost->localhostでの通信ってデフォルトでは禁止されているので、それを上書きするaclを書かないといけないこと。そんなのしらないよ。
こんな構成になりました。
前段のZopeはlocahost:3128(Squidのデフォルトポート)へ問い合わせて、Squidはそれを後段のlocalhost:8081(Zope)へフォワード。その間にキャッシュします。
設定ファイルはこんな感じ。
acl Safe_ports port 8081 #後段のZopeへのポートへ通信できるaclを追加 http_access allow localhost #localhos間での通信を許可
このあたりはaclの追加。localhostがダメってなんでなんだろう。
http_port 3128 accel defaultsite=localhost:3128 #httpをフォワードしてキャッシュ
HTTPをフォワードして途中でキャッシュするときってこう書くらしいです。
cache_peer localhost parent 8081 0 no-query originserver name=Zope acl zope_accel dstdomain localhost http_access allow zope_accel cache_peer_access Zope allow zope_accel cache_peer access Zope deny all
このあたりはキャッシュする対象と、そのaclですね。no-queryとかってのは多分いらないと思う。後ろに複数の鯖がある場合はちょっと記述が違いますよ。
refresh_pattern \? 1440 20% 10080
クエリ文字列がはいっててもキャッシュしろって指示。後段のZopeはhttpヘッダにlast-modifyをつけてくれないので、minに適当な数字をいれておかないとキャッシュしれくれないみたい。