CGIの設定


戻る

EsehttpdのCGI対応について

esehttpdではCGI/1.1に対応しています。

設定

CGIを使うには、サーバ上の一部のURIをCGIスクリプトが置いてあるディレクトリへScriptAliasでマップしてやります。
  ScriptAlias /cgi-bin/ /usr/local/lib/esehttpd/www/cgi-bin/
この例では、たとえばこのサーバがfoo.bar.orgだったとすると、http://foo.bar.org/cgi-bin/baz.cgiというURIに対して/usr/local/lib/esehttpd/www/cgi-bin/baz.cgiというファイルをCGIスクリプトと見倣して実行するように設定しています。CGIスクリプトとして実行するプログラムはesehttpdプロセスのユーザ(デフォルトではnobody)が実行可能でなければなりません。CGIスクリプトのエラーはエラーログへ出力されます。

Chroot

esehttpdではchroot環境を作ればCGIスクリプトをより安全に実行することができます。ただしchroot環境でCGIスクリプトを使う場合はより複雑な準備が必要です。chroot環境を作るにはChrootの設定を参照してください。

cgi-rubyモジュール

esehttpdにはRubyスクリプトをrubyインタプリタを介さずに直接実行する機能があります。これを使うと、プロセス生成とRubyの初期化のオーバヘッドをなくなるため、実行速度が大幅に向上することがあります。この機能を使うには、設定ファイルに次のように書いてください。
  ScriptAlias /cgi-ruby/ /usr/local/lib/esehttpd/www/cgi-ruby/ cgi-ruby
通常のCGIの設定と比べて、モジュール名cgi-rubyを追加する点だけが異なります。この設定によって、http://foo.bar.org/cgi-ruby/baz.rbというURIに対して/usr/local/lib/esehttpd/www/cgi-ruby/baz.rbというファイルをRubyスクリプトと見倣して実行するようになります。

cgi-rubyモジュールによってRubyスクリプトが実行されると、そのスクリプトはesehttpdと同一のプロセス内で実行され、スクリプトの実行が終了するまでesehttpdプロセスの実行がブロックされます。よって実行に長時間かかるようなスクリプトはcgi-rubyモジュールではなくて通常のCGIスクリプトとして実行するようにしてください。

cgi-rubyで実行したRubyスクリプトが終了してもRuby環境は終了せず、グローバル変数などは残ったままになります。スクリプトの終了後at_exitで登録したブロックが実行されますので、これによって後始末をさせることができます。ただし、cgi-rubyに直接実行されるスクリプトにat_exitを書いてしまうと、そのスクリプトを実行されるたびにat_exitハンドラが多重登録されることになりますので、必ずrequire 'foo.rb'のようにしてfoo.rbの中にat_exitハンドラを書くようにしなければなりません。

cgi-rubyモジュールではCGI.rbを使わないRubyスクリプトでも実行することができます。例えば次のようなスクリプトも正常に動作します。
  #!/usr/local/bin/ruby
  print "Content-Type: text/html\r\n"
  print "\r\n"
  print "hello, world\r\n"
ただしこのスクリプトの最初の行は完全に無視されます。最初の行でrubyに対してコマンド行引数を与えたとしても無視されるので注意してください。

通常のCGIでは環境変数QUERY_STRINGとは別にコマンド行引数にもURIの引数が入りますが、cgi-rubyでは入りません。よってRubyスクリプトでARGVを参照している場合は環境変数QUERY_STRINGを使うように修正する必要があります。
戻る
Akira Higuchi