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)