中島@ブレーンです。

> mod_perlだとPerlChildInitHandlerみたいにハンドラ毎にディレクティ
> ブを用意してますね。
> child_initのハンドラなんかは.htaccessで設定できてはいけないような
> 気がするので、mod_perl風に個別に設定する方法の方がよいのかなあ。

確かに.htaccessをいじるだけでプロセスの初期化をのっとられては困りますね。
これは気がつきませんでした。このようなお話しが出るということは、プロバイ
ダーのサーバーのように不特定多数のユーザにmod_rubyを解放することを考えて
いらっしゃるんですね。

私が考えていたのは、イントラネットのグループウエアとかECサイトのようなイ
メージで、WEBサーバが特定のアプリ専用で使われているという形です。両者は
分けて考えた方がいいと思います。

A) プロバイダー型
   管理者の知らない所で、ユーザが勝手にRubyスクリプトを書いて動かす場合
   性悪説での管理が必要なケース

B) 専用サーバ型
   管理者がそのサーバで動くスクリプトを把握している場合
   性善説での管理でよいケース

私は、A)の用途では従来のmod_rubyのインターフェース(シンプルにURLで指定さ
れたスクリプトを実行する)で充分ではないかと思います。だから、今回提案し
たようなメカニズムを追加するとしたら、B)のようなサイトを対象として、セキュ
テリティより機能を重視した方が意味があるのではないでしょうか?

PerlHandler方式より、ハンドラーオブジェクト方式([ruby-ext:01441]の提案を
仮にそう呼ばせてください)の方がよい事例として、次のようなケースがありま
す。

ECやオークションなど、ユーザとの対話のあるサイトを構築するとしたら、デモ
や練習の機能が必要になります。ハンドラーオブジェクトでは、次のようにきれ
いに解決できます。

-----------------------------------------------------------
class HogeHandler
  def initialize(dbname) ; @dbname=dbname ; end
  def child_init
    @db = DBWrapper.new(@dbname)
  end
  def authen_handler(request)
    user, pass = request.get_basic_auth.pw
    if @db.authenticate(user,pass)
       .....
    end
  end
  def contents_handler(request)
    @db.process_request(request)
  end
  ...
end
-----------------------------------------------------------
<Directory "/home/httpd/cgi-bin/honban">
   SetHandler ruby-script
   RubyHandlerObject 'HogeHandler.new("honban.db")'
</Directory>

<Directory "/home/httpd/cgi-bin/demo">
   SetHandler ruby-script
   RubyHandlerObject 'HogeHandler.new("demo.db") '
</Directory>
-----------------------------------------------------------

これで、ハンドラーオブジェクトが本番用とデモ用と2つできます。そして、
http://xxx/cgi-bin/honban/....に対するアクセスは本番用のハンドラーが、
http://xxx/cgi-bin/demo/...に対するアクセスはデモ用のハンドラーが処理し
ます。

両者は処理対象のデータベースが違うこと以外は、同一のプログラムが扱うので、
全く同じ処理ができますが、間違ってデモ用のURLから本番用のデータベースを
更新してしまう心配は全くありません。

PerlHandler方式では、両者で別のプログラムを使用するか、各ハンドラーの中
で環境変数を見て個別にどちらのデータベースを使うのか選択する必要がありま
す。単純なコーディングミスで間違ったDBを更新してしまう可能性がずっと高く
なります。

現実的には、デモ用のマシンを用意するだろうしデモ用に説明が必要などの理由
で、本番用のロジックを一切修正なしに使うケースは少ないと思います。でも、
この例のように、ハンドラーが個別のルーチンでなくあるオブジェクトの
methodになっている(OOになっている)ことは、それなりに意味があるというか、
かっこいいような気がします。

--
中島 拓 (tnaka / brain-tokyo.com)
http://www03.u-page.so-net.ne.jp/dc4/tnaka/