現在位置: ホーム ブログ Ploneとキャッシュサーバ構成の例
ブログ

Ploneとキャッシュサーバ構成の例

Ploneは動的にコンテンツを生成して公開する仕組みとなっている。HTMLで構成されるページはもちろん、画像やファイルも同様である。さらにCSSやJavaScriptも同じ仕組で配信されている。その為、サーバの負荷を下げ多くのリクエストに耐えられるようにキャッシュサーバを設置することが多い。その例を見て行きたいと思います。

単純な構成

PloneはベースとなっているZopeのパブリッシャ機能を通して、コンテンツが配信されます。ZopeにはWebサーバ(HTTPサーバ)機能が備わっていますので、他のサーバを準備する必要はありません。しかし、多くのサイトで使われているApacheにある基本機能が備わっていません。例えば、バーチャルホスト機能やSSLサーポートです。これらをZopeの機能で実現することも可能ですが、一般的にはZope(すなわちPlone)のフロントサイドにApacheなどのHTTPサーバをリバースプロキシーとして設置しています。これは、Tomcatを用いる場合も同様だと思います。

つまり、以下の様な構成になります。

Apache -> Plone (Zope)

キャッシュサーバを用いる構成

最初にも触れましたが、Ploneは動的にコンテンツを配信するように作られています。内部的にメモリキャッシュをしたり、DB問合せを少なくする仕組みは備わっていますが、あくまでもアプリケーションサーバキャッシュとなります。

ここで考えられるのが、CSS/JavaScriptや画像、ファイルなどを静的に保持しておく仕組みです。もちろんHTMLページも同様に保持しておくことも可能です。

Apacheには、「mod_cache」というキャッシュのモジュールがありそれを利用することも可能です。

当社では、キャッシュ専用のアプリケーションである Varnish を用いることが多くあります。Varnishの導入については、2009年7月のエンリーを参照して下さい。

キャッシュサーバで何をどれだけキャッシュするかというのは、サイト毎に変わってくると思いますが、CSS/JavaScriptなどはキャッシュしやすいと思いますのでそれだけでもキャッシュすると効果があります。

この場合、以下の様な構成になります。

Apache -> Varnish -> Plone (Zope)

Plone 4以前ですと、サイトの容量が大きくなるとパフォーマンスの低下が著しかったのですが、現在のPloneでは、キャッシュサーバを用いなくともある程度のページビューには耐えられます。以前よく「1万PV/日を超える場合に検討したほうが良い」と言われていましたが、それ以上をキャッシュサーバ無しで使えた実績も有りますので、サイトの用途などによって検討をすればいいかと思います。

余談ですが、Ploneが重いと言われていますが、他の動的CMSも同様の悩みがあるようです。機能が充実しているとそれなりに重くなってしまっているのだと思います。Plone界隈では、このパフォーマンス問題は初期のころから問題視され、高速化を行うとともにキャッシュサーバの導入などのノウハウもたくさん存在しています。

アプリケーションサーバを複数台設置

Plone(Zope)にはアプリケーションサーバを複数台にし、データベースサーバを参照する仕組みが同梱されています。(データベースサーバを複数に出来る仕組みもある)

この場合、以下の様な構成になります。

Apache -> Varnish -> Plone (Zope)【複数台】 -> DB(ZODB)

ロードバランスをどの部分で行うかは議論がありますが、当社ではキャッシュを複数持つことでユーザに表示されるものを複数管理するのではなく、キャッシュサーバの背後でPlone(Zope)を複数台設置しています。
キャッシュサーバの冗長化を考えて複数台にすることもあります。さらにキャッシュを一意に保つために、指定のものをパージする事も行っています。

キャッシュサーバの背後でロードバランスを行うには、ハードウエアを用いる事も考えられますが、普段は、Varnishのバランシング機能を使ったり、HAProxyを導入したりしています。

フロントHTTPサーバについて

当社ではApache HTTPサーバを用いるケースが多くあります。実績が豊富で多様な設定ができるからです。その反面、瞬発的な高負荷に耐えられないなど問題も抱えていると思います。

今後は、商用サーポートも始まった、Nginxの採用も進めていこうと考えております。

イントラネットなどに用いる際に、専用のSSOモジュールを組み込む場合もあり、その際にはApacheモジュールを使うことになります。

参考資料として、2013年8月に行ったPlone Talkでの資料を参照下さい。

comments powered by Disqus