SOAP4Rをfcgi経由で動かす

SOAP4Rのwsdl2ruby.rbが--type serverで生成してくれるスタンドアローンサーバーはデバッグに便利だけど、重いし、本運用には向かない。ので、Apacheの下にFastCGI経由でぶらさげて動かす。

Apacheの設定は普通なので略。

wsdl2ruby.rb --wsdl /path/to/wsdl --cgi_stub

これで、CGI版のスタブコードが生成される。 ServiceNameService.cgi っていう名前の筈。アプリケーションのメインのクラスが ::SOAP::RPC::StandaloneServer の代わりに ::SOAP::RPC::CGIStub を継承したものになっているのがポイント。

この CGIStub クラスはFastCGIにも対応している代物なので、ちょっと触るだけで済む。具体的には、スタブコードの最後の

PortNameApp.new('app', nil).start

これを次のように書き換える。

require 'fcgi'
FCGI.each do |fcgi|
  app = PortNameApp.new('app', nil)
  app.set_fcgi_request(fcgi)
  app.start
end

残念ながら、wsdl2ruby.rbが生成するスタブコードは複数のポートはサポートしない。だから、ポートごとに同様に作業をして、別々のfcgiファイルにするしかない。

SOAP-Actionヘッダフィールドを見てmod_rewriteしてやったら、エンドポイントのlocationは1つで複数のポートを提供できるかな。