(2003.10.19新規作成)
Webサーバは nginx [engine x] をおすすめします。Apache HTTP Server を使う場合であっても、Ruby の組み込みは Passenger アプリケィションサーバがよいでしょう。
mod_rubyは、Apache HTTPサーバにRubyインタプリタを組み込むモジュール。
通常のCGIスクリプトでは、実行するたびにRubyインタプリタを起動するので遅い。mod_rubyを使えばその時間を短縮できる。
mod_rubyをインストールするためには、Apache HTTPサーバに動的モジュールを組み込めるようにしておかないといけない。下記を参照。
mod_rubyのソースファイルを入手し、解凍する。
コンパイルとインストールは、次のようにする。apxsの場所は違う場合があるので、実際の環境に合わせる。
$ ./configure.rb --with-apxs=/usr/sbin/apxs $ make $ su # make install
次に設定ファイルを書く。
Apacheをソースからインストールした場合は、/usr/local/apache2/conf ディレクトリにmod_ruby.confファイルを作成する。Red Hat Linux 9の場合は/etc/httpd/conf.dディレクトリにmod_ruby.confファイルを作成する。
httpd.confに次の一文を追加する。
Include conf/mod_ruby.conf
mod_ruby.confの内容は、例えば、次のようにする。ここでは拡張子rbxを持つファイルをmod_rubyスクリプトとして実行するようにしている。拡張子は何でもいいが、他の種類のファイルと被らないほうがいいだろう。
LoadModuleディレクティブで、Apacheの起動時にモジュールをロードする。
LoadModule ruby_module modules/mod_ruby.so <IfModule mod_ruby.c> RubyRequire apache/ruby-run <Files *.rbx> SetHandler ruby-object RubyHandler Apache::RubyRun.instance </Files> RubyRequire auto-reload </IfModule>
設定ファイルが書けたらApacheを再起動する。Red Hat Linux の場合は次のようにする。
# /etc/rc.d/init.d/httpd restart
ソースからインストールした場合は、次のようにする。
# /usr/local/apache2/bin/apachectl restart
いくつか小さなmod_rubyスクリプトを作ってみる。mod_rubyスクリプトには実行許可を与えておかないといけない。
標準出力への出力は、Webサーバーを通じてクライアントへ送信される。CGIと異なり、出力はすべてHTTPプロトコルのmessage-bodyとして扱われる。message-header(ヘッダ)は自動的に付加される。
print "foo\n"
明示的に標準出力オブジェクトが必要な場合は、$stdout
を使う。STDOUT
に出力すると、単に捨てられて、何も出力されない。
mod_rubyでは、暗黙のうちにApacheモジュールが定義されている。Apacheモジュールのrequestプロパティ(Apache::Requestクラス)は、リクエストまたはレスポンスヘッダなどを格納する。
出力するHTTPヘッダを指定するには、Apache.request.headers_out、content_typeプロパティなどに値を設定する。headers_outプロパティは、Apache::Tableクラスのオブジェクト。
ヘッダを出力するには、Apache::Request#send_http_headerメソッドを呼び出す。
4| r = Apache.request 5| r.status_line = "301 Moved Permanently" 6| r.headers_out["Location"] = "http://www.yahoo.co.jp/" 7| r.content_type = "text/html; charset=EUC-JP" 8| r.send_http_header() 9| 10| print "<html><body>移動しました。</body></html>"
CGIライブラリは、CGIインターフェイスとmod_rubyの違いをある程度は吸収してくれる。次のサンプルは、CGIでもmod_rubyでも動く。
4| require "cgi" 5| 6| cgi = CGI.new 7| print cgi.header("text/html") 8| print <<EOF 9| FOO BAR BAZ 10| テキストのサンプル 11| EOF
CGI#header()は、CGIのときはヘッダを文字列として返し、mod_rubyのときは内部でsend_http_headerする(何も返さない)。CGI#header()の戻り値の文字列を加工したりするようなスクリプトは、mod_rubyではそのままでは動かない。