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にアクセスすればエラーはでなくなる。