RackはRubyのためのWebサーバインターフェイスだ。

RubyでWebっていうとRailsが有名だけど、実はRails以外にもいろんなRuby用のWebアプリ用フレームワークが存在する。

Ramaze

Merb

Camping

Waves

などなど…。

一方Webを実際に動かすにはWebサーバが必要だ。RubyのためのWebサーバも、これまたいろんなものがある。

Apache(CGI, FastCGI..)

WEBrick

Mongrel

Ebb

Thin

などなど…。

ここで問題が一つ。それは「フレームワークが増えるたびに、いろんなサーバをサポートするためのコードが必要になる」ってとこだ。 各フレームワークの作者がみんなそれぞれにCGIやMongrelに対応するためのコードを書いてるなんて、無駄だと思わないか？

RackはWebアプリ用のフレームワークと、Webサーバの間を取り持ってくれるライブラリだ。

[ブラウザ] [Webサーバ] [フレームワーク] * IE * Apache * Ramaze * Firefox <=> * WEBrick <=> [Rack] <=> * Merb <=> [Webアプリ] * Safari * Mongrel * Camping * ... * ... * ...

フレームワーク作者はRackにだけ対応しておけば、Apache/WEBrick/Mongrelなど いろんなサーバがすぐに使えるようになる。逆にWebサーバの作者も、 Rackにだけ対応しておけばRack/Merb/CampingなどいろんなWebアプリ用フレームワークから すぐに使ってもらえるようになる。

というわけで、これからRuby用のWebアプリ用フレームワークやWebサーバを書こうとするなら Rackは間違いなくチェックすべきライブラリだ。 そうでなくて、単にWebアプリを作りたいだけの場合でも、「超シンプルなWebアプリ用 フレームワーク」としてRackを使うという選択肢もあるだろう。

3分で使ってみるRack

まずはインストール。

$ gem install rack

hello.rbを用意。

require 'rubygems' require 'rack' class HelloApp def call(env) [200, {"Content-Type" => "text/plain"}, ["Hello, Rack"]] end end

hello.ruを用意。

require 'hello' run HelloApp.new

サーバを起動。

$ rackup hello.ru

ブラウザで http://localhost:9292/ にアクセスしてみよう。「Hello, Rack」と 表示されたはず。

どう、簡単でしょう？

rackupのオプションでポートとかサーバとかいろいろ設定できる。詳しくは rackup --help で。

Rackの思想

「Webアプリって要するにリクエストをレスポンスに変換するだけの関数だよねー」 ってのがRackの基本っぽい。

なので、

env(環境変数のハッシュ)を受け取って

ステータスコードとHTTPヘッダとHTTPボディを返す

ような関数を書けばWebアプリになります。

だけどこのままだとさすがに使いにくいんで、 Rack::RequestとRack::Responseという補助クラスも用意されています。 これを使うと、「Webアプリ＝RequestをResponseに変換する処理」となる。

ミドルウェア

Rackではさらに、「Responseを別のResponseに変換する処理」も扱えるようになっています。例えば ruファイルで

require 'hello' use Rack::ShowExceptions use Rack::CommonLogger use Rack::Auth::Basic {|user, pass| user == 'alibaba' and pass == 'open sesame'} run HelloApp.new

のように書くと、Webアプリで起きた例外を綺麗に表示してくれたり、Apache形式のログを出力したり、Basic認証をかけてくれたりします。 つまり、ラック(棚)にサーバを追加するみたいに機能を追加することができる。

もっと詳しく知りたくなったら

でどうぞ！