Pages

2011年10月10日月曜日

Ruby1.8.7とRuby1.9.2のWebApplicationをApacheで動かす

私のサクラVPSでは、いくつかのRailsアプリケーションが動いているが、それはRuby1.8.7ベースだ。
WebサーバにはApache(+ passenger module)を使い、VirtualHostで複数のWebアプリケーションを切り分けている。
さて、以前 開発用ユーザで Ruby1.9.2を試すためにrvmを導入した。
http://tech-baker.blogspot.com/2011/09/rvm-ruby-192-rails3.html
Apacheの実行環境では、デフォルトのruby1.8.7が動作してしまう。かといって、rvmをapache環境に導入したら、ruby1.8.7ベースのアプリケーションが動かない。ruby1.8.7もruby1.9.2もapache環境で動かしたい。以下のPassengerサイトを参考にチャレンジした。
http://blog.phusion.nl/2010/09/21/phusion-passenger-running-multiple-ruby-versions/

目指した環境は以下の図の通り。Apacheは、リバースプロキシとして利用され、ruby1.9.2のアプリケーションは、Passengerスタンドアローンで動かす。

図:Reverse Proxyを利用した複数Versionのruby Web app
Apache + passenger ----- app1.sample.com (ruby 1.8.7 + rails2.8.x)
Apache + passenger ----- app2.sample.com (ruby 1.8.7 + rails2.8.x)
Apache + mod_proxy ----- passenger ----- app3.sample.com ( ruby 1.9.2 + rails3 by rvm)


rails3アプリケーションは、開発ユーザdevmanのディレクトリ /home/devman/public_html/app3 に作成した。
rvm環境が出来ていることを前提で、作業は以下の手順
  1. passenger(スタンドアローン)のインストール
  2. apacheのプロキシー設定
  3. 起動スクリプト作成
  4. (必要であれば)iptablesをいじる

passengerのインストールはgemから行う。開発ユーザ環境も示しておいた。
devman$ rvm info
ruby-1.9.2-p290:

  system:
    uname:       "Linux www.miyabiit.com 2.6.18-274.3.1.el5 #1 SMP Tue Sep 6 20:13:52 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux"
    bash:        "/bin/bash => GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)"
    zsh:         " => not installed"

  rvm:
    version:      "rvm 1.8.3 by Wayne E. Seguin (wayneeseguin@gmail.com) [https://rvm.beginrescueend.com/]"

  ruby:
    interpreter:  "ruby"
    version:      "1.9.2p290"
    date:         "2011-07-09"
    platform:     "x86_64-linux"
    patchlevel:   "2011-07-09 revision 32553"
    full_version: "ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]"

  homes:
    gem:          "/home/devman/.rvm/gems/ruby-1.9.2-p290"
    ruby:         "/home/devman/.rvm/rubies/ruby-1.9.2-p290"

  binaries:
    ruby:         "/home/devman/.rvm/rubies/ruby-1.9.2-p290/bin/ruby"
    irb:          "/home/devman/.rvm/rubies/ruby-1.9.2-p290/bin/irb"
    gem:          "/home/devman/.rvm/rubies/ruby-1.9.2-p290/bin/gem"
    rake:         "/home/devman/.rvm/gems/ruby-1.9.2-p290/bin/rake"

  environment:
    PATH:         "/home/devman/.rvm/gems/ruby-1.9.2-p290/bin:/home/devman/.rvm/gems/ruby-1.9.2-p290@global/bin:/home/devman/.rvm/rubies/ruby-1.9.2-p290/bin:/home/devman/.rvm/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/lib/jvm/java/bin:/usr/local/ant/bin:/home/devman/bin"
    GEM_HOME:     "/home/devman/.rvm/gems/ruby-1.9.2-p290"
    GEM_PATH:     "/home/devman/.rvm/gems/ruby-1.9.2-p290:/home/devman/.rvm/gems/ruby-1.9.2-p290@global"
    MY_RUBY_HOME: "/home/devman/.rvm/rubies/ruby-1.9.2-p290"
    IRBRC:        "/home/devman/.rvm/rubies/ruby-1.9.2-p290/.irbrc"
    RUBYOPT:      ""
    gemset:       ""

devman$ gem install passenger --pre  # rvm 環境下なので userディレクトリにインストール

あれ、nginxもインストールされるのか。nginx(エンジンエックス、高速軽量で人気のWebサーバ)がスタンドアローンのwebサーバの役割を果たし、結局passenger本体はあくまでモジュールなのね。

ApacheにVirtualhostの設定を、reverse proxy仕様で追加する。
<VirtualHost *:80>
  ServerName app3.sample.com
  DocumentRoot /home/devman/public_html/words/public
  PassengerEnabled off
  ProxyPass / http://127.0.0.1:3000/
  ProxyPassReverse / http://127.0.0.1:3000/

</p>

起動スクリプトは、私は /etc/rc.d/app3をつくり、/etc/rc.localに追加した。これで良かったのかな。停止とかはKillしよう。chmod +x /etc/rc.d/app3を忘れないこと。

起動スクリプト:/etc/rc.d/app3
#!/bin/sh
su - devman -c 'cd public_html/app3;passenger start -a 127.0.0.1 -e development -p 3000 -d'
開発環境で実行している。
これで、Apacheを再起動し、rails3のアプリケーションを起動すればよい。
devman$ sudo /etc/init.d/httpd restart
devman$ cd public_html/app3
devman$ passenger start -a 127.0.0.1 -e development -p 3000 -d

リバースプロキシーは、高速化、キャッシュ・サーバ、負荷分散など応用が広いが、こういった使い方も出来るのですね。

0 件のコメント:

コメントを投稿