Apache2.0 の最も大きな特徴の 1 つに、サーバーデーモンの実行部分を司るプログラムが MPM(Multi-Proccessing Module) としてモジュール化され、使用する MPM を選択できるようになったことがあげられます。Apache には動作の異なるいくつかの MPM が用意されており、構築する Web サイトの規模や OS によって、最適な MPM を選択することが可能です。Linux で選択可能な MPM には、以下の種類があります。

Apache 1.3 の動作モデルと同様の方法でクライアントからのリクエストを処理します。prefork は、あらかじめ複数のプロセスを用意しておき、クライアントからのリクエストを待ち受けます。そして、用意したプロセス数を越えるリクエストが要求された場合、新たなプロセスを生成することにより、クライアントからのアクセスに対応します。

worker は、クライアントからのリクエストに対してプロセスではなく、スレッドで対応する動作モデルです。複数のプロセス内に複数のスレッドを用意し、クライアントからのリクエストを待ち受けます。プロセス間の切り替え時に発生するコンテキストスイッチが発生しないため、プロセスで動作する prefork よりも高いパフォーマンスを期待することができますが、1 つのスレッドに不具合が発生した場合、そのプロセスにあるスレッド全体に影響が及ぶため、安定性の面では、prefork に劣ります。
perchild は、worker と同様に、複数のプロセス内に複数のスレッドを用意し、クライアントからのリクエストを待ち受けます。しかし、perchild は worker と異なり、バーチャルホストでの使用を目的に設計された MPM です。perchild では、バーチャルホストごとにプロセス数を割り当て、さらにバーチャルホストごとに UserID と GroupID を設定することにより、各バーチャルホスト間のセキュリティを確保することができます。
このように、Linux で使用できる MPM にはいくつかの種類がありますが、MPM の選択は Apache のコンパイル時にどれか 1 つだけを選択しなければなりません。Turbolinux 10 Server では、Apache1.3 と互換性があり、動作の安定している prefork を標準の MPM として採用しています。しかし、MPM に worker を選択した httpd サーバープログラム(/usr/sbin/httpd.worker)も提供されているため、リコンパイルすることなくスレッド対応の worker に切り換えることも可能です。なお、Turbolinux 10 Server の Apache で perchild を使用することはできません。worker に切り換えるには、/etc/sysconfig/httpd に以下の行を追記します。このとき、既に Apache を起動しているに場合は、ファイルを変更する前に必ず Apache を停止してください。
HTTPD=/usr/sbin/httpd.worker |
追記後、Apache を起動します。
# /etc/init.d/httpd start |
これにより、MPM が worker の httpd デーモンを起動することができます。
![]() | MPM として worker を選択すると、PHP など一部のモジュールが正常に動作しません。また、/etc/httpd/conf/httpd.conf に記述可能なディレクティブも prefork の場合と異なるものがあります。十分に評価、検討の上で運用してください。ディレクティブの詳細は Apache のオンラインマニュアルを参照してください。 |
ここでは、Turbolinux 10 Server の Apache で使用可能な MPM である prefork と worker に関連するディレクティブを紹介します。/etc/httpd/conf/httpd.conf には、MPM を prefork にしたときと worker にしたときに有効となるディレクティブが以下のように記述されています。
# prefork MPM <IfModule prefork.c> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 1000 </IfModule> # worker MPM <IfModule worker.c> StartServers 2 MaxClients 150 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule> |
Apache が起動時に生成する httpd サーバープロセスの数を指定します。ここで指定したプロセス数は起動時のみ有効になります。prefork の場合、起動後のプロセス数は、MinSpareServers と MaxSpareServers ディレクティブの値により制限されます。
prefork の場合のみ有効なディレクティブです。クライアントからの要求を待ち受けている状態の httpd サーバープロセスの最小値を指定します。ここで指定した値よりもプロセス数が少なくなると、新たにプロセスを生成します。非常にアクセスの多いサイトではない限り、初期値のまま 5 に設定することを推奨します。
prefork の場合のみ有効なディレクティブです。クライアントからの要求を待ち受けている状態の httpd サーバープロセスの最大値を指定します。ここで指定した値よりもプロセス数が多くなると、プロセスを消去します。非常にアクセスの多いサイトではない限り、初期値のまま 10 に設定することを推奨します。
同時に常駐することができる httpd サーバープロセスの数を指定します。つまり、クライアントの最大接続数です。初期値は 150 です。prefork の場合は、プロセス数を指定し、worker の場合は、スレッド数を指定します。
1 つの httpd プロセスが処理できるリクエストの最大数を指定します。つまり、指定された数だけリクエストを処理したプロセスは強制的に終了し、新たにプロセスが生成されます。無制限に設定したい場合は、0 を指定します。
worker の場合のみ有効なディレクティブです。クライアントからの要求を待ち受けているスレッドの最小値を指定します。prefork の MinSpareServers に相当するディレクティブです。
worker の場合のみ有効なディレクティブです。クライアントからの要求を待ち受けているスレッドの最大値を指定します。prefork の MaxSpareServers に相当するディレクティブです。
worker の場合のみ有効なディレクティブです。worker のプロセス内に生成するスレッド数を指定します。スレッドはプロセスの開始時に生成され、その後にスレッドが生成されることはありません。スレッドが不足した場合は、新たにプロセスが生成され、ここで指定された数のスレッドがそのプロセス内に用意されます。