<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/xml.xsl" type="text/xsl"?><feed xmlns="http://www.w3.org/2005/Atom">
  <title>nulog, NULL::something : out of the headphone &gt; 2006 &gt; February &gt; 20 &gt; FCGI, Ruby, 変更なしで</title>
  <link href="http://lowreal.net/logs/2006/02/20/4"/>
  <icon>http://lowreal.net/img/banner.png</icon>
  <link rel="self" type="application/atom+xml" href="http://lowreal.net/logs/2006/02/20/4.atom"/>
  <link rel="alternate" type="application/xhtml+xml" href="http://lowreal.net/logs/2006/02/20/4.xhtml"/>
  <updated>2006-02-20T06:01:58+09:00</updated>
  <author>
    <name>cho45(砂糖)</name>
  </author>
  <id>http://lowreal.net/2006/02/20/4</id>
  <entry>
    <title>FCGI, Ruby, 変更なしで</title>
    <link rel="alternate" type="text/html" href="http://lowreal.net/logs/2006/02/20/4.html"/>
    <link rel="alternate" type="application/xml+xhtml" href="http://lowreal.net/logs/2006/02/20/4.xhtml"/>
    <updated>2006-02-20T06:01:58+09:00</updated>
    <published>2006-02-20T06:01:58+09:00</published>
    <id>http://lowreal.net/2006/02/20/4</id>
    <category term="ruby"/>
    <category term="fcgi"/>
    <content type="xhtml" xml:base="http://lowreal.net/">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p class="img">
          <a xmlns="http://www.w3.org/2005/Atom" href="/view-img/2006/ruby-fcgi.png" title="/2006/ruby-fcgi.png">
            <img src="/2006/ruby-fcgi.png" alt="エラー画面"/>
          </a>
        </p>
        <p>以前<a href="http://lowreal.net/logs//2006/01/17/1">CGI FastCGI, ruby</a>とかいうセクションを書いたけど、ENV って普通に書き換えられることに気付いたのでもう一度やってみた。できたっぽい？</p>
        <pre class="Ruby" title="ruby-fcgi.rb">#!/usr/bin/ruby
require "fcgi"
FCGI.each do |fcgi|
    $stdout = fcgi.out
    $stdin = fcgi.in

    ENV.replace(fcgi.env)

    load(fcgi.env["SCRIPT_FILENAME"], true)
    fcgi.finish
end
</pre>
        <pre title="Lighttpd">
fastcgi.server             = (
                               ".php" =&gt;
                               ( "localhost" =&gt;
                                 (
                                   "socket" =&gt; "/tmp/fcgi-php.socket",
                                   "bin-path" =&gt; "/usr/bin/php-cgi"
                                 )
                               ),
                               ".rb" =&gt;
                               ( "localhost-rb" =&gt;
                                 (
                                   "socket" =&gt; "/tmp/fcgi-ruby.socket",
                                   "bin-path" =&gt; "/home/cho45/bin/ruby-fcgi.rb"
                                 )
                               )
                             )  </pre>
        <p>ruby-fcgi.rb の位置がキモイけれど、これは共有ディレクトリを /home/cho45 以下しか設定してなくてめんどくさかったから。symlink 貼ればいいんだけど……</p>
        <p>でもって以下のようなスクリプトでテスト</p>
        <pre class="Ruby">
require "cgi"
puts "Content-type: text/plain\n\n"
@cgi = CGI.new
p @cgi
p @cgi.accept</pre>
        <p>全く普通の <abbr title="Common Gateway Interface">CGI</abbr> と同じ形式。パッと見上手くいってる。POST のときどうなるか微妙だけどあとで追試。</p>
        <p>ちなみに、これだとエラー出力がコンソールにでるけど、その辺は適当にログ残すようにすればいいかな。というか、<code>load</code> してるところの例外キャッチして美しいエラー画面を出すようにすればよろしそう。どうせログなんぞ見ない。</p>
        <p>当たり前だけど、FastCGI 前提でプログラム書くならもっと最適化ができるので (リクエストごとに変わらない部分は共通にできる)、普通の <abbr title="Common Gateway Interface">CGI</abbr> でもどっちでも使いたいという場合以外は積極的に使うようなもんじゃない。</p>
        <ins datetime="2006-02-20T06:20:27+09:00">
          <p><a href="/2006/ruby-fcgi.rb">ruby-fcgi.rb</a>, エラーをスタックトレース付きで表示するようにした。</p>
        </ins>
        <ins datetime="2006-02-20T06:35:21+09:00">
          <p><code>ENV.replace</code> があった……</p>
        </ins>
        <ins datetime="2006-02-20T13:46:22+09:00">
          <p><code>Dir.chdir</code> するように修正。</p>
          <p>hiki が一応動くっぽい。と、思いきや、リロードごとに 500 になったり 200 になったりする。なぞい。</p>
        </ins>
        <ins datetime="2006-02-20T13:49:46+09:00">
          <p><code>$SAFE</code> を設定されていたみたいだ。(リクエスト -&gt; hiki でセーフレベルが設定される -&gt; リクエスト -&gt; セーフレベルがあがっているのでエラー終了 -&gt; 見れない -&gt; リクエスト -&gt; fcgi プロセスが再起動される -&gt; 見れるように) Thread 使って分離した。<code>callcc</code> 使うべきだなぁ。</p>
        </ins>
      </div>
    </content>
  </entry>
</feed>
