持続的接続を理解するために(その5)
持続的接続はapacheの子プロセスとの関連性が深い。だからapacheを理解することも必要だ。ということでマニュアルに目を通してみる。
目を通していると昔(サーバ管理をしていた頃)の記憶がちょっとだけよみがえる。PHPのマニュアルとか探すとその記述を見つけた。
http://www.php.net/manual/ja/faq.installation.php
PHPはグルー(糊)です。このグルーは、多くのサードパーティ製のライブラリをくっつけることによりクールなWebアプリケーションを構築するために使用され、直観的で簡単に習得できる言語インターフェイスにより、一つの整合性のある実体として見せることができます。PHPの柔軟性と力は、プラットフォームの安定性と堅牢性に基づいています。グルーによる結合をするためには、OSやWebサーバ、サードパーティ製のライブラリを必要とします。これらの一つの機能が停止した場合、PHPは問題を特定し、速やかに修正する手段を必要とします。実行スレッドを完全に分離しなかったり、メモリセグメントを完全に分離しなかったり、各リクエストで使用される強力なサンドボックスを有さないことで、基本的なフレームワークをより複雑なものにした場合、PHPのシステムに弱点が生まれます。
これは「なぜ、Apache2のマルチスレッドMPMモード(worker)を実運用環境で使用するべきではないのですか?」で記載されている文章。つまり(多分)、モジュール版のPHPを使用する場合はマルチスレッドMPMモードではなくMPM preforkモード(1.3系と同等)で使用しなさい、という意味に取れる。スレッドセーフではない、ってことかな。
マルチスレッドだと、処理の単位はスレッド(だと思う)。workerの場合、スレッドは子プロセスが複数のスレッドを管理しているわけで、子プロセス単位で持続的接続が共有されていると仮定すると、同じ子プロセス内の別のスレッドで同時に別々のリクエストを処理した場合、明らかに問題が出そうだ。こういうことなのかな。
ということで、まず、PHPはpreforkなapacheで動作させないといけないのだろう。
実際調べてみると、Debianやubuntuではapacheのパッケージはapache2-mpm-workerとapache2-mpm-preforkという別々のパッケージがあり、事前にworker版がインストールされていると、mod_phpをインストールする際に、それを削除してprefork版をインストールするようだ。Vineではパッケージこそ分かれていないけど、そもそもworkerで設定されているとPHPが動かないようだ。
そういうことを考えれば、おそらく出回っているサーバ(Linux系)は、ほとんどがpreforkで動作していると思ってよさそうだ。