さくらのレンタルサーバでramazeを動かしてみた

ramazeをさくらのレンタルサーバで動かしてみたので、その覚え書き。

ディレクトリ構造の決定

まず、ディレクトリ構造を決める。
ここでは、下記の構造で置くと仮定する。

~/www/hoge/
       + start.rb        #ramazeアプリのソース
       + lib/            #ramazeアプリが使うライブラリ一式の置き場
       + dispatch.cgi    #start.rb起動用CGI
       + .htaccess       #Apache設定ファイル
       + log/            #ログ置き場。"chmod 700 log"でWebから見えないようにしておく

この構造で、Webからは、http://<ユーザ名>.sakura.ne.jp/hoge/ でアクセスできるようにする。

インストール

最初、rubygemsを使ってローカル環境(Mac)にインストールして、必要なファイルをさくらにアップロードしようとした。しかし公開されているgemが古いのか、同梱されているサンプルがCGIでうまく動かない。そこで、直接 git のリポジトリからソースを取ってくる事にした。
まずは、http://git.or.cz/ から git のバイナリをダウンロードしてインストール。
続いて、以下のコマンドで最新のソースをインストール。

mkdir git
cd git
git clone git://github.com/manveru/ramaze.git
cd ramaze
rake gem
cd pkg
sudo gem install -l ramaze

私のローカル環境の場合、以下のディレクトリにソース一式が格納されたので、そのソース一式をさくらのレンタルサーバ上にアップロード。

/usr/lib/ruby/user-gems/1.8/gems/ramaze-2008.08.17/lib/

私の場合は、ローカル環境にもramazeをインストールしたかったので、gemでインストールした。ローカル環境にインストール不要なら、gitでソースを取ってきたあと、ramaze/libディレクトリ以下のソース一式を直接アップロードしても良いと思う。
アップロードしたソース一式は、~/www/hoge/lib/ 以下に置いておく。

start.rb

Ramazeアプリケーションのソース。ファイル名は何でも良いが、ファイル名を変えた場合は、それに合わせて dispatch.cgi も変える必要がある。
ここでは例として、Ramazeに同梱のサンプルsimple.rbを参考に、動作確認用に作ったサンプルアプリを載せておく。

require 'ramaze'

class SampleController < Ramaze::Controller
  engine :Erubis
  map '/'
  layout :layout

  def index
    %{
<a href='input'>input</a><br/>
<a href='view_request'>view request</a><br/>
<a href='sum/2/5'>2+5</a><br/>
<a href='other'>Hello</a><br/>
<a href='other/now'>now</a><br/>
    }
  end

  def input
    @title = '入力してね'
    @default_value = 'デフォルト'
    %{
<form action="output" method="post">
  パラメータ:<input type="text" name="input" value="<%== @default_value %>"/>
  <input type="submit" value="入力" />
</form>
    }
  end

  def output
    @title = '入力を受け付けました'
    %{
入力: <%== request[:input] %>
     }
  end

  def view_request
    request.inspect
  end
  deny_layout :view_request

  def sum first, second
    first.to_i + second.to_i
  end

  def layout
    %{
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>sample</title>
  </head>
  <body>
    <h1><%== @title %></h1>
    <%= @content %>
  </body>
</html>
    }
  end
end

class OtherController < Ramaze::Controller
  map '/other'

  def index
    "Hello, World from #{self.class.name}"
  end
  
  def now
    "Hi, it's #{Time.now} now."
  end

end

Ramaze.start

今回は、このサンプルを使って動作確認した。
なお、このサンプルを動かすにはErubisが必要なので、Erubisのソース一式も ~/www/hoge/lib/ 以下に置く。
Erubis: fast and extensible eRuby implementation - kuwata-lab.com

dispatch.cgi

http://ramaze.net/deploying#public-dispatch.cgi
ramazeのドキュメントに書いてあるdispatch.cgiは古いようなので、以下のように書き直したものを使った。ついでに、ディレクトリ構造に合わせて、少し手直しもした。

#!/usr/local/bin/ruby
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/lib")

require 'ramaze'

Ramaze::Global.adapter = :cgi
Ramaze::Log.loggers = [ Ramaze::Logger::Informer.new( File.join(__DIR__, 'log', 'ramaze.cgi.log') ) ]

$0 = File.join(File.dirname(__FILE__), 'start.rb')

require $0

Ramazeアプリケーションのソースファイル名を 'start.rb' 以外に変えた場合は、dispatch.cgi中のソースファイル名も書き換えることに注意。

.htaccess

http://ramaze.net/deploying#htaccess
これもramazeのドキュメントを参考にした。さくらの環境に合わせて、一部コメントアウトしたり、ErrorDocumentの記述を変えた(末尾の"を削除)。

# General Apache options
#Options +FollowSymLinks +ExecCGI
#AddHandler cgi-script cgi rb

# Redirect all requests not available on the filesystem
# to Ramaze. By default the cgi dispatcher is used which
# is very slow. For better performance replace the
# dispatcher with the fastcgi one

RewriteEngine On
RewriteBase /hoge
#RewriteRule ^$ index.html [QSA]
#RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ dispatch.cgi/$1 [QSA,L]

# In case Ramaze experiences terminal errors.
# Instead of displaying this message you can supply a
# file here which will be rendered instead.
#
# Example:
#   ErrorDocument 500 /500.html

ErrorDocument 500 "<h2>Application error</h2>Ramaze failed to start properly

RewriteBaseの「/hoge」の所は、ディレクトリ構造に合わせて記述を変える必要があるので、注意。

動作確認

以上で配置は終了。http://<ユーザ名>.sakura.ne.jp/hoge/ でWebブラウザからアクセスできるはず。
うまくいかないときは、ruby -I./lib start.rb や ruby -I./lib dispatch.cgi(起動後、Ctrl-Dを押す) で直接アプリを起動して、コンソールやログにエラーメッセージなどが出ていないか確認する。