本連載も第6回を迎えましたが、第5回 まではどちらかというとRedmineの業務機能面をメインに紹介してきました。今回からはシステム運用担当者向けに、Redmineを題材としてRuby on Railsアプリケーションをどうシステム運用・構築するかといった部分に観点を向け、役立つ情報をご紹介したいと思います。
とはいっても、システム運用という言葉は非常に広義で、本格的に行おうとすると様々な観点がありますが、今回は主にパフォーマンス(性能)向上に話を絞って進めたいと思います。
Redmineをより良いパフォーマンスで動かすためには
Redmineを開発プロジェクト等で利用される方も多いかと思います。
特にRedmineは複数プロジェクトに対応したバグトラッキングツールですので、使い方によっては数多くのユーザからアクセスされるシステムとなります。
なので、個人用途で使う場合はそれほど気にしなくても良いのですが、多くの人数で使う場合は、それなりに性能面・安定面に気を遣いながら運用する必要があります。
本連載第1回目 の環境構築では、お手軽にRedmineを動かすまでの方法を紹介しました。
その状態から、システム面で手軽なステップアップを実施するとしたら以下の3点です。
Rails2.0系へのバージョンアップ
軽量Webサーバの導入
DB(MySQL)サーバのチューニング
Rails2.0系へのバージョンアップ
Railsのバージョン2.0系では、全体的にパフォーマンスの改善が行われています。特に2.0からはセッション情報をCookieに持たせることが可能で、この方法を使うことでさらに良いパフォーマンスを引き出すことが可能です。
Redmineの公式サイトでもRails1.2とRails2.0のパフォーマンス比較表 が公開されていますが、単純平均で約2割程度、性能向上が向上しているという結果が出ています。
尚、本件については、筆者のブログでも簡単に日本語で紹介[1] していますので、興味のある方はご参考までにご覧ください。
Rails2.0の導入方法に関しては、本連載第4回の「プラグイン利用の準備 」部分で紹介しています。ちなみに、最新バージョンである0.7系のRedmineには、Rails2.0が付属しています。
軽量Webサーバの導入
Rubyに標準で付属しているWeb/APサーバである"WEBrick"は、手軽に動かすことが可能で、開発時に動作確認として使うのに向いていますが、大人数で利用するには特に性能面が物足りません。
そこで、性能を向上させるべく、今回の記事では、以降この軽量Webサーバの導入方法について解説を行いたいと思います。
DB(MySQL)サーバのチューニング
利用ユーザ数やデータの格納数が増えてきた場合は、ハードウェアのスペックにあわせてDB(MySQL)サーバのパラメータを変更することで、場合によっては大きくパフォーマンスが改善されると思います。
MySQL等、DBサーバのチューニングに関しては、様々な書籍やWeb上で情報が公開されていますので、そちらをご覧ください。
他には・・・
負荷量が大きく、リクエストを捌けない状態になってくると、別途、状況にあわせたWeb/APサーバのパラメータ変更や、ハードウェア構成の変更(スケールアップ、スケールアウト)を検討する必要があります。
本件に関しても、様々な書籍やWeb上で情報が公開されていますので、そちらをご覧ください。
軽量Webサーバであるlighttpdを使う
Ruby on Railsの実行環境は、"WEBrick"の他にもいくつかの選択肢があります。
よく知られているのは、Webサーバの代名詞的な存在である"Apache"にFastCGIモジュールをあわせて使う方法や、RubyとCで実装され高速性が売りである"Mongrel"、そして今回紹介する、CPUやメモリの使用量を少なくし高速な軽量Webサーバと呼ばれる"lighttpd"を使う方法の3つです。
今回は、その中の1つlighttpdについてご紹介したいと思います。
lighttpdは、前述の通りApacheやIIS等のWebサーバと比べ軽量でかつ高速なWebサーバであるため、静的コンテンツの配信に向いているとされ、さらにCGIやFastCGIといった外部プログラムのインターフェースもサポートされているため、Ruby on RailsやPython(Django等) 、PHPなどを使ったWebアプリケーションの運用サーバとして注目を集めています。
海外でも、YouTubeの動画配信サーバ、WikipediaコモンズやMySpaceのアップロードサーバ、開発者にはおなじみのSourceForge.netなど、数多くの大規模Webサイトでの使用実績があります。
この構成では、CSSやJavaScript、画像などの静的コンテンツは軽量なlighttpdで全て返させて、動的コンテンツはFastCGIを介してRuby(Rails)に処理させることで高速化を図っています。Mongrelでも同様のことを行おうとすると、別途フロントにWebサーバを立てる必要があります。
このあたりの選択については、細かい性能差を気にするよりは、担当者の運用のしやすさを基準に選ぶのも良いかと思います。
では、早速lighttpdを導入する手順を紹介したいと思います。
lighttpdを使ってRedmineを動かす
既に本連載第1回で紹介した環境構築は終わっているものとして話を進めたいと思います。
まずは、必要となるパッケージをaptを使ってインストールします。
# apt-get install lighttpd libfcgi-ruby1.8
次に、lighttpdの設定ファイルである"lighttpd.conf"をRedmineに標準で付属しているRailsに含まれているサンプルからconfigディレクトリにコピーします。
# cp ${RAILS_ROOT}/vendor/rails/railties/configs/lighttpd.conf ${RAILS_ROOT}/config/
コピーしたlighttpd.confを編集します。34行目の動作モードを指定する環境変数である"RAILS_ENV"の項を以下のように書き換えます。
変更前
"bin-environment" => ( "RAILS_ENV" => "development" )
変更後
"bin-environment" => ( "RAILS_ENV" => "production" )
次に、publicディレクトリ内の"dispatch.fcgi.example"をリネームして"dispatch.fcgi"とし、実行権を付与します。
# mv ${RAILS_ROOT}/public/dispatch.fcgi.example ${RAILS_ROOT}/public/dispatch.fcgi
# chmod +x ${RAILS_ROOT}/public/dispatch.fcgi
以上で、最低限のインストール作業は完了です。
${RAILS_ROOT}にて以下コマンドを実行することで、lighttpdでRedmineを稼動させることが可能です。
# ruby script/server
なお、以前のようにWEBrickを利用したい場合は、以下のように明示させて起動してください。
# ruby script/server webrick -e production
ベンチマーク
Apacheに標準で付属している「ab」( Apache Bench)を使って、簡単なパフォーマンスの測定をしてみます。
環境・条件
測定を行った環境は以下の通りで、WEBrickとlighttpd、そして参考程度にmongrelとも比較しました。
Ubuntu Linux 7.10 on Xen ( Full Virtualization)
2Core vCPU, 1GB Memory
Ruby(1.8.6), Rails(2.0.2), Redmine(0.7.1), productionモード
測定対象となるWeb/APサーバは、以下の3つです。各サーバはデフォルト設定のまま稼動させました。
WEBrick(1.3.1)
mongrel(1.1.4)
lighttpd(1.4.18)
上記3つのサーバに対して、以下のabコマンドをRedmineのトップページに10回実行し、"Requests per second"の平均値を出した結果が以下となります。
# ab -n 100 -c 10 http://${SERVER_NAME}:3000/
結果
WEBrick 24.46 ( reqs/sec)
mongrel 31.83 ( reqs/sec)
lighttpd 35.60 ( reqs/sec)
以上の結果となりました。参考値ではありますが、lighttpdがWEBrickの約1.5倍程度の性能が出ていることがわかります。
稼働環境やアプリケーション処理などによって全て上記のような結果になるわけではありませんが、複数のユーザから利用され、本格的に運用されており、かつWEBrickを利用されている場合は、すぐにでもlighttpdを利用されることをオススメします。
おわりに
以上、駆け足ではありましたが、Redmineの本格的なシステム運用を始める第一歩として、軽量Webサーバであるlighttpdの導入方法を紹介しました。
実際には、lighttpdの起動/停止のスクリプトやlighttpdの設定など、使い方によってはもう少しやることがあるかと思いますが、Web上でも情報があると思いますし、筆者のブログなどでもまた機会があればご紹介します。
今回紹介したWeb/APサーバの他にも、最近ではmongrelより高速とうたわれているThinや、Passenger[2] などの新しい選択肢も登場してきているため、興味のある方は継続的にウォッチしていくべきでしょう。
次回は、Javaで実装されたRuby言語であるJRubyを利用して、RedmineをJava製のアプリケーションサーバで運用するための方法を紹介します。
[2] Apacheにmod_railsと呼ばれるモジュールを組み込み、FastCGIよりセットアップが簡単で、かつ高速で動かすことができます。導入方法については、筆者のブログにて紹介しています。