mod_ruby とpostgres の接続 on windows について

177 views
Skip to first unread message

まことう

unread,
Oct 26, 2009, 9:42:52 AM10/26/09
to kagemai-users

現在、Windows 上にてKAGEMAIを運用しています。
このたび、KAGEMAIサーバー応答時間の改善を求め、mod_ruby を導入しようと試みていますが、
以下のエラーメッセージに直面しており、難航しております。

-------------------------------------------------------------------------------------------
o Browser (firefox)からのメッセージ

HTTP/1.1 200 OK
Content-Type: text/plain

Following errors occurred. Please contact administrator.

Could not load driver (182: このオペレーティング システムでは %1 は実行されません。
- C:/ruby/lib/ruby/gems/1.8/gems/ruby-postgres-0.7.1.2006.04.05-
mswin32/./postgres.so).
Note that in SAFE mode >= 1, driver URLs have to be case sensitive!
(DBI::InterfaceError)

-------------------------------------------------------------------------------------------
o log/error.log の中身

Could not load driver (182: <82><B1><82><CC><83>I<83>y<83><8C><81>
[<83>e<83>B<83><93><83>O <83>V<83>
X<83>e<83><80><82><C5><82><CD> %1 <82><CD><8E><C0><8D>s
- C:/ruby/lib/ruby/gems/1.8/gems/ruby-postgres-0.7.1.2006.04.05-
mswin32/./postgres.so).
Note that in SAFE mode >= 1, driver URLs have to be case sensitive!
(DBI::InterfaceError)
C:/ruby/lib/ruby/site_ruby/1.8/dbi.rb:342:in `load_driver'
C:/ruby/lib/ruby/site_ruby/1.8/dbi.rb:227:in `_get_full_driver'
C:/ruby/lib/ruby/site_ruby/1.8/dbi.rb:213:in `connect'
c:/Program Files/Apache Group/Apache2/htdocs/kagemai/lib/kagemai/
dbistore.rb:94:in `execute'
c:/Program Files/Apache Group/Apache2/htdocs/kagemai/lib/kagemai/
dbistore.rb:399:in `count_reports'
c:/Program Files/Apache Group/Apache2/htdocs/kagemai/lib/kagemai/
project.rb:244:in `count_reports'
c:/Program Files/Apache Software Foundation/Apache2.2/htdocs/kagemai/
resource/ja/template/_default/topics_count.rhtml:4:in `eval_template'
c:/Program Files/Apache Group/Apache2/htdocs/kagemai/lib/kagemai/cgi/
action.rb:192:in `eval_template'
c:/Program Files/Apache Group/Apache2/htdocs/kagemai/lib/kagemai/cgi/
action.rb:191:in `instance_eval'
c:/Program Files/Apache Group/Apache2/htdocs/kagemai/lib/kagemai/cgi/
action.rb:191:in `eval_template'
c:/Program Files/Apache Software Foundation/Apache2.2/htdocs/kagemai/
resource/ja/template/_default/topics.rhtml:56:in `eval_template'
c:/Program Files/Apache Software Foundation/Apache2.2/htdocs/kagemai/
resource/ja/template/_default/topics.rhtml:53:in `each'
c:/Program Files/Apache Software Foundation/Apache2.2/htdocs/kagemai/
resource/ja/template/_default/topics.rhtml:53:in `eval_template'
c:/Program Files/Apache Group/Apache2/htdocs/kagemai/lib/kagemai/cgi/
action.rb:199:in `eval_template'
c:/Program Files/Apache Group/Apache2/htdocs/kagemai/lib/kagemai/cgi/
action.rb:198:in `instance_eval'
c:/Program Files/Apache Group/Apache2/htdocs/kagemai/lib/kagemai/cgi/
action.rb:198:in `eval_template'
c:/Program Files/Apache Software Foundation/Apache2.2/htdocs/kagemai/
lib/kagemai/cgi/action/top.rb:38:in `execute'
c:/Program Files/Apache Group/Apache2/htdocs/kagemai/lib/kagemai/
kagemai.rb:88:in `action'
C:/Program Files/Apache Group/Apache2/htdocs/kagemai/html/guest.rbx:
64:in `execute'
C:/Program Files/Apache Group/Apache2/htdocs/kagemai/html/guest.rbx:
112
C:\Program Files\Apache Group\Apache2\mod_ruby\lib/apache/ruby-run.rb:
53:in `load'
C:\Program Files\Apache Group\Apache2\mod_ruby\lib/apache/ruby-run.rb:
53:in `handler'
-------------------------------------------------------------------------------------------

問題の切り分けをすべく
以下のようなテストスクリプトをコマンドプロンプト上より
% ruby ruby_postgres_test.rbxと実行してみたところ正しく動作しました。
しかしながら、ブラウザ上よりruby_postgres_test.rbx を実行すると、
require 'postgres'の部分で、postgres が見つからないと怒られてしまいます。

postgres をDisable にした場合は、mod_ruby 経由で問題なくKAGEMAIが動作することは確認しました。

以上より、mod_ruby とpostgres ライブラリとの接続がうまくいっていないと考え、
mod_ruby のメーリングリストのサイトも調べてみたのですが、似たような問題を見つけることができませんでした。
どなたか同様な症状に直面した方はいらっしゃいませんでしょうか?
些細なことでかまいませんので、何かしら助言、情報等をいただけると大変助かります。

まことう

----------------------------------------------------------------------------
o ruby_postgres_test.rbx

#! /usr/bin/env ruby
#
# original file src/test/examples/testlibpq.c
#
require 'postgres'

conn = PGconn.connect("localhost", 5432, '', '', "testdb",
'postgres' );
res = conn.exec("select * from staff;");
p res.num_tuples;

-------------------------------------------------------------------------------
o log/error.log の中身

[Mon Oct 26 22:25:23 2009] [error] mod_ruby: C:/ruby/lib/ruby/
site_ruby/1.8/rubygems/custom_require.rb:32:in `gem_original_require':
no such file to load -- postgres (LoadError)
[Mon Oct 26 22:25:23 2009] [error] mod_ruby: from C:/ruby/lib/ruby/
site_ruby/1.8/rubygems/custom_require.rb:32:in `require'
[Mon Oct 26 22:25:23 2009] [error] mod_ruby: from C:/Program Files/
Apache Group/Apache2/htdocs/kagemai/html/postgres_test.rbx:5
[Mon Oct 26 22:25:23 2009] [error] mod_ruby: from C:\\Program Files\
\Apache Group\\Apache2\\mod_ruby\\lib/apache/ruby-run.rb:53:in `load'
[Mon Oct 26 22:25:23 2009] [error] mod_ruby: from C:\\Program Files\
\Apache Group\\Apache2\\mod_ruby\\lib/apache/ruby-run.rb:53:in
`handler'

-------------------------------------------------------------------------------
o 現在の環境は以下のとおりです。

Kagemai 0.8.8
ruby 1.8.6
postgresql 8.4.1
apache 2.0.63
mod_ruby/1.2.4

mod_ruby on Windows の設定は以下のサイトを参考にしました。
http://rtokiwa.s55.xrea.com/wiki/index.php?mod_ruby_win32bin

-------------------------------------------------------------------------------

FUKUOKA Tomoyuki

unread,
Oct 26, 2009, 11:30:59 AM10/26/09
to kagema...@googlegroups.com
福岡です。

たぶん、mod_ruby が読み込んでいる postgres.so が依存する DLL が読み込めて
ないのではないかと思います。

http://d.hatena.ne.jp/h4y/20080228/1204206048
に近いと思いますが、コマンドラインだと postgres.so の require はできているのが違いますね。
FastCGI だと、PostgreSQLのDLLの場所を環境変数で渡さないとうまく動かないんですが、
mod_ruby の場合はDLLのロードパスはどうなるんでしょう。。。

# 個人的な意見ですが、Windows だと mod_ruby を使うよりは、
# One Clicke Installer版のRubyを使って、FastCGI で動かす方が簡単な気がします。

2009年10月26日22:42 まことう <mako...@gmail.com>:

--
FUKUOKA Tomoyuki

FUKUOKA Tomoyuki

unread,
Oct 26, 2009, 11:50:27 AM10/26/09
to kagema...@googlegroups.com
福岡です。

ちょっとフォローを。

2009年10月27日0:30 FUKUOKA Tomoyuki <to.fu...@gmail.com>:


> たぶん、mod_ruby が読み込んでいる postgres.so が依存する DLL が読み込めて
> ないのではないかと思います。
>
> http://d.hatena.ne.jp/h4y/20080228/1204206048
> に近いと思いますが、コマンドラインだと postgres.so の require はできているのが違いますね。

いちおう同じエラーメッセージが出ていますが、

> Could not load driver (182: このオペレーティング システムでは %1 は実行されません。
> - C:/ruby/lib/ruby/gems/1.8/gems/ruby-postgres-0.7.1.2006.04.05-
> mswin32/./postgres.so).

このエラーは、postgres.so が libpq.dll をロードできないために起こっているんだと思います。
その原因としては、

(1) libpq.dll を見つけられない
(2) libpq.dll が依存する DLL (ssleay32.dllなど)が見つけられない
(3) libpq.dll が依存する DLL のバージョンが違うのでロードできない

などが考えられますが、上の日記だと(3)ですね。今回の mod_ruby の場合は
(1) か (2) の可能性が高いのではないかと思います。

--
FUKUOKA Tomoyuki

まことう

unread,
Oct 27, 2009, 6:05:26 AM10/27/09
to kagemai-users
アドバイスありがとうございました。

アドバイスを元に色々思考錯誤した結果、
libpq.so へのパスをmod_ruby に教えてあげることによって問題が解決しました。
RubyAddPath "C:\ruby\bin"

参考までに以下が最終的にうまくいった設定です。
(元は以下のURLの設定を真似ています。)
http://rtokiwa.s55.xrea.com/wiki/index.php?mod_ruby_win32bin

--------------------------------------------------------------------------

LoadFile "C:\ruby\bin\msvcrt-ruby18.dll"
LoadModule ruby_module modules/mod_ruby.so
<IfModule mod_ruby.c>
RubyAddPath "C:\Program Files\Apache Group\Apache2\mod_ruby\lib"
RubyAddPath "C:\ruby\bin"
RubyRequire apache/ruby-run

#RubyKanjiCode euc
#<Location /ruby>
# SetHandler ruby-object
# RubyHandler Apache::RubyRun.instance
#</Location>
#<Files *.rbx>
# SetHandler ruby-object
# RubyHandler Apache::RubyRun.instance
#</Files>
</IfModule>
--------------------------------------------------------------------------


#<Files *.rbx>
# SetHandler ruby-object
# RubyHandler Apache::RubyRun.instance
#</Files>

の部分は.htaccess で設定しています。
--------------------------------------------------------------------------

ありがとうございました。
Reply all
Reply to author
Forward
0 new messages