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スクリプトのエラーはエラーログへ出力されます。
最初にCGIの設定をテストをする際には混乱を避けるため後述のchroot設定(ChangeRoot)は行わないことをお勧めします。
Chroot
esehttpdではchroot環境を作ればCGIスクリプトをより安全に実行することができます。ただしchroot環境でCGIスクリプトを使う場合はより複雑な準備が必要です。chroot環境を作るにはChrootの設定を参照してください。
cgi-rubyモジュール
esehttpdにはRubyスクリプトをrubyインタプリタを介さずに直接実行する機能があります。これを使うと、プロセス生成とRubyの初期化のオーバヘッドをなくなるため、実行速度が大幅に向上することがあります。cgi-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/plain\r\n"
print "\r\n"
print "hello, world\r\n"
ただしこのスクリプトの最初の行(コメント)は完全に無視されます。最初の行でrubyに対してコマンド行引数を与えたとしても無視されるので注意してください。
通常のCGIでは環境変数QUERY_STRINGとは別にコマンド行引数にもURIの引数がセットされますが、cgi-rubyではセットされません。よってRubyスクリプトでARGVを参照している場合は環境変数QUERY_STRINGを使うように修正する必要があります。
戻る
Akira Higuchi