Apacheの異常終了(一応解決)

 Apacheがエラーを出しまくっていたので、調査。最終的にはZend Framework/Smarty上に組んだサイトをとめたら現象が起きなくなった。

環境

  • FreeBSD 9.0
  • Apache 2.2.22
  • PHP 5.4.3
  • Perl 5.14.2
  • Zend Framework 1.5.3
  • Smarty 2.6.20

エラーの状況

  • Webサーバのカーネルログ上に、日々次のようなエラーが大量に残る。signal 11とはつまり、segmentation fault。
  •  Apacheのログには、次のようなエラーが残る。分類は [info]。

    おそらく、segmentation faultと原因は一緒と推測される。というか、segmentation faultでサーバが落ちてしまうことが原因となって、このエラーが出るのだろう。

  • Webページをアクセスすると、空白のページが出力されることがある。毎回そうなるわけではなく、何度かリロードすると正しく表示される。空白のページになるのは、Zend Framework 1.5.3+Smarty 2.6.20で作成したページのみ。WordPress 3.3.2ではそのような問題は出ない。

core dumpの生成

  • /usr/local/etc/apache22/httpd.confに次の行を追加して、様子を見てみる。でもcoreが残らない。
  • ulimit -cで設定されているcoreファイルサイズの上限を超えるとcoreファイルが出力されないらしい。ulimit -cでサイズを確認し、必要に応じてunlimitedに設定する。

    確認したところ、unlimitedだった。

  • sysctlで、kern.sugid_coredumpが1に設定されていないとcoreが出力されないらしい。
  • Apacheを再起動。

    これで/tmpの下にhttpd.coreが出力されるようになった。

 coreの解析

  • gdbで開いてみる。

試行錯誤

  • スタックトレースの中にmod_writeがあるので、.htaccessの設定を見てみる。ZendFramework用に次のように設定してあった。

    これを、次のように書き換えてみて様子を見る。

    → segmentation faultは解消されない。

  • Zend Frameworkを1.5.3 → 1.11.11にアップデート。
    → segmentation faultは解消されない。ただし、微妙にトレース内容が変化。
  • Smarty 2.6.20 → 2.6.26にアップデートしてみる。
    → segmentation faultは解消されない。ただし、微妙にトレース内容が再び変化。SimpleXMLで落ちているように見える。
  • Smartyを3.1.10に上げるにはコーディングの見直しが必要らしいので、保留。SmartyかZend Frameworkのいずれかが原因と思われるも、これ以上の調査は今のところできない。
  • PHP 5.4.4にアップグレード。(2012-06-15)
    2台あるWebサーバーのうち、zend_objects_clone_membersでsegmentation faultを起こしていた方は異常終了しなくなった。しかし、メインで動かしている方は、相変わらずzend_std_object_get_classで落ちる。
  • PHP 5.4.5にアップグレード。(2012-07-31)
    変化なし。
  • Zend FrameworkおよびSmartyを使ったサイトの運用を停止したところ、現象が起きなくなった。いずれかのパッケージに原因があると思われるも、いずれのパッケージも今後使うことはなさそうなので、調査はこれにて終了。(2014-06-16)

cf. 「インフラエンジニアがSegmentation fault をなんとか治してみる」 (メモとかそんな感じなやつ)