Plone導入の理由、チューニングの方針
このサイトはPython製のCMS、Ploneを使って構築しました。
私がPythonを好きというのもあるのですが、ページ編集などの高機能さと、COREBlog2などのアドオンプロダクトが豊富なことがPloneの魅力です。今回は特にブログを複数置こうと思ったことと、技術者ではないメンバーも簡単に操作できるようにということでPloneを選びました。
Ploneはその高機能さや保守性の高い設計と引き替えに動作が遅いという話もよく聞きます。確かに普通にインストールして使っている分にはもっさりした感じになります。今回の場合は、外部からのアクセス=非メンバーによるアクセスに素早くレスポンスを返すことができれば良いと考え、そこに絞ってチューニングしようと考えました。
サーバ構成
サーバのハード構成は以下のようになっています。海外のVPSを利用しており、メモリは正直言って貧弱です。本来Ploneを使う場合はもう少しメモリを積んでおくべきだと思います。
- Core2 Quad 2.4GHz
- 512MB RAM
ソフトウェア構成は以下のようになっています。
- CentOS 5
- Apache 2.2系
- Plone 3.0系
Apacheの設定
mod_proxyでPloneにリクエストを転送します。メモリに余裕もないことから、MPMにはworkerを使用しました。ただし、それほど多くのアクセスがあるわけではないので、スレッド数などの値はデフォルトより低めに設定しました。静的ファイルを効率よく返すために、KeepAliveはOnにしています。
また、mod_cacheでCSS、画像などの各種静的ファイルをキャッシュしています。Squidなどのプロキシサーバを利用するケースもよくあるようですが、サーバリソースに余裕がないこともあって今回はmod_cacheを使いました。動的ページのうち、アクセス数の多いトップページだけはキャッシュ対象にしたかったのですが、ルートを指定するとそれ以下が全て対象になってしまうため、うまい指定方法が分かりませんでした。
Ploneの設定
Ploneを使っていて遅い印象を受ける要因の一つが、ページがロードされてCSSが適用されるまでに少しの間があることです。Firefoxの場合などでは、CSSの適用されていない状態が最初に表示されてしまいます。そこで、デバッグ時はdisabledにしていますが、ZMIのportal_cssでキャッシュとマージを忘れずにEnabledに戻し、前述のようにApacheにもキャッシュさせます。
また、CacheFuというキャッシングプロダクトをインストールすれば、全体に動きが速くなります。
チューニングの結果
ローカルでApache Benchを使った簡易ベンチマークテストでは、動的ページに対して3リクエスト/秒程度だったところが、40リクエスト/秒程度まで向上しました。ただしCOREBlog2のページだけは、CacheFuが適用されていないのか、変化が見られませんでした。また、ロゴなどの小さな画像は、直接Ploneにリクエストすると250リクエスト/秒程度のところが、Apache+mod_cacheを通すことで数千リクエスト/秒に高速化できました。
手元で使っているMacBook AirのFirefoxでFirebugにより計測したところ、各ページ1秒前後のロード時間に抑えることができています。
その他: RSS出力
Ploneは各ページでRSSの出力を設定できるのですが、最初設定方法が分からなくて困りました。
Zope Management Interfaceから、Ploneサイト -> portal_actions -> object -> syndicationと辿って、Visible?にチェックをつけると、Ploneの各ページにRSSタブが表示されるようになります。最初からオンになってればいいような気がします。
その他: COREBlog2のカテゴリポートレット
here.getCategoryCount(obj.Title)の箇所でUnicodeDecodeErrorが出て、うまく表示できませんでした。
調査してフィードバックできればよいのですが、時間がない & 内部についてちゃんと把握できていないので、この処理が行われているエントリのカウント部分を外すことで回避しました。
以上、特別変わったことはしていませんが、Ploneの導入メモでした。
参考書籍
Plone 完全活用ガイド (Gihyo Expert Books): 柴田 淳, 鈴木 たかのり, 木下 文史, 他, ウェブコア(株)

株式会社マリーチで企画、開発を担当する道須のブログです。