nginx + Passenger + Linuxを動かしてみた

お疲れさまです。ただ今、Herokuのありがたさとインフラの偉大さを大変噛み締めております。

環境

Linux debian 2.6.32-5-amd64
Phusion Passenger version 3.0.19

Passengerとは

フルネームはPhusion Passengerで、あのApacheとあのnginxにあるモジュールのこと。
Passengerは、RackアプリケーションとWEBサーバを繋ぐパイプのような動きをする。
何が嬉しいかというと、アプリケーションサーバを用意する必要がなくなるということ。あと、運用に優しい設計らしい。
(UnicornとPassengerはよく対比されるけど、Unicornは自分でコードを書く必要が出てくるだとか。Passengerはそういうのはないらしい。)

動作的な話をすると今までは、WEBサーバにリクエストがあると、WEBサーバはアプリケーションサーバに専用のプロトコルで通信する。レスポンスは逆の経路でクライアントに返していた。
Passengerを使うと、WEBサーバから(たぶん)直接Rackアプリケーションを叩けるらしくアプリケーションサーバいらないって話らしい。イメージ的にはそんな感じ。

Passenger開発の背景には、アプリケーションが増えるとサーバが増えて煩雑になるからという経緯があるとかどこかに書いてた。

使えるようになるだいたいの手順

Passengerをインストール

ぼくの環境ではrvmを使っています

$ gem install passenger

nginxはpassengerをインストールする時に自動で入れてくれるのでこちらで用意する必要はない。

nginxをインストール
$ rvmsudo passenger-install-nginx-module

インストールディレクトリは聞かれるけどほぼ自動で進めてくれてラクチンなのだけど、
ここがかなりの肝。
『1回しか見せないからな!』的なpassengerのパスが2行出てくる。その2行をnginx.confのhttpディレクティブに書く必要があるので見逃さないようにしたい。

nginx.confを修正

修正点は、インストール中に表示される下記のパスをhttpディレクティブに追加。

passenger_root /usr/lib/ruby/gems/1.8/gems/passenger-3.0.19; 
passenger_ruby /usr/bin/ruby1.8; 

serverディレクティブに追加。これは必須。

passenger_enabled on;

Rackアプリケーションのpublicを指定するrootディレクティブを追加。

root /home/vagrant/rails/sample_rack/public;

適当なnginx.conf最小構成を下記に。

http{
  passenger_root /usr/lib/ruby/gems/1.8/gems/passenger-3.0.19; 
  passenger_ruby /usr/bin/ruby1.8; 
  
  server{
    listen 80;
    server_name localhost;  
    passenger_enabled on;
    root /home/vagrant/rails/sample_rack/public; 
  }
}

ここで注意したいのはlocationディレクティブを作らないこと。
locationディレクティブを作ると何事もなくnginxは再起動しブラウザでは403が出る。まじで辛い。

ちなみに今回は、gemの依存エラーで進まないとか本質じゃないしだるいしそういうのは嫌だったしPassengerの動作確認ということで最小のRackアプリケーションでやってみた。

最小のRackアプリケーションでPassengerする