Rackについて調べてみた(1)

unicornはRackインターフェースに対応したHTTPサーバです」って書いてあったけど、 「Rackって何?」って感じなので調べてみた。大した内容じゃないですが。

Rackとは

以前は、動的なWebコンテンツを作る際には、CGIが使われていたそう。
しかし、

Webサーバー側で動作するプログラムがすべての処理を担当するため、多数のクライアントから処理要求が集中すると、どうしても処理が遅くなってしまいます。要求ごとにプログラムが起動されるため、サーバーの負荷が大きくなるのです。 http://www.grapecity.com/japan/powernews/column/web_app/009/page04.htm

とのこと。
そこで、CGIではなく、もっとフレームワークとWebサーバが深く連携するものが出てきた。

しかし、フレームワークとWebサーバ側が独自の仕様にすると、連携が片方に依存してしまう。
(例えば、このフレームワークを使うには、このサーバは使えないなど)

そこで、Rackが登場した。
Rackは、アプリケーションサーバフレームワークをつなぐインタフェイス。
Rackに対応しているサーバやフレームワークであれば、
組み合わせを自由に選べることになった。すごい!!

Rackを使ってみる

Rackは、Webアプリケーションに必要な最低限のインタフェイスを定めている。
ちなみに、Rackに対応したものをRackアプリケーションと呼ぶ。つまり、RailsもRackアプリケーション。

Rackのインタフェイスであるには、

  • callメソッドをもっていること
  • callメソッドは引数として、Webサーバからのリクエストを受けること
  • 返り値として、3つの要素(ステータス、ヘッダ、ボディ)をもつ配列を返すこと

である必要がある。逆に言えばこれだけ。
実例。

simpleapp.rb

class SimpleApp
  def call(env)
    p env
    case env['REQUEST_METHOD']
    when 'GET'
      [
        200,
        { 'Content-Type' => 'text/html' },
        ['<html><body><form method="POST"><input type="submit" value="見たい?" /></form></body></html>']
      ]
    when 'POST'
      [
        200,
        { 'Content-Type' => 'text/html' },
        ['<html><body>何見てんだよ</body></html>']
      ]
    end
  end
end

config.ru

require ‘./simpleapp'

run SimpleApp.new

以下で実行する

$ rackup

http://localhost:9292

で表示。

続きは、またこんど。

参考URL

http://gihyo.jp/dev/serial/01/ruby/0023 http://rack.rubyforge.org/doc/Rack.html