Rails用APサーバー比較

先日書いたようにRailsを動作させる環境をMongrelから他の環境に移してみようと考慮中。もう既にいくつか比較はあがっているみたいなので(パフォーマンス的にはどれでもどうぞという感じだろうか)、それぞれのソフトを触ってみて、またそれぞれのサイトをみて分かったことをまとめてみる。

どのソフトについても開発に関わっていたり長い期間ウォッチした結果では無いので間違いがある場合は、ご指摘いただきたい。

例によって比較した環境を書いておく

  • Ruby1.8.7 P247
  • Rails2.3.5
  • Gem1.3.5
  • Apache2.2.14(PassengerとMongrelで使用)。またパフォーマンス測定は同バージョンのabを利用
  • Redmine0.9.2

Redmineはプロジェクト一覧画面にアクセスしてレスポンスが変えてくるまでの時間の計測を行うために利用した。

今回比較してみたソフトは以下の通り

まず、それぞれのライセンスを調べてみた。何となく思い込みでRubyライセンスばかりなのかなと思っていたけれど、やっぱりそうじゃない。

ソフト名 ライセンス
Webrick Rubyライセンス
Passenger MITライセンス
Mongrel Rubyライセンス
Thin Rubyライセンス
Lighttpd 修正BSDライセンス

Lighttpdが修正BSDライセンスなのはちょっと意外な気持ち。使う環境によりまずライセンスが重要になる場合もあると思うので、最初にこの辺はチェックしておいて損はしないともう。

次に開発状況とバージョンについて比較してみた。バージョンの初期は全て1.0をスタート時点として計算しています。これは1未満のときはソフトによって更新のムラがかなりあったためです。

名称 現バージョン 最終バージョンリリース時期 初期バージョンリリース時期 更新頻度 最終リリースからの時間
Passenger 2.2.9 2010/01/08 2008/06/25 約1ヶ月毎 1.5ヶ月経過

Passengerは開発が盛んで、現状の2系がリリースされから現時点での最終バージョンである2.2.9までに途中のテスト用βを除いて18回のリリースが行われている。更新に関する情報や旧バージョンからのアップデート方法を含めてhttp://blog.phusion.nl/でサポートされており、Passengerを利用するならこのblogのチェックは必須だと思う。

また、現在の2系はすでに次の3系への切り替え準備に入っているようなので、そろそろ枯れきったPassenger2系として安定が望める感じもする。ただ、ただ業務利用を考えるのであれば現在の平均月1回のバージョンアップがある間は、それを確実に実施できる体制が必要と思う。

名称 現バージョン 最終バージョンリリース時期 初期バージョンリリース時期 更新頻度 最終リリースからの時間
Mongrel 1.1.5 2008/05/22 2007/01/22 約1.9ヶ月毎 21ヶ月経過

本番環境の構築が難しかったRailsへの妙薬として登場したMongrelだけれども(個人的にもあちこちでお世話になっている)、最終バージョンのリリースから既に21ヶ月が経過。Rubyのマイナーバージョンアップとの整合性チェックも既に行われるハズもなく、そろそろ役目を終えたと考えた方がいいのかもしれない。

名称 現バージョン 最終バージョンリリース時期 初期バージョンリリース時期 更新頻度 最終リリースからの時間
Thin 1.2.5 2010/02/11 2008/07/13 約2.7ヶ月毎 半月経過

Thinは個別のリリース日がはっきり押さえられなかったのでGitに登録されているChangeログから1.0がリリースされた日と最終リリースの日を見ている。このため実際に入手できた日とは多少ずれがあるかもしれない。

