9.6. MPM(Multi-Proccessing Module)の設定

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

prefork

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

worker

worker は、クライアントからのリクエストに対してプロセスではなく、スレッドで対応する動作モデルです。複数のプロセス内に複数のスレッドを用意し、クライアントからのリクエストを待ち受けます。プロセス間の切り替え時に発生するコンテキストスイッチが発生しないため、プロセスで動作する prefork よりも高いパフォーマンスを期待することができますが、1 つのスレッドに不具合が発生した場合、そのプロセスにあるスレッド全体に影響が及ぶため、安定性の面では、prefork に劣ります。

perchild

perchild は、worker と同様に、複数のプロセス内に複数のスレッドを用意し、クライアントからのリクエストを待ち受けます。しかし、perchild は worker と異なり、バーチャルホストでの使用を目的に設計された MPM です。perchild では、バーチャルホストごとにプロセス数を割り当て、さらにバーチャルホストごとに UserID と GroupID を設定することにより、各バーチャルホスト間のセキュリティを確保することができます。

event

event は、worker と同様に、複数のプロセス内に複数のスレッドを用意し、クライアントからのリクエストを待ち受けます。しかし、event は worker と異なり Keep Alive リクエストを処理する際、新たなコネクションを受け入れるためのスレッドとは別のスレッドを使用します。2007年8月現在、mod_ssl モジュールや他の入力フィルタとの互換性がないなどの制限があります。

このように、Linux で使用できる MPM にはいくつかの種類がありますが、MPM は Apache のコンパイル時にどれか 1 つだけを選択しなければなりません。Turbolinux 11 Server では、Apache1.3 と互換性があり、動作の安定している prefork を標準の MPM として採用しています。しかし、MPM に worker を選択した httpd サーバープログラム(/usr/sbin/httpd.worker)も提供されているため、リコンパイルすることなくスレッド対応の worker に切り換えることも可能です。なお、Turbolinux 11 Server の Apache で perchild や event を使用することはできません。worker に切り換えるには、/etc/sysconfig/httpd に以下の行を追加します。Turbolinux 11 Server ではコメントとして記述がありますので行頭のコメント記号(#)を削除するだけです。このとき、既に Apache を起動しているに場合は、ファイルを変更する前に必ず Apache を停止してください。

HTTPD=/usr/sbin/httpd.worker

編集後、Apache を起動します。

# /etc/init.d/httpd start

これにより、MPM が worker の httpd デーモンを起動することができます。

注意

MPM として worker を選択すると、/etc/httpd/conf/httpd.conf に記述可能なディレクティブは、prefork の場合と異なるものがあります。十分に評価、検討の上で運用してください。ディレクティブの詳細は Apache のオンラインマニュアルを参照してください。

ここでは、Turbolinux 11 Server の Apache で使用可能な MPM である prefork と worker に関連するディレクティブを紹介します。/etc/httpd/conf/httpd.conf には、MPM を prefork にしたときと worker にしたときに有効となるディレクティブが以下のように記述されています。

# prefork MPM
<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000
</IfModule>

# worker MPM
<IfModule worker.c>
StartServers         2
MaxClients         150
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>

StartServers number

Apache が起動時に生成する httpd サーバープロセスの数を指定します。ここで指定したプロセス数は起動時のみ有効になります。prefork の場合、起動後のプロセス数は、MinSpareServers と MaxSpareServers ディレクティブの値により制限されます。

MinSpareServers number

prefork の場合のみ有効なディレクティブです。クライアントからの要求を待ち受けている状態の httpd サーバープロセスの最小値を指定します。ここで指定した値よりもプロセス数が少なくなると、新たにプロセスを生成します。非常にアクセスの多いサイトではない限り、初期値のまま設定することを推奨します。

MaxSpareServers number

prefork の場合のみ有効なディレクティブです。クライアントからの要求を待ち受けている状態の httpd サーバープロセスの最大値を指定します。ここで指定した値よりもプロセス数が多くなると、プロセスを消去します。非常にアクセスの多いサイトではない限り、初期値のまま設定することを推奨します。

ServerLimit number

prefork の場合は、サーバープロセスと同時接続クライアント数は等しくなるためここでの指定は MaxClients に設定可能な上限値となります。worker の場合は、ThreadLimit と組み合わせることで、MaxClients に設定可能な上限値になります。

MaxClients number

同時に常駐することができる httpd サーバープロセスの数を指定します。つまり、クライアントの最大接続数です。prefork の場合は、プロセス数を指定し、worker の場合は、スレッド数を指定します。

MaxRequestsPerChild number

1 つの httpd プロセスが処理できるリクエストの最大数を指定します。つまり、指定された数だけリクエストを処理したプロセスは強制的に終了し、新たにプロセスが生成されます。無制限に設定したい場合は、0 を指定します。

MinSpareThreads number

worker の場合のみ有効なディレクティブです。クライアントからの要求を待ち受けているスレッドの最小値を指定します。prefork の MinSpareServers に相当するディレクティブです。

MaxSpareThreads number

worker の場合のみ有効なディレクティブです。クライアントからの要求を待ち受けているスレッドの最大値を指定します。prefork の MaxSpareServers に相当するディレクティブです。

ThreadsPerChild number

worker の場合のみ有効なディレクティブです。worker のプロセス内に生成するスレッド数を指定します。スレッドはプロセスの開始時に生成され、その後にスレッドが生成されることはありません。スレッドが不足した場合は、新たにプロセスが生成され、ここで指定された数のスレッドがそのプロセス内に用意されます。