Circus+WEBrick+Rack+Sinatraを動かしてみる

前回の続き。
Circus+WEBrick+Rackを動かしてみる - 偏った言語信者の垂れ流し
Rackアプリケーションが動くんならSinatraでも動かしてみようってことで試してみた。

hello_sinatra.rb

サーバー部分は前回と同じ。
Sinatra::Application.newでRackアプリケーションを生成して使う。

require 'socket'
require 'webrick'
require 'webrick/utils'
require 'rubygems'
require 'rack'
require 'sinatra'

# WEBrickのサーバーをファイルディスクリプタからのSocketに対応させたもの
class FDHTTPServer < WEBrick::HTTPServer
  def initialize(config={})
    config[:DoNotListen] = true
    super(config)
    listen(config[:FD])
  end

  def listen(fd)
    sock = TCPServer.for_fd(fd)
    WEBrick::Utils::set_close_on_exec(sock)
    @listeners += [sock]
  end
end

# Sinatraアプリケーション
get '/' do
  "Hello Sinatra!\n"
end

server = FDHTTPServer.new({
  :FD => ARGV[0].to_i
})
server.mount "/", Rack::Handler::WEBrick, Sinatra::Application.new

['INT', 'TERM'].each {|signal|
  Signal.trap(signal){ server.shutdown }
}

server.start

RackのAPI部分の情報を見つけづらかったので、ソースコードを読んで書いてる。

hello_sinatra.ini

Circusの設定ファイル。前回と特に変わらず。

[circus]
check_delay = 5
endpoint = tcp://127.0.0.1:5555

[watcher:hello]
cmd = ruby hello_sinatra.rb $(circus.sockets.web)
use_sockets = True
numprocesses = 5

[socket:web]
host = 0.0.0.0
port = 8000

実行

$ circusd hello_sinatra.ini
2012-07-20 07:04:35 [13345] [INFO] Starting master on pid 13345
2012-07-20 07:04:35 [13345] [INFO] sockets started
2012-07-20 07:04:36 [13345] [INFO] hello started
2012-07-20 07:04:36 [13345] [INFO] Arbiter now waiting for commands

curlで動作を確認。

$ curl http://127.0.0.1:8000/
Hello Sinatra!

WEBrick以外のサーバーも試せたら良いのだけど、大変そうだったのであきらめた。

参考

Sinatra