RVMでRails2環境とRails3環境を共存させる

RVMとかRubiesとかBundlerとか、いろいろあって訳わかんないけど、
とりあえずApache + RVM + Nginxが一番楽かなという印象。
(Rails3アプリを管理するのにBundlerも使うけど)
 
80番ポートを受け付けるのはApache。
そのApacheがプロキシになって、後ろのNginx(80番ポート以外で起動)に転送する。
RubyとGemsetの数だけNginxを起動させなきゃいけないけど、多分これが最小。
Nginxを使わずにスタンドアローンのPassengerにプロキシで接続してもいいかも知れないけど、ポートの管理が面倒になりそうだからNginxを使った。
 

RVMをインストール

bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)

 

Ruby1.8.7とRails2.3をインストール

Nginxのインストールディレクトリは、
/usr/local/rvm/nginx/ruby-1.8.7-p358@rails23
を指定する。
Rails2を動かすにはRubyGemsが新し過ぎるから、ダウングレードする。

rvm install 1.8.7
rvm use 1.8.7
rvm gemset create rails23
rvm use 1.8.7@rails23
gem install rails -v 2.3.14
gem install passenger
rvmsudo passenger-install-nginx-module
gem update --system 1.6.2

 

Ruby1.9.3とRails3.2をインストール

Nginxのインストールディレクトリは、
/usr/local/rvm/nginx/ruby-1.9.3-p125@rails32
を指定する。

rvm install 1.9.3
rvm use 1.9.3
rvm gemset create rails32
rvm use 1.9.3@rails32
gem install rails
gem install passenger
rvmsudo passenger-install-nginx-module

 

Nginxの設定

/usr/local/rvm/nginx/ruby-1.9.3-p125@rails32/conf/nginx.conf を編集。
passenger_rootとpassenger_rubyはRubyとGemsetのペアに合わせる。
複数のNginxでlistenするポートが被らないようにする。
今回は8 + Rubyのバージョンとした。

http {
    passenger_root /usr/local/rvm/gems/ruby-1.9.3-p125@rails32/gems/passenger-3.0.11;
    passenger_ruby /usr/local/rvm/wrappers/ruby-1.9.3-p125@rails32/ruby;

    server {
        listen       8193;
        server_name  app1.example.com;
        root /somewhere/public;
        passenger_enabled on;
    }
}

 

Apacheの設定

80番ポートで待ち受けているApacheにプロキシの設定をしてリクエストをNginxへ渡す。

<VirtualHost *:80>
  ServerName app1.example.com
  ProxyPass / http://127.0.0.1:8193/
  ProxyPassReverse / http://127.0.0.1:8193/
  ProxyPreserveHost On
</VirtualHost>

 

Railsアプリが増えたら

Railsのバージョンに対応するNginxの設定にserver{}を追加してVirtualHostを増やす。
ApacheのNginxへプロキシ設定したVirtualHostにServerAliasを追加する。