小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


Ruby on Rails2.2の環境でgateway.cgiを使ってみた。(ON さくらインターネット)

はじめに

さくらインターネットのレンタルサーバでは、サーバに常駐するようなプログラムの利用を規約で禁止しているため、Ruby On Railsを高速に動作させるFastCGIが使えない。このため、FastCGIを使わずにRailsを高速に動作させることのできるgateway.cgiを試してみた。

普通にRuby on RailsをCGI(dispatch.cgi)で動かすと遅すぎてやってられませんが、gateway.cgiを使うと、そこそこの速度で動くようになります。

最初に仕掛けを紹介してしまうと、1回目のアクセスがあったときに常駐プロセスを起動し、2回目以降のアクセスはその常駐プロセスに処理させるようになっています。CGI自体は常駐プロセスに処理を投げるだけなので軽い、というわけです。ただし、1回目のアクセスは通常通りCGIで動作させたくらいの遅さです。

常駐プロセスは一定時間アクセスがないと自動的に終了するので(次のアクセスがあったときにまた起動する)、いろいろ制限のある環境でも使える、かもしれません。
CGIでRailsをまともに動かす - 古橋貞之の日記 はてなブックマーク - CGIでRailsをまともに動かす - 古橋貞之の日記

gateway.cgiのインストール

以下の設定内容については、以下のエントリを参考にした。

自分の環境を確認
%ruby -v
ruby 1.8.6 (2008-08-11 patchlevel 287) [i386-freebsd6]
%rails -v
Rails 2.2.2
%gem18 -v
1.3.1
fcgiのダウンロードとインストール
%cd src/
%wget http://fastcgi.com/dist/fcgi-2.4.0.tar.gz
%tar zxvf fcgi-2.4.0.tar.gz
%./configure --prefix=$HOME/local
%make
%make install
gateway.cgiインストール
gem18 install fcgi -- --with-fcgi-include=$HOME/local/include --with-fcgi-lib=$HOME/local/lib

僕の環境では以下のようなエラーになった。

make install
/usr/bin/install -c -o root -g wheel -m 0755 fcgi.so /home/XXX/lib/ruby/gem/gems/fcgi-0.8.7/lib
install: /home/XXX/lib/ruby/gem/gems/fcgi-0.8.7/lib/fcgi.so: chown/chgrp: Operation not permitted
*** Error code 71

調べてみると、root権限でユーザディレクトリにインストールしようとしていたのが原因らしい。

gem isntall すると

/usr/bin/install -c -o root -g wheel -m 0755 xxx.so

などと、root権限でファイルを(ユーザーのディレクトリに)インストールすることがあり、さくらのレンタルサーバではもちろんroot権限なんてもらえないからインストールは失敗する。
さくらのレン鯖でrubygemsがインストールできない場合 - きたももんががきたん。 はてなブックマーク - さくらのレン鯖でrubygemsがインストールできない場合 - きたももんががきたん。

したがって、setenv RB_USER_INSTALL trueを実行してから、再度実行する。

%setenv RB_USER_INSTALL true
%gem18 install fcgi -- --with-fcgi-include=$HOME/local/include --with-fcgi-lib=$HOME/local/lib
Building native extensions.  This could take a while...
Successfully installed fcgi-0.8.7
1 gem installed

これでインストールは成功。

gateway.cgiをRailsプロジェクトに適応させる

新規プロジェクトの作成

※XXXの部分は、ユーザID。

%mkdir Rails #Rails用のディレクトリの作成
%cd Rails
%rails Bookmark -d mysql #MySQL用の新規プロジェクトを作成
%cd Bookmark
2009.03.23追記

ログディレクトリの設定が抜けていたので追加しました。

%mkdir log/drb_gateway
%chmod 777 log/drb_gateway

%setenv RAILS_DIR /home/XXX/lib/ruby/gem/gems/rails-2.2.2
%cp $RAILS_DIR/dispatches/gateway.cgi public/
↑※dispatchersではなく、dispatchesとなっている。

%cp $RAILS_DIR/lib/commands/ncgi/listener script/
%cp $RAILS_DIR/lib/commands/ncgi/tracker script/
%chmod 755 public/gateway.cgi
/Rails/Bookmark/script/listerの編集

/Rails/Bookmark/script/listerを以下のように編集する。※これ以外のファイルは、編集する必要がなかったので、省略する。

1. require 'fcgi_handler'の前に以下を挿入する。

require 'rubygems'
gem 'fcgi'

2. initialize関数の定義、RemoteCGIクラスのdef initialize〜の箇所において、self.stdoutput = output || StringIO.newの後ろに、以下を挿入する。

$stdin = self.stdinput
$stdout = self.stdoutput
public/.htaccessの編集

public/.htaccessを以下のように編集する。

RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
↓
RewriteRule ^(.*)$ gateway.cgi [QSA,L]

これで設定は完了。作成したアプリケーションにアクセスしてみれば、その速さを体感することができる。