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に適当な数字をいれておかないとキャッシュしれくれないみたい。

効果は

で、効果は抜群。以前は6分あたりに2000〜3000ほどあったリクエストですが、ほとんどがSquidでインタセプトされるようになりました。後段のZopeへのリクエストは100分の1ほどに。ウェブがとっても早くなってうれしい。