それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

rails をapache+fcgiで動かす。

Railsのために、ポート開けたり、リバースプロキシするのが面倒だし。PHPと同じようにファイル展開するだけで動いたら良いのに。

やってみたら動く。

調べたら動くことが分かった。

下準備

sudo aptitude install libapache2-mod-fcgid
sudo aptitude install libfcgi-dev 
sudo gem install fcgi

apachefcgiを入れてないときは、fcgiを入れる。rails持ってないときはrailsも入れてね。

実験環境

rails3.1
ruby 1.8.7
apache2
debian squeeze

そうですね。ポイントはrails3.1です。

設定の流れ

railsディレクトリの準備

rails new bookapp
rails generate home index
rails server -b 127.0.0.1

くらいですかね。ここまでやって起動確認はやっておくと後で切り分けが楽。

.htaccessを準備する。

public/.htaccess に用意します。

AddHandler fastcgi-script .fcgi
RewriteEngine ON
RewriteBase /book/
RewriteRule ^.+$   dispatch.cgi [QSA,L]

上で指定したdispatch.cgi

実際にRailsを起動する dispatch.fcgiruby

fcgirailsを起動するためのdispatch.rb

#!/usr/bin/ruby
require 'rubygems'#ruby 1.8
require 'fcgi'# ruby1.8
require '../config/environment’ #ruby1.8

class Rack::PathInfoRewriter
  def initialize(app)
    @app = app
  end
  def call(env)
    env.delete('SCRIPT_NAME')
    parts = env['REQUEST_URI'].split('?')
    env['PATH_INFO'] = parts[0]
  #必要に応じてPATH_INFOを書き換える
    #env['PATH_INFO'] = env["PATH_INFO"].sub(%r^/path/to/my/rails/public", "")
    env['QUERY_STRING'] = parts[1].to_s
    @app.call(env)
  end
end
Rack::Handler::FastCGI.run  Rack::PathInfoRewriter.new(YOURAPPNAME::Application)

PATH_INFOは、Railsを展開したいディレクトリに応じて適当に切り詰めてください。

apacheの再起動。

fcgiが設定済みなら特に再起動不要。展開に失敗したときは必ずreloadする。

fastCGIの注意点

ruby設定ミスったりrailsにエラーがあると、再起動が必要です。

fastCGIはなぜFAST(速)なのか。

それはキャッシュするからだ。mod_fcgi + ruby の場合、rubyのスクリプトファイルを読み込んでキャッシュしてる。

ファイルキャッシュは、OSレイヤでやってる。fcgiはさらにバイナリキャッシュをする。バイナリはrubyスクリプトが実行可能形バイナリに変換されたもの


つまり、単純にfcgiを使ってると、 apache reload を頻繁にやらないと、バイナリが更新されない。


逆に、バイナリキャッシュをやめると、ファイルの更新が速反映されるが、Rubyの実行バイナリへの変換が遅いので、fcgiの恩恵にあずかれない。


ってことで、、、、

fcgiは enviroment => product 専用。

dev環境で使うには、、、開発中は頻繁にファイル更新がル。ファイル更新するとバイナリキャッシュがあるので色々めんどくさい。
バイナリキャッシュの恩恵に預かれない。なのでfcgiを使うことすら無駄。ちょっと考えれば分かることだった。お疲れ様オレ。


参考資料

Linuxなら素直にPassengerを使いましょう。もしくはmongrel(+mod_proxy(_balancer))で。

http://okwave.jp/qa/q5201582.html

どの辺が素直なんだか。。。これは嘘なのです。相変わらず、ドヤ顔のOKWAVEはむかつく。

Rails 3 is built on top of Rack and Rack provides a FastCGI handler.
http://rack.rubyforge.org/doc/
http://rack.rubyforge.org/doc/Rack/Handler/FastCGI.html

http://stackoverflow.com/questions/3296206/rails-3-and-fcgi

コレが正しい回答です。

railsは3.1の今でもfcgiで動きます。

そもそも、CGIやFastCGI駆動は今は推奨されていないみたいです。
(というか、RailsFastCGIを使うというのはどこで入手された情報でしょう?)

http://okwave.jp/qa/q5201582.html

上のちょっとドヤ顔の回答がむかついたのです。だからfcgiで動かした。
「非推奨はドコに書いてあった?」本家にはドキュメントが見当たらない。


OKWaveは第三者がみて間違ってるよと、添削したくても指摘する機能が無いので、どうしても記事が洗練されない。そのくせ、疑問点に対する回答して書かれてて、もっともらしく見えるので問題。

ちゃんとした参考資料

http://d.hatena.ne.jp/is0me/20090629/1246292165