mod_rubyメモ

(2003.10.19新規作成)

mod_rubyは、Apache HTTPサーバにRubyインタプリタを組み込むモジュール。

通常のCGIスクリプトでは、実行するたびにRubyインタプリタを起動するので遅い。mod_rubyを使えばその時間を短縮できる。

下準備

mod_rubyをインストールするためには、Apache HTTPサーバに動的モジュールを組み込めるようにしておかないといけない。下記を参照。

mod_rubyのインストール

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

HTMLデータの出力

いくつか小さな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ライブラリは、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ではそのままでは動かない。

外部リンク