バグトラッキングシステムに影舞を使っているのだが、マシンが古い(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.soRubyRequire 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.soRubyRequire apache/ruby-run SetHandler ruby-object RubyHandler Apache::RubyRun.instance #RubyRequire auto-reload <-コメントアウト singleton.rbが問題を起こすらしい
以上で影舞がmod_rubyで動作するようになった。
実際に動かしてみると、開くページにもよるがなんとか体感できる程度には速くなった。マシンパワーが貧弱なのでこんなもんだろう。