2006-02-20 ========== FCGI, Ruby, 変更なしで ---------------------- Reference URI: http://lowreal.net/logs/2006/02/20/4 Written Time: 2006-02-20T06:01:58+09:00 Tags: ruby fcgi ![エラー画面](/2006/ruby-fcgi.png 以前[CGI FastCGI, ruby](my:2006/01/17/1)とかいうセクションを書いたけど、ENV って普通に書き換えられることに気付いたのでもう 一度やってみた。できたっぽい? #!/usr/bin/rubyrequire "fcgi"FCGI.each do |fcgi| $stdout = fcgi.out $stdin = fcgi.in ENV.replace(fcgi.env) load(fcgi.env["SCRIPT_FILENAME"], true) fcgi.finishendfastcgi.server = ( ".php" => ( "localhost" => ( "socket" => "/tmp/fcgi-php.socket", "bin-path" => "/usr/bin/php-cgi" ) ), ".rb" => ( "localhost-rb" => ( "socket" => "/tmp/fcgi-ruby.socket", "bin-path" => "/home/cho45/bin/ruby-fcgi.rb" ) ) ) ruby-fcgi.rb の位置がキモイけれど、これは共有ディレクトリを /home/cho45 以下しか設 定してなくてめんどくさかったから。symlink 貼ればいいんだけど…… でもって以下のようなスクリプトでテスト require "cgi"puts "Content-type: text/plain\n\n"@cgi = CGI.newp @cgip @cgi.accept 全く普通の CGI (Common Gateway Interface) と同じ形式。パッと見上手くいってる。POST のときどうなるか微妙だけどあとで追試。 ちなみに、これだとエラー出力がコンソールにでるけど、その辺は適当にログ残すようにす ればいいかな。というか、load してるところの例外キャッチして美しいエラー画面を出すようにすればよろしそう。どう せログなんぞ見ない。 当たり前だけど、FastCGI 前提でプログラム書くならもっと最適化ができるので (リクエス トごとに変わらない部分は共通にできる)、普通の CGI (Common Gateway Interface) でもどっちでも使いたいという場合以外は積極的に使うようなもんじゃない。 [ruby-fcgi.rb](/2006/ruby-fcgi.rb), エラーをスタックトレース付きで表示するようにした。 ENV.replace があった…… Dir.chdir するように修正。 hiki が一応動くっぽい。と、思いきや、リロードごとに 500 になったり 200 になったり する。なぞい。 $SAFE を設定されていたみたいだ。(リクエスト -> hiki でセーフレベルが設定される -> リク エスト -> セーフレベルがあがっているのでエラー終了 -> 見れない -> リクエスト -> f cgi プロセスが再起動される -> 見れるように) Thread 使って分離した。callcc 使うべきだなぁ。