それマグで!

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

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

railsをCGIモードで動かす。

Rack経由でfcgiで動くのなら、cgiでも動くんじゃね?

ruby on railsをCGIで動かす方が、開発時は便利そうだ。CGIで動かしてみる。

あっさり動く

これあっさり動くねぇ。

背景

fcgiだとキャッシュされすぎるので、開発には向いてないと判断。
そもそも、railsのアプリを動かすのに、ポート指定したり、自動起動設定したり、プロキシ入れたり面倒なんだよ。phpみたいにファイル置くだけで動いてほしい。
passengerとかは、一度動くと便利。だけど、インストール面倒だった。cgi最高

実験環境

で実験中

apache でcgiを有効にする。

railsが動かしたいディレクトリでcgiが動くように設定。たとえば以下の通り。

<Directory path/to/my/app>
  AllowOverride all 
  Options ExecCGI FollowSymLinks
</Directory>

.htaccessを設定する

RewriteEngine ON
RewriteBase /path/to/my/app/public/
RewriteRule ^.+$   dispatch.cgi [QSA,L]
AddHandler cgi-script  .cgi

fcgiとほとんど同じです。

dispatch.cgiを作る

ファイル名は名前は何でも良いん。.htaccessに指定した名前であれば良い。

#!/usr/bin/ruby
require 'rubygems'
require 'cgi'
require '../config/environment'

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]
    #env['PATH_INFO'] = env["PATH_INFO"].sub(%r"^/book", "")
    env['QUERY_STRING'] = parts[1].to_s
    @app.call(env)
  end
end

Rack::Handler::CGI.run  Rack::PathInfoRewriter.new(Book::Application)

これもfcgiとほとんど同じ。

これだけ。

cgiが動くだけでいい。なんだコレ便利。


railsディレクトリだけを入れてるだけで良いですね。.htaccessをpublicに入れてればそれでいいですね。

一応環境確認のための virtualhost 設定

virtualhost 設定はこんな感じ。

<VirtualHost *:80>
  DocumentRoot /var/www/air.example.jp
  ServerName air.example.jp
  RailsEnv development
  RailsBaseURI /rails/book/public
  Alias  /book/  /var/www/air.example.jp/rails/book/public/
  <Directory /var/www/air.example.jp/rails/book/public>
   AllowOverride all
   Options ExecCGI FollowSymLinks
   Options -MultiViews
  </Directory>
</VirtualHost>

一部passengerの設定が混じってるけど気にしない。

Rackが対応してればRailsのベースは何でもいいみたい

rackで抽象化されているので、Railsはなんでもいいや。動作速度も大事だけど。。。。

railsの魅力は、開発速度だよね?

ITシステムにおいて一番大事なのはコスト。コストの中では一番高い物は何か。プログラムの実行時間でも、待ち時間でも、ない。
実行速度よりも大事なものがある。簡単なデプロイ?、いいや開発時の人件費。人的コストだよね。だから、簡単にコピーして移動できる方が良い。railsは開発サーバー内蔵なのでその点が楽。であれば、コピーして簡単に動かせる方が良い。PHPとかほかのシステムもカラムなら、proxyよりCGIが手軽に管理できて良いと思ったり。