Rackup した環境を FastCGI で回す

IRC ログの Web 用フォーマッタを Ruby で書いたので、それを Rackup して Lighttpd に載せたときのメモ。Rackup した環境を FastCGI で動かしている例が見つけられなかったので書いとく。

Rack::Builder の戻り値も callable なので、Rack::Handler::FastCGI.run の引数に与えることができる。なんでソース読むまでこれに気づかなかったんだろう。

irclog-rackup.fcgi

#!/usr/bin/ruby

require 'rubygems'
require 'fcgi'
require 'rack'
# nadoka のログを HTML に整形
require 'irclog_app.rb'
# nadoka のログを HyperEstraier で全文検索
require 'finder_app.rb'

# callable を Rack::Builder で Rackup したものも callable である
app = Rack::Builder.new do
  # ログは Lighttpd がとる
  #use Rack::CommonLogger
  # 転んでも泣かない
  #use Rack::ShowExceptions
  # 運用環境では遅いから使わない
  #use Rack::Reloader

  # prototype.js とか使ってるので JavaScript 置き場を指定
  use Rack::Static, :urls => ["js"]

# lighttpd で設定するので不要
#  use Rack::Auth::Basic do |username, password|
#    case username
#    when "********"
#      password == "********"
#    end
#  end

  # ログビューア携帯版
  map "/m" do
    run IrclogAppKtai.new
  end

  # ログ全文検索
  map "/find" do
    run LogFinderApp.new
  end

  # ログビューア PC 版
  map "/" do 
    run IrclogApp.new
  end
end 

Rack::Handler::FastCGI.run app

/etc/lighttpd/conf-enabled/10-ssl.conf

  $HTTP["url"] =~ "^/irclog" {
    auth.backend = "htpasswd"
    auth.backend.htpasswd.userfile = "/etc/lighttpd/passwd/irclog"
    auth.require = ("/irclog" => (
      "method" => "basic",
      "realm" => "RESTRICTED",
      "require" => "user=********"
    ))
    fastcgi.server = ( "/irclog" =>
      ( "localhost" =>
	( "bin-path" => "/var/www/ssl/irclog/irclog-rackup.fcgi",
	  "socket" => "/tmp/irclog.socket",
	  "check-local" => "disable",
	  "broken-scriptfilename" => "enable"
	)
      )
    )
  }