perchild MPM

バーチャルホスト単位で異なる user ID により httpd を実行できる という perchild MPM の機能は魅力的だが,不安定なのが泣き所と 困ってる人も少なくないでしょう.その不安定さの一つの原因は setjmp() / longjmp() が thread-safe でない使い方をされていたと いうことなのですが,この問題は trunk では fix されているものの, 2.0 にはバックポートされていません.perchild MPM を使いたいなら, trunk のものを使いましょう.なお,開発があまり進んでいない experimental な MPM はリリースに含めないと言う方針のため, 2.2 には含まれないこととなってしまいました.

あるいは, Metux MPM を使うのもいいでしょう.上記のような perchild MPM と同等の機能を有する上, perchild MPM よりも安定度はいいようです.

# どうでもいいですが,個人的には worker MPM のような スレッド数固定・プロセス数可変という形態よりも, perchild MPM のようなプロセス数固定・スレッド数可変という 形態の方が好みではあります.listener スレッドと worker スレッドを分離しているという worker MPM の方式が perchild MPM にも導入されると,なおいいのですが.

Solaris 上でのビルド

Solaris で perchild MPM / Metux MPM を利用するなら,Apache ビルドの際に

-D_XOPEN_SOURCE=500 -D__EXTENSIONS__

というマクロ定義が必要です.これは sendmsg() / recvmsg() の仕様が,そのマクロ定義なしの場合と異なるためです.