Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
2009-05-08

Sinatraをさくらインターネットで動かしたときのメモ

さくらインターネットにてSinatraをCGIで動かすときのメモ。

自前でインストールしたrubyとgem環境にsinatraをインストール。

 gem install sinatra

準備完了。

start.cgi

#!/home/ユーザー名/local/ruby/bin/ruby
require 'rubygems'
require 'sinatra'

get '/hi' do
  'hi!'
end

get '' do
  'Hello Sinatra!'
end

set :run => false, :environment => :production
Rack::Handler::CGI.run Sinatra::Application

.htaccess

start.cgi を置くディレクトリに .htaccess を作成する。

DirectoryIndex start.cgi

RewriteEngine On
RewriteBase /sinatra
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) start.cg/$1 [L]

mod_rewriteの設定はよく理解していないが、とりあえずこれで動いた。 RewriteBaseは start.cgi を http://dgames.jp/sinatra/ で動かすなら、「/sinatra」と書けばいいみたい。

「Errno::ESPIPE - Illegal seek」対策

※使用しているバージョンは sinatra (0.9.1.1), rack (0.9.1)

CGIをそのまま動かすと「Errno::ESPIPE - Illegal seek」というエラーが発生したので、 ここを参考に 「~/local/ruby/lib/ruby/gems/1.8/gems/rack-0.9.1/lib/rack/request.rb」を書き換える。

以下はオリジナルのスクリプト(編集前のrequest.rbをrequest.rb.origという名前でコピーしたもの)と書き換えたスクリプトのdiff。

$ cd ~/local/ruby/lib/ruby/gems/1.8/gems/rack-0.9.1/lib/rack/
$ diff request.rb.orig request.rb
116c116,119
<           @env["rack.input"].rewind if @env["rack.input"].respond_to?(:rewind)
---
>           begin
>             @env["rack.input"].rewind if @env["rack.input"].respond_to?(:rewind)
>           rescue Errno::ESPIPE
>           end

上の箇所を編集した後、cgiにアクセスすればエラーはでなくなる。