Passenger (mod_rails for Apache) を使ってRedmineを動かしてみたよ!

Passenger (mod_rails for Apache)


d:id:rx7:20080327:p1 で紹介したRuby on Rails用のApacheモジュール「Passenger (mod_rails for Apache)」が、とうとうベールを脱いだ模様。


先日、mod_railsを使うと何が嬉しいのよ、って聞かれたんですが、やはりApacheを通してRailsアプリケーションが動くことでしょう。

というのは、運用しているサーバなどでApacheが動いていたりすると、今更MongrelやLighttpdで新規に動かすより、既存のApacheを生かして動かしたいというニーズがある場合もあるかと思います。

しかし、Apache + FastCGIを使った運用は、やや敷居が高いイメージがあったりするため、この手軽に導入できてかつ運用しやすい(かもしれない)可能性があるmod_railsに期待を抱くわけです。


つーわけで、物は試しってことで、RailsアプリケーションであるRedmineをこのApache + mod_railsで動かしてみました。

インストール

Ubuntu(Linux)あたりに入れてみることにします。

ほぼインストールしたてのUbuntuだったので、パッケージが足りないことが多くTry & Errorの作業ログになっている点はご了承ください。綺麗に導入したい方は、逆からお読みになることをオススメしますw
# 躓いてググってきた人の参考になれば。


前提としてRedmineとRubygemsはインストールされているものとします。
これらの導入方法については、「Redmineを運用するためのイロハを身につけよう:第1回 新機能の紹介と最新版が利用できるまで|gihyo.jp … 技術評論社をご参照ください!(宣伝)


では早速。面倒くさいので、rootになってから作業することにします(汗)

# apt-get install apache2

まずは、aptでApacheをサクっとインストール。
次に、今回の主役「Passenger」をインストールします。

# gem install passenger

こいつはgemで簡単にインストールできます。

Install required dependency fastthread? [Yn]  Y

fastthreadが必要となるので、入ってなかったら途中で導入可否を聞かれるので、迷わず「Y」をw

Select which gem to install for your platform (i486-linux)
 1. fastthread 1.0.1 (mswin32)
 2. fastthread 1.0.1 (ruby)
 3. fastthread 1.0.1 (i386-mswin32)
 4. Skip this gem
 5. Cancel installation
> 2

今回は、Linux上への構築となるので、(ruby)が書かれた2を選択します。

Building native extensions.  This could take a while...
ERROR:  While executing gem ... (Gem::Installer::ExtensionBuildError)
    ERROR: Failed to build gem native extension.

