RackとPassengerを初めて動かしたので、前回に引き続き作業メモ。

Rack

こちらの記事が簡潔にして必要十分にまとまっているので写経してみた。

インストール

% gem  install rack

実行

拡張子を.ruにしたRubyのコードを渡せばサーバとして動いてくれる。callメソッドを持ったクラスをrunメソッドに渡してやればいい。

hello.ru

class Hello
  def call(env)
    [200, {'Content-Type' => 'text/plain'}, ['Hello, Rack!']]
  end
end
run Hello.new
run Hello.new
% rackup hello.ru
[2010-06-17 20:26:14] INFO  WEBrick 1.3.1
[2010-06-17 20:26:14] INFO  ruby 1.9.1 (2010-01-10) [i686-linux]
[2010-06-17 20:26:14] INFO  WEBrick::HTTPServer#start: pid=11096 port=9292

これで9292番ポートで待ち受けしている状態。http://localhost:9292/ にアクセスすると、ブラウザには「Hello, Rack!」と表示されるはず。rackupしているコンソールにはログが出る。

192.168.*.* - - [17/Jun/2010 20:26:18] "GET / HTTP/1.1" 200 - 0.0010

…という具合。

理屈はこの辺にあるので読んでおくと黒魔術化を防げるのではないだろうか。

Passenger

Phusion PassengerはRuby on RailsをApache / Nginxで動かすためのモジュール。ドメイン名からもわかるとおり、もともとは「mod_rails」というプロダクト。mod_perlとかmod_phpに対してなら「mod_ruby」にすればいいのに…と思ったら、別のプロダクトとして存在するのか。

インストール

「passenger ruby」でググると日本語の情報ではここがトップ(2010-06-17)なのだが、ちょっと落ち着く必要がある。なぜならインストールしようとしている環境は、前回構築したRVMのRubyだからだ。

RVMの公式サイトにちゃーんと手順が乗っているので、きちんと読みながら作業しよう。

# Passengerで使うRubyを選択
% rvm 1.9.1 --passenger
# Passengerで使うRubyに切り替え
% rvm 1.9.1
# gemをインストール
% gem install passenger
# apache用モジュールをインストール
% rvmsudo passenger-install-apache2-module

最後のコマンドは対話式に進む。「この設定を書き足すんだよ」と教えてくれてるので、どこかにコピペしておく。

設定

apacheの設定ファイルにextra/passenger.confが追加されているので、さっきコピペした設定をもとに編集する。

PassengerDefaultUser   {user_name}
PassengerUserSwitching off
LoadModule passenger_module /home/{user_name}/.rvm/gems/ruby-1.9.1-p378/gems/passenger-2.2.14/ext/apache2/mod_passenger.so
PassengerRoot /home/{user_name}/.rvm/gems/ruby-1.9.1-p378/gems/passenger-2.2.14
PassengerRuby /home/{user_name}/.rvm/bin/passenger_ruby

1行目はPassengerが動作するユーザアカウントを指定する。理屈はこの辺に。RVMはユーザのホームにRubyをインストールしているので、RVMをインストールしたユーザ / apacheが動作するユーザ / Passengerが動作するユーザを揃えておくのがよいだろう。

実行

こちらを参考に、プロジェクトディレクトリを作り、httpd.confを設定する。

ディレクトリ構成

% cd /path/to/project
% tree ../
../
`-- project
    |-- config.ru
    |-- public
    `-- tmp

httpd.conf

<VirtualHost *:80>
   ServerName project.example.com
   DocumentRoot /path/to/project/public
</VirtualHost>

config.ru

run proc{|env| [200, {'Content-Type'=>'text/plain'}, ['Hello, Passenger!']]}

http://project.example.com/ にアクセスして「Hello, Passenger!」と表示されたらok。

まとめ

これでRuby + apacheでwebアプリを動かす準備が整った。あとはRailsなりSinatraなりでバリバリ開発していこう。

Rack

Passenger