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

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

2011年10月9日日曜日

Rubyの御気楽構造体クラス OpenStruct

OpenStructは、御気楽な構造体クラスで、予め定義しておかなくても、自動で属性を作成してくれます。

ずいぶん前に一度知ったのだが、クラスの名前をどうしても思い出せず検索できずに、利用したくても出来ない、とても歯がゆい思いをしていた。とっても便利なクラスである。

CodeRider:openstruct baker$ irb
>> require 'ostruct'
=> true
>> man = OpenStruct.new
=> #
>> man.name = 'masahiro'
=> "masahiro"
>> man.age = 200
=> 200
>> man.childs = %w(hanako taro)
=> ["hanako", "taro"]
>> p man
#

OpenStructをアプリケーションの初期設定に利用すると便利だ。
railsの場合、RAILS_ROOT/config/initializers/app_config.rbに以下のようなコードを書いておくと起動時に初期設定してくれる。

require 'ostruct'
AppConfig = OpenStruct.new

AppConfig.default_email = "no-reply@hoge.com"
AppConfig.api_url = "hoge.com"

ネタはここから
http://rubyquicktips.com/post/1718141794/use-openstruct-for-application-configuration-variables

2011年10月1日土曜日

PHP高速化のため APCを導入してみた

ブログエンジンとして非常に有名なWordPressを導入してみた。
さすがにインストールそのものは、とても簡単だったのだが、その時にサーバのメモリ不足問題が発生し、その対策として PHP-APC を導入したので、そのメモ。

php-apc

Alternative PHP Cashe
http://php.net/manual/ja/book.apc.php
phpの実行コードを高速化するためのPHPモジュールで、中間コードの最適化やキャッシュを提供する。

WordPressをインストールするまでの手順

# root になって、作業を進めました 
$ yum list installed | grep php
php.x86_64                               5.3.8-1.el5.remi              installed
php-cli.x86_64                           5.3.8-1.el5.remi              installed
php-common.x86_64                        5.3.8-1.el5.remi              installed
php-gd.x86_64                            5.3.8-1.el5.remi              installed
php-mbstring.x86_64                      5.3.8-1.el5.remi              installed
php-mysql.x86_64                         5.3.8-1.el5.remi              installed
php-pdo.x86_64                           5.3.8-1.el5.remi              installed
php-pgsql.x86_64                         5.3.8-1.el5.remi              installed

$ mysql -u root -p
Enter password: 
mysql> create database wordpress;
mysql> grant all on wordpress.* to wordpress@localhost identified  by 'xxxxxxx';

$ mkdir work
$ cd work/
$ wget http://ja.wordpress.org/wordpress-3.2.1-ja.zip
$ unzip wordpress-3.2.1-ja.zip 
$ cd /var/www/html/
$ cp -r ~/work/wordpress sample.com
$ chown -R apache:apache sample.com
$ cd sample.com
あとは、サイトにアクセスして画面の指示通りに進めるだけ。
この後、導入しているネットワーク監視システム Xymonから、メモリ不足の警告メールが。

予め、予想されていたので、本当はApacheから nginx (エンジンエックス)にWebサーバを変更することも考えていたのですが、先ずは APCを試してみることにしました。
注) 私は、PHP, mysql を remi リポジトリからインストールしているので、下の例のように apcも、remi指定のインストールです。
$ yum install php-pecl-apc --enablerepo=remi
$ /etc/init.d/httpd restart

導入効果は中々のもの。その間のメモリ状況のグラフを以下に表示します。

* 9/30 0時頃にメモリ不足
* その後、すぐにAPCを導入
* 9/30 早朝に画面を撮る