ruby extconf.rb install passenger
extconf.rb:1:in `require': no such file to load -- mkmf (LoadError)
        from extconf.rb:1


Gem files will remain installed in /var/lib/gems/1.8/gems/fastthread-1.0.1 for inspection.
Results logged to /var/lib/gems/1.8/gems/fastthread-1.0.1/ext/fastthread/gem_make.out

すると、あら・・・エラーが出てしまいました。
どうも、Ruby関連のlibやheadersが入っているdevパッケージがいるのかしら。

# ruby -v
ruby 1.8.6 (2007-06-07 patchlevel 36) [x86_64-linux]

ってことで、インストールしてあるのは、バージョン1.8系のrubyなので、、、

# apt-get install ruby1.8-dev

ruby1.8のdevパッケージをインストールします。

# gem install passenger

で、再度Passengerのインストールにトライ。

In file included from fastthread.c:12:
/usr/lib/ruby/1.8/i486-linux/ruby.h:40:21: error: stdlib.h: No such file or directory
/usr/lib/ruby/1.8/i486-linux/ruby.h:44:21: error: string.h: No such file or directory
/usr/lib/ruby/1.8/i486-linux/ruby.h:54:19: error: stdio.h: No such file or directory
/usr/lib/ruby/1.8/i486-linux/ruby.h:71:20: error: alloca.h: No such file or directory

・・・・・

In file included from fastthread.c:14:
/usr/lib/ruby/1.8/i486-linux/rubysig.h:15:19: error: errno.h: No such file or directory
fastthread.c: In function 'wait_condvar':
fastthread.c:626: warning: passing argument 1 of 'rb_ensure' from incompatible pointer type
make: *** [fastthread.o] Error 1

また、エラー出た。stdlib.hとかがない、って言われてる時点で、Cのライブラリが足りていない。

# apt-get install libc6-dev

つーわけで、libc6-devパッケージをaptでインストールして、

# gem install passenger

再々度、Passengerのインストールにトライ。

Building native extensions.  This could take a while...
Install required dependency rspec? [Yn]  Y
Install required dependency rails? [Yn]  Y
Install required dependency activesupport? [Yn]  Y
Install required dependency activerecord? [Yn]  Y
Install required dependency actionpack? [Yn]  Y
Install required dependency actionmailer? [Yn]  Y
Install required dependency activeresource? [Yn]  Y

・・・・・

Installing RDoc documentation for actionmailer-2.0.2...
Installing RDoc documentation for activeresource-2.0.2...

今度は、無事成功。

# passenger-install-apache2-module

再度、実行。

Welcome to the Passenger Apache 2 module installer.

This installer will guide you through the entire installation process. It
shouldn't take more than 3 minutes in total.

Here's what you can expect from the installation process:

 1. The Apache 2 module will be installed for you.
 2. You'll learn how to configure Apache.
 3. You'll learn how to deploy a Ruby on Rails application.

Don't worry if anything goes wrong. This installer will advise you on how to
solve any problems.

Press Enter to continue, or Ctrl-C to abort.
1

1を入力。

Checking for required software...

 * GNU C++ compiler... not found
 * Ruby development headers... found
 * OpenSSL support for Ruby... found
 * RubyGems... found
 * Rake... found at /var/lib/gems/1.8/bin/rake
 * Apache 2... found at /usr/sbin/apache2
 * Apache 2 development headers... not found
 * Apache Portable Runtime (APR) development headers... not found
 * fastthread... found

Some required software is not installed.
But don't worry, this installer will tell you how to install them.

Press Enter to continue, or Ctrl-C to abort.

おおーっ!うまくいきませんでしたが、足りないものが何かを教えてくれています。わかりやすい。

# apt-get install g++ apache2-threaded-dev

というわけで、足りないものをaptで入れちゃいましょう。

# passenger-install-apache2-module

再度、実行。

Checking for required software...

 * GNU C++ compiler... found at /usr/bin/g++
 * Ruby development headers... found
 * OpenSSL support for Ruby... found
 * RubyGems... found
 * Rake... found at /var/lib/gems/1.8/bin/rake
 * Apache 2... found at /usr/sbin/apache2
 * Apache 2 development headers... found at /usr/bin/apxs2
 * Apache Portable Runtime (APR) development headers... found
 * fastthread... found
--------------------------------------------
WARNING: Apache doesn't seem to be compiled with the 'prefork' MPM

Passenger has only been tested on Apache with the 'prefork' MPM. Your Apache
installation is compiled with the 'worker' MPM. We recommend you
to abort this installer and to recompile Apache with the 'prefork' MPM.

Press Ctrl-C to abort this installer (recommended).
Press Enter if you want to continue with installation anyway.

んー、Apache2.2のMPMをworkerじゃなくて、preforkを推奨する、とのこと。そうでつか...orz

# apt-get install apache2-mpm-prefork apache2-prefork-dev

というわけで、"prefork" MPMのApache2.2を再度インストールします。

# passenger-install-apache2-module

懲りずに、再々度実行。

The Apache 2 module was successfully installed.

Please edit your Apache configuration file, and add these lines:

   LoadModule passenger_module /var/lib/gems/1.8/gems/passenger-1.0.1/ext/apache2/mod_passenger.so
   RailsSpawnServer /var/lib/gems/1.8/gems/passenger-1.0.1/bin/passenger-spawn-server
   RailsRuby /usr/bin/ruby1.8

After you restart Apache, you are ready to deploy any number of Ruby on Rails
applications on Apache, without any further Ruby on Rails-specific
configuration!

おぉぉ、インストールが完了した模様です!
こいつをhttpd.confに貼り付けろ、ってことですね。

Deploying a Ruby on Rails application: an example

Suppose you have a Ruby on Rails application in /somewhere. Add a virtual host
to your Apache configuration file, and set its DocumentRoot to
/somewhere/public, like this:

   <VirtualHost *:80>
      ServerName www.yourhost.com
      DocumentRoot /somewhere/public
   </VirtualHost>

And that's it! You may also want to check the Users Guide for security and
optimization tips and other useful information:

  /var/lib/gems/1.8/gems/passenger-1.0.1/doc/Users guide.html

Enjoy Passenger, a product of Phusion (www.phusion.nl) :-)
http://www.modrails.com/

さらに、エンターキーを押すと、こんなのが出ます。VirtualHostを使う場合の一例みたいですね。


さて、Apacheの設定ファイルを修正します。
まずは、httpd.conf(UbuntuやDebianでApacheをaptからインストールした場合は、apache2.confとなります)を開きます。

LoadModule passenger_module /var/lib/gems/1.8/gems/passenger-1.0.1/ext/apache2/mod_passenger.so
RailsSpawnServer /var/lib/gems/1.8/gems/passenger-1.0.1/bin/passenger-spawn-server
RailsRuby /usr/bin/ruby1.8

こんな感じで追記します。
UbuntuやDebianでApacheをaptからインストールした場合でかつ、きちんと運用していく場合は、apache2.confではなく、流儀に従って/etc/apache2/mods-available以下にpassenger.loadとpassenger.confを作成して、先ほど追記したものを書くべきでしょう。


続いて、ドキュメントルートを動かしたいRailsアプリケーションの${RAILS_ROOT}/public/に設定しましょう。
UbuntuやDebianでApacheをaptからインストールした場合、VirtualHostの設定が、"/etc/apache2/sites-available/default"に書かれてあるので、これを開いて修正します。
私は、Redmineの${RAILS_ROOT}を"/var/www/redmine"に設定しているため、以下のように修正しました。

<VirtualHost *>

・・・・・

        DocumentRoot /var/www/redmine/public/
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>

・・・・・

</VirtualHost>

これで、設定は完了です。
んでは、Apacheを再起動("/etc/init.d/apache2 restart"もしくは"apache2ctl restart"あたりで)し、ブラウザでアクセスしてみます。


https://farm4.static.flickr.com/3152/2408383918_288e64917e.jpg

おぉぉ、動きました。割とサクサク動いている感じです。不具合等は特になさそうです。

Forbidden(403)が出て、アレ?ってなっている人は、httpd.confのDocumentRootが${RAILS_ROOT}だけになってて、${RAILS_ROOT}/public/になっていない、とかじゃないかしら。

まとめ

今回は、初めてPassenger(mod_rails)を動かしてみたこともあって、割と苦労したように見えますが、慣れてしまえば楽チンで導入できると思います。少なくともFastCGIと連携させるより導入は容易です。
あとは、パフォーマンス面と、高負荷時の安定度、ロングランでも問題なく運用できるかという部分が気にはなるところですが。


公式ページのドキュメンテーションによると、

According to our tests, Passenger is a bit faster than Mongrel, and seems to be on par with Thin:

https://farm4.static.flickr.com/3292/2408383958_f4b2ed17b9_o.png

Though we have to say that absolute speed is not our goal. Our primary goals are ease of use, low maintenance and high stability. Of course, we do strive for sufficient performance, and we think that Passenger is sufficiently fast.

Documentation - Phusion Passenger (a.k.a. mod_rails)

とのこと。Mongrelより少し速く、Thinと同等くらいらしい。本当だったら結構速いですね!

We’ve done a lot of stress testing. So far we’ve been unable to make Passenger crash, even when under high load (e.g. ab -n 10000 -c 100).

Also, we've performed some robustness tests as well, and you can read our findings here.

The codebase has also been extensively tested with tools such as Valgrind in order to ensure that there are no memory corruption bugs.

Documentation - Phusion Passenger (a.k.a. mod_rails)

負荷テストも含めて、十分に幅広くテストはしているから大丈夫だ。と言っているように見えます。


ということで、ドキュメントによるとパフォーマンス面でも高速、高負荷時でも安定して動作するみたい。

これは、Railsアプリケーションの運用サーバ界隈がまた賑やかになりそうな予感ですね!

参考

Overview - Phusion Passenger (a.k.a. mod_rails)
http://www.modrails.com/
Install - Phusion Passenger (a.k.a. mod_rails)
http://www.modrails.com/install.html
Documentation - Phusion Passenger (a.k.a. mod_rails)
http://www.modrails.com/documentation.html
Benchmark: Passenger (mod_rails) vs Mongrel vs Thin
http://izumi.plan99.net/blog/index.php/2008/03/31/benchmark-passenger-mod_rails-vs-mongrel-vs-thin/
チェック必須!Rails新時代の到来か?「Passenger(mod_rails for Apache)」
http://www.moongift.jp/2008/04/passenger/