←前  最新記事  次→

WEBrickサーバーでハマってます

こんにちは。Ruby初心者のkuroです。

現在、WindowsPC上に Ruby on Rails の環境を作って開発をしていますが、この数日、ピタッと進捗が停止しています。
原因は、Rubyに標準で同梱されている(開発用サーバーとしておなじみの)WEBrickにありそうなのですが、一向に解決策が見つからず困り果てています。

あまりに初歩的な疑問なので、なかなか諸先輩にも質問しずらく、まずは状況整理の意味でここに書いてみたというわけです。

<状況説明>
・次のような2つのプログラム(いずれもRuby)があります。
・1つは、ごく簡単なREST(GETメソッドを使ってアクセスするとXMLを返す)型のWebサービス。
・もう1つは、そのWebサービスを呼び出すクライアントページです。
・前者を「SP」、後者を「CP」と呼ぶことにします。

<現象>
・WEBrickを既定のポート番号で起動( http://localhost:3000/ )する。
・ブラウザでCPにアクセス( http://localhost:3000/CP/ )する。これは正常に動作している。
・CPの画面操作によって、Ajax通信(SPへのGETリクエスト)を実行する。
・ここでダンマリとなり、1分くらいでタイムアウト。

<考察1>
・試しに、ブラウザのアドレス欄に直接、SPのURIを入力してアクセスすると正常にレスポンス(XML)が帰ってきます。

<考察2>
・試しに、SPとCPを別々のサーバー(異なるポート番号で起動したWEBrick上)で動かすと、ちゃんと動くのです。
・CPからのリクエスト通り、SPからのレスポンスが瞬時に返ってきます。

<考察3>
・試しに、友人のヨッシーが借りているレンタルサーバー(Apache)でテストしたところ、SPとCPが同居していても正常に動作しました。

<まとめ>
・以上のことから、この現象はクライアントページとサーバーページが同一WEBrickサーバー上で動作する場合に起こるのではないかと推察されます。

何か解決策はあるのでしょうか?
それとも、そもそも、このような設計(SPとCPの同居)が望ましくないということはあるでしょうか?

どなたか、迷える子羊をお助けください。
(なんてここに書いて、はたして反応があるのだろうか・・・)

コメント (6)

masuidrive   2007-11-07 21:31

あまり関係ないかもしれませんが、localhostではなく、127.0.0.1にしてみてもらえますか?

同一ホストで通信するのは普通です。
なので、方法的にはあってると思います。

kuro   2007-11-07 23:37

師匠、じきじきのご登場ありがとうございます。
さっそく試しましたが改善されませんねぇ・・・

aike   2007-11-08 00:12

はじめまして。
システムの構成としては、とくに問題ないと思います。
あとはどのようにコーディングしているかですが……。

とりあえずサンプルプログラムを作ってみたので
試してみてください。
http://www.geocities.jp/aike1000/webrick.zip

tmaeda   2007-11-08 00:16

CPがlocalhost:3000で動いているのはわかりましたが、SPはどこで動いているのでしょうか?

もしSPもlocalhost:3000でしたら、デッドロックするので動かなくて当たり前な気がしますが。

snoozer05   2007-11-08 00:29

tmaedaさんが書かれているとおり、同じwebrick上で動かしているために、デットロックになっている線が濃厚ですねぃ。

kuro   2007-11-08 01:09

そうなんですか! サーバーがマルチスレッドでないためデッドロックが起こるんですね。
説明が不十分でしたが、「ブラウザ上のWebページ」→リクエスト→「サーバ・ページA」→リクエスト→「サーバ・ページB」という具合にリクエストをリレーしているので、サーバ・ページAの実行中にサーバ・ページBを起動しようとしてデッドロックに陥るわけですね。
納得です。アプリ構成を見直してみます。皆さん、ありがとうございました!