バグトラッキングシステムに影舞を使っているのだが、マシンが古い(AMD2-400MHz級)のでやたらレスポンスが悪い。少しでも改善すべく、mod_rubyの導入を試みた。

VineLinux3.2のApache2にmod_rubyを導入する

参考:mod_rubyメモ | Netsphere Laboratories

サーバーはVineLinux3.2で、Apache2を使っている。Vineのaptにはapache2のmod_rubyは用意されてないのでソースからコンパイルすることにする。mod_rubyコンパイルするには、configure.rbでapxsの場所を指定する必要があるようだ。RedHat系では/usr/bin/apxsになるらしいが、Vineでは存在しない。調べてみると、どうやらapache2-develをインストールしないとapxsは作られないようだ。

# apt-cache search apxs
apache2-devel - Development tools for the Apache HTTP server.
mod_perl2 - An embedded Perl interpreter for the Apache Web server Version 2
apache-devel - Apacheウェブサーバのための開発ツール

で、apache2-develをインストールしてみると果たせるかなapxsが作られた。
これでコンパイルできる。

$ tar xfvz  mod_ruby-1.2.6.tar.gz
$ cd mod_ruby-1.2.6/
$ ./configure.rb --with-apxs=/usr/bin/apxs
$ make
$ sudo checkinstall

本家サイトhttp://www.nslabs.jp/mod_ruby.rhtmlのインストール手順の通りに設定ファイルmod_ruby.confを/etc/apache2/conf.d/に作成。

LoadModule ruby_module modules/mod_ruby.so


  RubyRequire apache/ruby-run
  
    SetHandler ruby-object
    RubyHandler Apache::RubyRun.instance
  
  RubyRequire auto-reload

/etc/apache2/conf/apache2.confにインクルード…と思ったら、元からインクルードする設定になっていた。

#
# Load config files from the config directory "/etc/apache2/conf.d".
#
Include conf.d/*.conf

でApache2を再起動

# service apache2 restart

mod_rubyの動作テスト

上では拡張子がrbxのファイルをmod_rubyに関連付けたので、適当にrbxの拡張子をもつファイルを作って動作の実験をする。今回はこれまでcgiで動いていたRubyスクリプトの拡張子をrbからrbxにh変えたもので試してみた。
このスクリプトをブラウザで表示すると、HTTPのヘッダがうまく処理されていないらしくただのテキストファイルとして表示された。つまりHTMLタグが解釈されずそのまま表示された。
これを直すには、スクリプトを修正して、

print "Content-type:text/html"

のようにHTTPヘッダを直接出力している部分を、

require "cgi"
cgi = CGI.new
print cgi.header("text/html; charset=EUC-JP")

もしくは

r=Apache.request
r.content_type = "text/html; charset=EUC-JP"
r.send_http_header()

のように、Apacheモジュールを使うように変更する。Apacheモジュールはmod_rubyの中で定義されているらしく、requireする必要は無い。

以上で拡張子rbxをmod_rubyで実行することができた。

影舞をmod_rubyで動かす。

参考:http://www.daifukuya.com/kagemai/doc/install.html#mod-ruby

/kagemai/html/のguest.cgi、user.cgi、admin.cgiの拡張子をrbxに変えてコピーする。

$ cp -p guest.cgi guest.rbx
$ cp -p user.cgi user.rbx
$ cp -p admin.cgi admin.rbx

ブラウザでadmin.cgi にアクセスして、"全体の設定" の以下の項目を変更する。

guest_mode_cgi : guest.rbx
user_mode_cgi  : user.rbx
admin_mode_cgi : admin.rbx

これでブラウザでguest.rbxにアクセスすれば、mod_rubyで影舞が動…かずにエラーが出る。
実はあと一つだけ設定をいじる必要がある。

参考:http://www.daifukuya.com/kagemai/ml/users/msg00297.html
参考:http://www.daifukuya.com/kagemai/ml/users/msg00298.html

先に作った/etc/apache2/conf.d/mod_ruby.confを編集して、auto-reloadを無効にする。

LoadModule ruby_module modules/mod_ruby.so


  RubyRequire apache/ruby-run
  
    SetHandler ruby-object
    RubyHandler Apache::RubyRun.instance
  
  #RubyRequire auto-reload    <-コメントアウト singleton.rbが問題を起こすらしい

以上で影舞がmod_rubyで動作するようになった。

実際に動かしてみると、開くページにもよるがなんとか体感できる程度には速くなった。マシンパワーが貧弱なのでこんなもんだろう。