Apache1.3+FastCGIでRubricksコンポーネントインストールでエラー

Rubricks0.5.3+Apache1.3+FastCGIでコンポーネントのインストールテストしてみたらいきなりInternal Server Errorが発生。Apacheのerror_logをみると、

FastCGI: comm with server "/usr/local/www/rubricks/public/dispatch.fcgi" \
  aborted: error parsing headers: \
    malformed header '== RublogSchema  migrating == ...'

メッセージの見るとmigrateのところでFastCGIがエラーを出しています。mod_fastcgiのソースを追ってみたら、process_headersのパース処理で\0,\v,\f,:,\tのキャラクタはNGとしています。malformed headerの後に続く引用符の中はその時処理していたヘッダの一行目が出力されています。rubricksのコンポーネントインストールの処理ではActiveRecord::Migratorを使用していますがこの処理でstdoutにmigrate情報を出力しているのが問題なようです。

== mod_fastcgi.c ==
switch(*p) {
case '\0':
case '\v':
case '\f':
  name = "Invalid Character";
  goto BadHeader;
default:
  flag = 0;
  break;
}
(略)
for(;;) {
  next = get_header_line(name = next, TRUE);
  if (*name == '\0') {
    break;
  }
  if ((p = strchr(name, ':')) == NULL) {
    goto BadHeader;
  }
  value = p + 1;
  while (p != name && isspace((unsigned char)*(p - 1))) {
    p--;
  }
  if (p == name) {
    goto BadHeader;
  }
  *p = '\0';
  if (strpbrk(name, " \t") != NULL) {
    *p = ' ';
    goto BadHeader;
  }
  (略)
}

Migratorクラスは#:nodocになっているし、あくまでも運用ツールの位置づけでこういう使い方は想定していないのでしょうか?デフォルトがverbose = trueなんですね。ということで、${RUBRICKS_ROOT}/app/model/rubricks_component.rbのinstall/uninstall/updateの各処理のActiveRecord::Migrator.migrate(...)の前に

ActiveRecord::Migration.verbose = false

の一行を追加したところ無事インストール処理を完了することができました。

実は、Apache1.3+FastCGIの組み合わせでテストしようと思ったのは僕のレンタルしているサーバ環境でも(事象は違うものの)コンポーネントインストール時にエラーが発生していたのでその調査をしようということだったのですが、果たしてこの一行を入れてみたらうまくいきました。Migratorの出力するメッセージが原因でFastCGIが暴走することがあるようです。(FedoraCoreでの試験でも二度ほど暴走しました。)

PS. MacOSX Apache1.3.33+FastCGIでも同様の現象および解決を確認

この記事のトラックバックURL:

http://hippos-lab.com/blog/trackback/84

Comments

utaさん、こんにちは。

例の現象が再現できてから報告しようと思っていたのですが結局再現できませんでした。ただ、verbose=faseとすることでちゃんと動作しましたので原因はこれと思って間違いないのだと思います。ざっとソースをみたところ#ifdef APACHE2で囲われていませんでしたのでApache[12]+ and not WIN32であれば同様のことが起こるように思います。Win32の場合は挙動が違うかも知れませんね。Lighttpd付属のmod_fastcgiはOKみたいです。(というか全然ソースが違う)

いずれにせよ、個人的にはすっきりしました。なにしろいつも手動でしたから...最初から同じ環境作ってテストすればよかったですね。また、なにかわかれば報告します。

hipposさんこんにちは、utaです。

Apache+FastCGIはSTDOUTの制御がうまくできなくて、
pやputsで出力をするだけでも挙動がおかしくなることがあるんですよね。

以前問題となったコンポーネントインストール関係もそれでしたか。
調査お疲れ様でした。

0.5.4にて各環境でテストを実施の上、取り込ませて頂きます。