akishin999の日記

調べた事などを書いて行きます。

Ruby 2.0 で Passenger を動かしてみた

Ruby 2.0.0-p0 がリリースされましたね。
ということで、早速インストールして Passenger で Rails の簡単なサンプルアプリを動かすところまでやってみました。

環境は CentOS 6.3 x86_64 です。

準備

まずは必要なパッケージをインストールします。
README などに特に記載はないようだったので、取りあえず Ruby 1.9 の時必要だったものを一通り入れてみました。

# yum install -y gcc gcc-c++ make wget
# yum install -y zlib-devel openssl-devel readline-devel ncurses-devel gdbm-devel db4-devel libffi-devel tk-devel
# yum install -y http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/libyaml-0.1.3-1.el6.x86_64.rpm \
                 http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/libyaml-devel-0.1.3-1.el6.x86_64.rpm

minimal で入れた CentOS 6 だと wget も入っていないので入れています。

次に簡単にアンインストールできるようにするために paco をインストールします。

# cd /usr/local/src/
# wget http://jaist.dl.sourceforge.net/project/paco/paco/2.0.9/paco-2.0.9.tar.gz
# tar xzf ./paco-2.0.9.tar.gz
# cd ./paco-2.0.9
# ./configure --disable-gpaco
# make && make install && make logme

これで準備は OK です。

Ruby 2.0.0-p0 のインストール

といっても Ruby 1.9 の時と同じで問題なく入りました。

# cd /usr/local/src/
# wget ftp://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p0.tar.gz
# tar xzf ruby-2.0.0-p0.tar.gz
# cd ruby-2.0.0-p0
# ./configure
# make
# paco -D make install

バージョンを確認します。

# ruby -v
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-linux]

無事 2.0.0p0 がインストールされたようです。
RubyGems のバージョンも確認してみます。

# gem -v
2.0.0

gem のバージョンも上がっていますね。

Passenger のインストール

今回は Apache2 で試すので httpdhttpd-devel をインストールしておきます。

# yum install -y httpd httpd-devel

普通に gem から入れられる passenger 3.0.19 だと passenger-install-apache2-module 実行時に「cannot load such file -- rubygems/builder」が発生してしまいました。

# gem i passenger --no-rdoc --no-ri
# passenger-install-apache2-module
・
・
・
--------------------------------------------
Compiling and installing Apache 2 module...
cd /usr/local/lib/ruby/gems/2.0.0/gems/passenger-3.0.19
/usr/local/bin/ruby /usr/local/bin/rake apache2:clean apache2 RELEASE=yes
# /usr/local/bin/ruby /usr/local/bin/rake apache2:clean apache2 RELEASE=yes
rake aborted!
cannot load such file -- rubygems/builder

(See full trace by running task with --trace)
・
・
・

探してみたところ、以下にパッチを投稿されている方がいました。

passenger-install-apache2-module doesn't work on ruby 2.0 by id774 · Pull Request #71 · FooBarWidget/passenger · GitHub
https://github.com/FooBarWidget/passenger/pull/71

というわけで Git から落として上記のパッチを適用してインストールしてみます。
まずは Git をインストール。

# yum install -y git

Git が入ったら以下のようにしてパッチ適用済みの gem を作成し、インストールします。

# cd /usr/local/src/
# git clone git://github.com/FooBarWidget/passenger.git
# cd passenger/
# wget https://raw.github.com/id774/passenger/39cf482d1f2c3118021076362bd3f0a41750faa6/build/gempackagetask.rb -O build/gempackagetask.rb
# rake package
# gem install --local pkg/passenger-3.9.3.rc1.gem

再度 passenger-install-apache2-module を試してみると、確かに先ほどのエラーは解消したのですが、今度は何度やっても「Checking for Rake Found: no」が消えてくれません。
Rake をアップデートしても駄目。
これは私の環境固有かも知れませんが、結局解消法はよくわからず・・・。

仕方がないので、以下のように直接 Rake のタスクを実行しました。

# cd /usr/local/lib/ruby/gems/2.0.0/gems/passenger-3.9.3.rc1
# rake apache2

これでビルドが成功し、mod_passenger.so が生成されたようです。

Passenger の動作確認

それでは Passenger が正常に動くか試してみます。
まずは Apache に読み込ませるための設定を追加します。

# vi /etc/httpd/conf.d/passenger.conf

内容は以下のようになります。

LoadModule passenger_module /usr/local/lib/ruby/gems/2.0.0/gems/passenger-3.9.3.rc1/libout/apache2/mod_passenger.so
PassengerRoot /usr/local/lib/ruby/gems/2.0.0/gems/passenger-3.9.3.rc1
PassengerRuby /usr/local/bin/ruby

rake apache2 でビルドした場合、 passenger-install-apache2-module と異なり生成されたモジュールのパスなどが表示されないため、その辺りは自分で調べる必要があります。

Apache 側にちゃんとモジュールとして認識されたかを確認します。

# apachectl -M | grep passenger
 passenger_module (shared)
Syntax OK

問題なさそうですね。
次に実際に動かしてみるためサンプルアプリケーションを作成します。

必要なライブラリをインストールします。

# yum install -y sqlite3-devel
# gem i rails --no-rdoc --no-ri
# gem i bundler -v '1.3.0.pre' --no-rdoc --no-ri

アプリケーションを作成します。
ここでは /var/apps というディレクトリを作成し、その下に作ることにしました。

# mkdir /var/apps
# cd /var/apps/
# rails new example --skip-bundle

作成したら Gemfile を編集します。

# cd example/
# vi Gemfile

therubyracer のコメントアウトを解除します。

gem 'therubyracer', :platforms => :ruby

bundle install を実行。

# bundle install --path=vendor/bundle

bundle のインストールが完了したら scaffold を生成して db:maigrate や assets:precompile を実行します。

# rails g scaffold post name:string title:string content:text deleted_at:datetime lock_version:integer
# RAILS_ENV=production bundle exec rake db:create
# RAILS_ENV=production bundle exec rake db:migrate
# RAILS_ENV=production bundle exec rake assets:precompile

ログが出ないなどのトラブルは面倒なので一旦ディレクトリ以下の権限は全部 apache ユーザに設定。

# chown -R apache:apache /var/apps/example/

Apache の設定ファイルを編集します。

# vi /etc/httpd/conf/httpd.conf

DocumentRoot を作成したアプリケーションの public ディレクトリに変更しました。

#DocumentRoot "/var/www/html"
DocumentRoot "/var/apps/example/public"

完了したら Apache を起動します。

# apachectl configtest
Syntax OK
# service httpd start

Apache が起動したらブラウザから以下の URL でアプリケーションの動作を確認します。

http://yourserver/posts

問題なく動作していれば完了です。

Passenger のインストールこそまだ面倒ですが、この程度のサンプルアプリであれば Ruby 2.0 でも全然問題なく動きました。
他の gem の互換性なども気になるので暫くはいろいろと触ってみたいと思います。