第4回 Apache+PostgreSQL+Rubyで作るWebアプリケーションサーバ
その3:Ruby・eRubyのインストール
2002/05/18作成
2005/03/08更新
続いてRuby関連をインストールしましょう。
Rubyは簡単にプログラムを作ることができます。perlのように文字列処理などの簡単なスクリプトをささっと作るのにとても適しています。
perlよりもスクリプトが読みやすい点では初心者向けなのですが、純粋なオブジェクト指向に乗っ取っているので上級者にも適しています。
開発者が日本人ということもあり、日本語ドキュメントが充実していて、しかも日本語処理に関するツールがプログラムに標準添付になっているのもうれしいです。
eRubyはRubyの主要アプリケーションであるにもかかわらず、ドキュメントが非常に少ないです。
インストールもライブラリの読み込みが失敗したりとつまずくことも多いので、もう少し充実して欲しいです。
1.Rubyのインストール
最近のPC-UNIXのディストリビューションの中にはperlのようにRubyが標準添付されているようですが、ほとんどの場合インストールする必要があるみたいです。
2〜3ヶ月に一度くらいの頻度でマイナーバージョンアップしているので標準添付のRubyが古くなっている可能でいもあるのでソースからのインストールを紹介します。
RubyのソースはRubyのホームページから入手できます。
ソースを展開してconfigureします。
共有ライブラリを有効化するために--enable-sharedオプションを付けました。
あとはmakeしてmake installします。
% tar zxvf ruby-1.6.7.tar.gz
% cd ruby-1.6.7
% ./configure --enable-shared
% make
% su
password
% make install |
インストールが完了したらちゃんとインストールされているか確認します。
一応rehashしておきます。bashの人は必要ないかもしれません。
% rehash
% ruby -v
ruby 1.6.7 (2002-03-01) [i386-freebsd4.5] |
バージョンが出ればOKです。
2.eRubyのインストール
eRubyのソースはmod_rubyのサイトから入手できます。
mod_rubyのサイトはRubyのホームページからはリンクが遠いので見つけづらいです。eRubyやmod_rubyはRubyのキラーアプリケーションなので、もう少し近いところにリンクしておいて欲しいです。
あとでmod_rubyもインストールするので一緒にダウンロードしておくといいと思います。
いつものようにconfigureしてmakeするのですが、configureがRubyで動いているので拡張子がrbになっています。
当然ながらRubyが無いと動きません。
configureするときのコツは、デフォルトのキャラクターセットをここで指定しておくことです。
ここで指定しないと、eRubyで生成されApache経由で表示されるドキュメントが日本語以外に指定されてしまうため、文字化け状態になってしまいます。
私もこれにはまってしまいました。
キャラクターセット以外にもここでも共有ライブラリを有効にしておきます。
% tar zxvf eruby-0.9.8.tar.gz
% cd eruby-0.9.8
% ./configure.rb --enable-shared --with-charset=EUC-JP
% make
% su
password
# make install |
インストールが完了したら確認します。
% eruby --version
eRuby version 0.9.8
ruby 1.6.7 (2002-03-01) [i386-freebsd4.5] |
バージョンが出たらOKです。
3.mod_rubyのインストール
RubyとWebの親和性を高めるためにmod_rubyをインストールします。
mod_rubyを導入することで動的コンテンツ提供のスピードが格段にアップします。
まったく同じソースのものをcgiで実行した場合とmod_rubyで実行した場合でページ生成までの時間を測定したところ、30%程度パフォーマンスがあがりました。
mod_rubyのソースはさっきのeRubyの置き場所と同じなのでそこから入手します。
ソースを展開してconfigureしますが、このときApacheの情報を引数に与えておきましょう。
あと、せっかくeRubyを入れたのでドキュメント生成でeRubyを使えるようにします。
mod_rubyをApacheに組み込むとき、静的モジュールとして組み込む方法と動的モジュールとして組み込む方法があります。
静的モジュールで組み込むのは難しいので、今回は動的モジュールのみのやり方を紹介します。
% tar zxvf mod_ruby-0.9.8.tar.gz
% cd mod_ruby-0.9.8
% ./configure.rb --with-apxs=/usr/local/apache/bin/apxs
--enable-eruby
% make
% su
password
# make install |
可能性としてはconfigureに失敗する可能性が高いです。
ほとんどの場合がApacheでmod_soが有効になっていない場合なので、Apacheのインストールに戻ってやり直しましょう。
あとはmod_rubyを有効にするためにApacheのコンフィグを書き直します。
mod_rubyを有効にするためのhttpd.confの例が差分としてexampleディレクトリに入っています。これをApacheのhttpd.confの最後に追加します。リダイレクトを間違うとひどい目にあうので気を付けましょう。
# pwd
/path/to/mod_ruby-0.9.8
# cd example
# cat httpd.conf >> /usr/local/apache/conf/httpd.conf |
あとはviなどで編集します。httpd.confの一番最後に差分が追加されているのでそこを以下のように編集します。赤文字が編集箇所です。というかコメントを外す場所です。
eRubyを使わない場合はコメントを付けたままです。
eRubyしか使わない場合や実行フォルダを使わないときはセキュリティを考えてコメントアウトしたほうがいいと思います。
# Note: /usr/local/apache/libexec/mod_ruby.so
is just an example.
# You should specify the correct path
to
mod_ruby.so.
LoadModule ruby_module /usr/local/apache/libexec/mod_ruby.so
# # If ClearModuleList is used in your
httpd.conf,
you should use AddModule
# # to activate the ruby module.
# AddModule mod_ruby.c
# If the ruby module is installed,
this will
be enabled.
<IfModule mod_ruby.c>
# for Apache::RubyRun
RubyRequire apache/ruby-run
# exec files under /ruby as ruby scripts.
# Locationで指定したディレクトリのファイルはrubyスクリプトとして処理
<Location /ruby>
SetHandler ruby-object
RubyHandler Apache::RubyRun.instance
Options ExecCGI
</Location>
# exec *.rbx as ruby scripts.
# rbxの拡張子が付いたファイルはrubyスクリプトとして処理
<Files *.rbx>
SetHandler ruby-object
RubyHandler Apache::RubyRun.instance
</Files>
# # for Apache::ERubyRun
RubyRequire apache/eruby-run
#
# handle files under /eruby as eRuby files
by eruby.
# /erubyにあるファイルはすべてeRubyファイルとして処理
<Location /eruby>
SetHandler ruby-object
RubyHandler Apache::ERubyRun.instance
Options ExecCGI
</Location>
# handle *.rhtml as eruby files.
# 拡張子がrhtmlのファイルはeRubyとして処理
<Files *.rhtml>
SetHandler ruby-object
RubyHandler Apache::ERubyRun.instance
</Files>
# for Apache::ERbRun
# RubyRequire apache/erb-run
# # handle files under /erb as eRuby
files
by ERb.
# <Location /erb>
# SetHandler ruby-object
# RubyHandler Apache::ERbRun.instance
# Options ExecCGI
# </Location>
# # for debug
# RubyRequire auto-reload
</IfModule> |
ファイルを書き換えたらApacheを再起動します。
httpd.confの変更を反映させるとき、apachectlのオプションはrestartでいいのですが、mod_rubyはrestartでは都合がわるいらしく、stopしてからstartをかけるのが推奨のようです。
# /usr/local/apache/bin/apachectl stop
/usr/local/apache/bin/apachectl stop:
httpd
stopped
# /usr/local/apache/bin/apachectl start
/usr/local/apache/bin/apachectl start:
httpd
started |
うまく動かない場合はエラーログが出ているのでそれを見てみましょう。
また、mod_rubyではスクリプトエラーもApacheのエラーログに出てき来るので、スクリプトのデバッグするときはエラーログもチェックします。
4.postgresライブラリのインストール
RubyからPostgreSQLを使うとき、デフォルトのインストール状態では利用できません。
postgresライブラリを追加しなければいけません。
ruby-postgresのソースはこちらから入手します。
インストールにあたり、PostgreSQLの開発環境がインストールされている必要があります。
ソースからコンパイルしてインストールした人は特に気にしなくてもいいですが、rpmなどでインストールした人は気を付けなければいけません。
要はRubyのpostgresライブラリはCのライブラリであるlibpqを使っているのでこれを事前に入れておかなければいけないということです。
% tar zxvf ruby-postgres-0.6.5.tar.gz
% cd ruby-postgres-0.6.5
% ruby extconf.rb --with-pgsql-include-dir=/usr/local/pgsql/include
--with-pgsql-lib-dir=/usr/local/pgsql/lib
% make
% su
password
# make install |
インストールがうまくいかなかったり、Rubyからのライブラリ読み込みが成功しなかったときは以下のトラブルシューティングを参考にしてみてください。
実際にRubyのプログラム中で使うときはrequire
'postgres'で使用します。
Rubyでpostgresライブラリを使うときの注意点として、クエリのエスケープ機能がないので自作しなければいけません。
mysqlのモジュールにはエスケープするメソッドが付いているんですけどね。
私は次のような簡易メソッドを作って対応しています。
正規表現の検証をするのかなり苦労しました。
本来であればpostgresモジュールを拡張してクラスメソッドに加えた方が効率がいいのかもしれませんけど。
#!/usr/bin/env ruby -Ke
def pgescape(str)
string = str.gsub(/([\\\'\+\-\*\/\<\>\=\~\!\@\#\%\^\&\|\`\?\$])/,'\\\\\1')
return string
end
|
5.トラブルシューティング
インストールしてみるとうまくいかないことがあります。
そういうときはライブラリのパスを環境変数に指定してあげるといいです。
まずはどのライブラリが見つかっていないのかをチェックします。
lddコマンドのあとに動かないプログラムをfullpathで指定します。
以下はerubyです。以下の実行結果はliberuby.so.09が見つからなかったことを示しています。
実行ファイル以外にもライブラリなども指定できます。
% ldd /usr/local/bin/eruby
/usr/local/bin/eruby:
liberuby.so.09 => not found
libruby.so.16 => /usr/local/lib/libruby.so.16
(0x2806c000)
libcrypt.so.2 => /usr/lib/libcrypt.so.2
(0x28111000)
libm.so.2 => /usr/lib/libm.so.2
(0x2812a000)
libc.so.4 => /usr/lib/libc.so.4
(0x28146000) |
動かないものはfindコマンドで動かないライブラリが入っているのかを確認してついでに場所も確認します。
(1)ライブラリが見つからない場合
ライブラリが入っていなかったら、ライブラリを提供しているソフトをインストールします。
どれを入れたらそのライブラリが入るのかファイル名からだいたい予想は付くものはいいんですがそうでないものはお手上げになっちゃいます。
そういう場合は
1.ドキュメントを読みあさりdependencyをチェック
2.あきらめてportsかrpmを入れる
などがあります。rpmが提供されている場合、rpmの情報を参考にライブラリを集めてみるという方法もあります。
(2)ライブラリが見つかった場合
ほとんどの場合はライブラリが見つかりますから安心してください。
ライブラリが見つかったらLD_RUN_PATHに環境変数をセットします。
#一部ではLD_LIBRARY_PATHという噂も・・
/usr/local/libにライブラリが見つかった場合は以下の通りです。
<csh,tcshの場合>
| # setenv LD_RUN_PATH /usr/local/lib |
<sh,bashの場合>
# LD_RUN_PATH=/usr/local/lib
# export LD_RUN_PATH |
|
あとは、再度makeしてmake installしますが前回のmakeでゴミが残っているので先にmake
cleanをかけておくのをおすすめします。
ちなみにLinuxの場合はld.so.confを編集すれば環境変数の設定が必要無いようです。
今のところわかっているのは、redhatでrubyをインストールするときに--enable-sharedを有効にすると、libruby.soが見つからないようです。
あと、erubyのインストールでもliberuby.so.0.9が見つからないと言われました。
libruby.soはld.so.confに/usr/local/libを加えて./configureからやり直してOKでしたが、liberuby.soの方は/usr/local/libに入っているのに動いてくれませんでした。
export LD_RUN_PATH=/usr/local/libを書いてconfigureからやり直したらOKになりました。
<参考文献>
Rubyインストールガイド http://www.ruby-lang.org/ja/install.html
rubyメーリングリストアーカイブ http://blade.nagaokaut.ac.jp/ruby/ruby-list/index.shtml
RubyによるCGIプログラミング 三並 慶佐 著 SCC発行
Postgres(Ruby PostgreSQL拡張モジュール) http://www.postgresql.jp/interfaces/ruby/index-ja.html
もどる