スキップしてメイン コンテンツに移動

Minuano

2006年は更新1回などと前回書きながらまたこのページを更新する。今回はつまらない作業のメモ。

MongrelというRubyのモジュールがあって、これはWebサーバの機能を持っている。似たようなモジュールとしてWEBrickというのがあるけれどもMongrelの方が新しくまたパフォーマンスも高いらしいというので昨日拾って中身を見てみるとmongrel(雑種)という名前に何か関係があるのかHTTPパーザの部分だけC拡張として実装してある。ソケット周りの部分をもCにしない理由は不明だが、大量のデータを処理するホットスポットをCにするという方針自体は正しい。
だが、こうしたCを使っているモジュールの常か、クロスプラットフォーム対応はおざなりなようでWin32版のバイナリの提供が若干遅 れている。とあるテストをWin32版で行っていて不具合らしき現象に突き当たったので自分で新しい物をビルドしようと思いRubyForgeのSVNから未リリースのバージョンを取ってきた。どうやらメジャーバージョンアップを控えているようで色々中身が増えている。C拡張ソースコードがあるext\http11フォルダのextconf.rbmkmfライブラリによるMakefile生成スクリプトなのでこれをRubyで実行する。(ちなみにRuby本体はRuby-mswin32 のビルドを使用している。) ところがエラーが出てMakefileを作ってくれない。mkmf.logを見るとc.libと いうのがおかしいようだ。とどのつまりUnixのCライブラリが前提になっていてWindowsでのビルドは全く無視されていると思われる。ドキュメントはビルドについて何も触れていないので、オフィシャルのWin32版がどうやってビルドされたのかすらわからない。

仕方ないので試行錯誤してextconf.rb内のhave_libraryの第一引数をlibcpmt(VC++のマルチスレッドリリース版Cライブラリ)にしてやるとコンフリクトも無くどうにかMakefile を作ってくれる。nmakeによるビルドの際はRuby本体のlib\ruby\1.8\i386-mswin32フォルダにあるconfig.h 先頭のコンパイラバージョンチェックにひっかかるので、これを編集してコメントアウトする必要がある。Makefile自体もまだ不完全で、ライブラリがエクスポートする関数を示すdefファイルをRubyで生成する手順になっているのが、Rubyインタプリタへのパスに空白と スラッシュが含まれているためにうまく動作せず、そのまま実行するとライブラリのバイナリ(http11.so)はできるものの何も関数が入っていないという状態になってしまう。そこで二重引用符でRubyインタプリタのパスを囲みスラッシュを\に変えなければならない。これでようやくまともなhttp11.soが出来上がるのでこれをMongrelのlibフォルダへ移動する。

最新版でチェックしても問題は解決しなかった。その問題とは、Firefoxではページが表示されるのにIE7だととにかく「ページを 表示できない」というDNSエラーの表示が出てどうにもならないというものである。タイムアウトはしていないのでソケット接続はしているようである。ま た、Windowsファイアウォールも適切に設定してあり、それ以前にファイアウォールの内側でテストしているのだから関係があるはずもない。冒頭に述べ たように幸いソケット部分はRubyなので簡単にデバッグできそうかな等と思い始めた頃にはたと思い当たりMongrel::Configuratorで指定しているリクエストチェインからMongrel::DeflateFilterを抜いてみる。これでやっとIE7でページを開くことが出来た。どうやらFirefoxと異なり圧縮モードへのIE7の対応に問題があったらしい。このライブラリが金を払う必要のある製品でないことだけが不幸中の幸いである。だが失った時間は帰ってこない。

コメント