WEBrickを使って、RubyCGIをローカル上でプレビューする方法を紹介します。前にTwinCalを作った時にこの方法を覚えました。

ApacheはC言語で書かれていているためにパフォーマンスが良いので本番環境ではApacheを採用しましたが、 ローカルでテスト用に使うにはWEBrickでちょろっとサーバを立てるのが良いですよね、そうしましょう。

テスト環境(ローカル) :WEBrick

本番環境(サーバ) :Apache

あとは、rsyncとかでファイルを同期できるようにしたら完璧。

1. Rubyのパスを本番環境とテスト環境で統一する

Rubyのパスを本番環境とテスト環境で統一するために、 /usr/bin/rubyのシンボリックリンクをrvmなどで入れたRubyに置き換えます。

mv /usr/bin/ruby /usr/bin/ruby-original
ln -s /Users/gam0022/.rvm/rubies/ruby-1.9.3-p194/bin/ruby /usr/bin/ruby

本番環境とテスト環境の両方で行います。

当然ですが、RubyのCGIではこのパスを1行目に指定します。

2. WEBrickを使う

WEBrickについて簡単に説明すると、RubyでWEBサーバを立てるためのライブラリです。 これをrequireすることで、10行くらいのコードを書くだけで簡易WEBサーバが完成します。

私の場合、次のようなpreview.rbを書きました。 WEBrickで.rbをAddHandlerする方法がなかなかわからなくて苦労しました。

require 'webrick'
include WEBrick

module WEBrick::HTTPServlet
  FileHandler.add_handler('rb', CGIHandler)
end

s = HTTPServer.new(
  :Port => 3000,
  :DocumentRoot => File.join(Dir.pwd),
  :DirectoryIndex => ['index.rb']
)
trap("INT") { s.shutdown }
s.start

このpreview.rbを公開したいディレクトリに設置し、 ターミナルでruby preview.rbをすれば、ブラウザでlocalhost:3000にアクセスすることで、 簡単にローカル上でCGIをテストすることができます。

おまけ: WEBrickでRequestURITooLargeが発生したときの対処方法

ApacheではURIの上限が大きいので、かなり長いURIを発行しても問題がないのですが、WEBrickでは2083byteの制限があるので、 CGIで長いURIを発行すると、RequestURITooLargeというエラーになってしまうことがあります。

これは、WEBrickのソースコードを書き換えることで対処できます。

私の環境では、/usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/webrick/httprequest.rbのL293に、 MAX_URI_LENGTHという定数があったので、これを書き換えることで対処できました。

291     private
292 
293     MAX_URI_LENGTH = 20830#2083 # :nodoc:
294 
295     def read_request_line(socket)

RubyでWebrick利用時にRequestURITooLargeエラー発生時の対処

Read more


ServersMan@VPS(Ubuntu)でRubyのCGIを実行するまでのメモです。

apache2をインストールする

apt-getかaptitudeでインストールすればいいと思います。

sudo aptitude install apache2   

AddHandlerを設定する

/etc/apache2/mods-enabled/mime.confにAddHandlerを設定します。

#AddHandler cgi-script .cgiという行があるので、 見つけてコメントアウトを解除して、次のように書き換えればいいと思います。

AddHandler cgi-script .cgi .rb

Options +ExecCGIを設定する

/etc/apache2/sites-available/defaultでOptions +ExecCGIを設定します。

<Directory /var/www/html/>
    #Options Indexes FollowSymLinks MultiViews 
    Options Indexes FollowSymLinks MultiViews ExecCGI
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>

apache2を再起動する

上の2つのファイルを編集したら、apacheを再起動して設定を反映させます。

sudo /etc/init.d/apache2 restart    

Ruby CGIのパーミッションを755にする

cd /var/www/html
chmod 755 test.rb

これでたぶん動くようになります。

ね?簡単でしょ?

うまくいかないときは

/var/log/apache2/error.logのエラーメッセージを見ましょう。

Read more