このThinはそのホームページ(http://code.macournoyer.com/thin/)でも書かれているがMongrelを意識してつくられているようで、パフォーマンスも悪くない。リリース間隔もさほど短くないうえに現在でも開発が続いていることから割と安心して使えるアプリケーションのように見える。

名称 現バージョン 最終バージョンリリース時期 初期バージョンリリース時期 更新頻度 最終リリースからの時間
Lighttpd 1.4.26 2010/02/07 2007/02/16 約2.5ヶ月毎 半月経過

Lighthttpdは1.4系の正式リリース版と思われる1.4.11を開始時点として計算してみた。これも現在でも開発が活発で、Redmineのロードマップをみるとすでに1.4.27の開発も順調に進んでおり、いままでのペース通りであれば4月ごろにはリリースされるのではないかと思う。

ここまでのリストをまとめてみたのが以下の通り。

名称 現バージョン 最終バージョンリリース時期 初期バージョンリリース時期 更新頻度 最終リリースからの時間
Passenger 2.2.9 2010/01/08 2008/06/25 約1ヶ月毎 1.5ヶ月経過
Mongrel 1.1.5 2008/05/22 2007/01/22 約1.9ヶ月毎 21ヶ月経過
Thin 1.2.5 2010/02/11 2008/07/13 約2.7ヶ月毎 半月経過
Lighttpd 1.4.26 2010/02/07 2007/02/16 約2.5ヶ月毎 半月経過

こうしてみるとMongrelをいまからのシステム使うのどうかな、という感じ。

つぎにインストールのしやすさについて主観で比較してみた

名称 インストール難易度 補足
Webrick Railsインストールしたら入ってる
Mongrel 普通 実際に運用するにはApache等の配下においてmongrel_clusterが必要
Passenger 普通 Apacheのバージョンに縛られるけれど、そこを乗り越えられるのなら楽
Thin 優しい Gemで一発インストールできる上に、クラスター化も単独でできるのでMongrelよりさらに楽
Lighttpd 難しい 定義ファイルの設定からいろいろ必要なので、Lighttpdをちゃんと勉強する必要あり

WebrickRailsについているので比較対象から除くとして、GemでインストールできるMongrel,Thinがインストール的にはかなり楽。テストフェイズはそのまま使うので問題無いと思うけれど、運用に乗せる時は、リバースプロキシー配下(Apacheのmod_proxy_balancer等)に置いてやる必要があると思うので、その辺は注意が必要。また、Mongrelクラスター化する場合は、mongrel_clusterを追加で入れた方が便利なので、その点も要チェック。

PassengerはGemでインストールできるものの、その後の実際のインストールコマンドを起動する際にApacheとの関係(apxs2とかpath)を押さえておく事と、gcc,ruby-sslライブラリが入っていることが確認できていれば比較的スムーズ。インストールを説明してるサイトもわかりやすくかいてくれているので、読み流れ作業できれば何とかなると思う。ただ、VirtualHostを使う前提で書かれている説明が多いので、それを使いたく無い場合は少し試行錯誤が必要かもしれない。

LighttpdCentOSの場合、pcre-develとbzip2-develをyumでいれて、fastcgi(2.4.0を使った)を入れておけば、インストール自体は比較的あっさり入る。問題はその設定ファイル。自分で中身をちゃんと理解して1から作ろうとすると結構大変だと思う。今回は、サンプルをまねて部分的に修正しては動かす、を何度か繰り返して動く環境を作った。思ったよりこの設定ファイルに関する情報を得るのが大変だったので、今回はインストール難易度を難しいにしてみた。

次に各アプリの起動前と起動して負荷をかけた後のメモリ状況を比較してみた。この比較は、MongrelとThinに関しては特にチューニングを施していない標準の状態でインストールしたApache2.2の消費するメモリを含んだ値になっている。そして、各アプリケーションで起動しているプロセス数(mongrelなら5個クラスター起動しているので5で割っている)で割り算して1個あたりの消費量を出してたのが、以下の図。

Lighttpdが比較的少ないのだけれどこれについてはよく分かってません。MongrelとThinはメモリ消費についてはほぼ同じ程度で、動きも同じような感じ。クラスターとして起動させる個数Xここで出た値分ぐらいがメモリ消費されていくので、起動させるだけでもその程度必要と思った方がいい。

Passengerは設定にもよるけれど、しばらく放置しておけば不要なプロセスは解放させれてメモリ空間に空きができるので、最大起動できるプロセス数を定義しておくことで複数のアプリケーションを起動する環境を運用しやすい感じ。

最後にRedmeinのプロジェクト一覧をアクセスした時のレスポンス速度。どれも同時受付数は5になるように設定して計測(Webrickは1)してみた。

何度か計測してみた感じだと、特に重い処理でも無いせいかもしれないけど、どれもさほど変わらない。速度に関してはあまり変わらないので好きなのを使えばいいという感じ。

簡単にここまで見てみて、複数のアプリケーションを動かしたいのならPassenger。テスト環境とかですぐ動かしたいならThin単独で使うのが楽という感じを受けた。後は、もう少しそれぞれを利用してみて、ログの切り替えのしやすさとか安定性とかを見てみてまた追記したい。