動作方法
一つの制御用プロセス (親) が子プロセスを起動します。
子プロセスは
ThreadsPerChild
ディレクティブで指定された一定数のサーバスレッドと接続を
listen するスレッドを一つ作ります。
Listener スレッドは接続が来たときにサーバプロセスに渡します。
Apache はスペアの、つまりアイドルなサーバスレッドの
プールを常に維持していて、それらは入ってくるリクエストに
答えられるように待機しています。
このようにして、クライアントはリクエストの応答が得られるようになるために
新しいスレッドやプロセスが生成されるのを
待たなくてもよいようになっています。
起動初期時のプロセス総数は、
StartServers
ディレクティブで設定されます。稼働中に、
Apache は全プロセスのアイドルスレッドの合計数を見積もって、
MinSpareThreads と
MaxSpareThreads
で指定された範囲の中にこの数が収まるように fork したり
kill したりします。この操作は非常に自律的なので、
これらのディレクティブをデフォルト値から変更する必要は
めったにないでしょう。
同時に応答することのできるクライアント数の最大数
(つまり全プロセス中の総スレッド数の最大値) は
MaxClients
ディレクティブで決定されます。
活動中の子プロセス数の最大値は
MaxClients を
ThreadsPerChild で割った
ものになります。
活動中の子プロセスの数と子プロセス中のサーバスレッドの数の越えられない
上限を設定するディレクティブが二つあります。これらはサーバを
完全に停止して、再起動することでしか変更することはできません。
ServerLimit
は活動中の子プロセスの越えられない上限を設定し、
MaxClients ディレクティブ
の値を
ThreadsPerChild の値で割った値以上である
必要があります。ThreadLimit は
サーバスレッドの越えられない上限で、ThreadsPerChild ディレクティブの
値以上である必要があります。
活動中の子プロセス群に加えて、少なくとも一つのサーバスレッドが
既存のクライアントからの接続を扱っている終了しようとしている
子プロセスがある可能性があります。終了中のプロセスは MaxClients で指定された数まで
存在できますが、実際に期待される数はずっと少なくなります。この
振舞いは各子プロセスを終了させないようにすることで回避できます。
これは以下の様にして実現できます。
-
MaxRequestsPerChild の値を 0 に設定する
-
MaxSpareThreads の値を
MaxClients
と同じ値にする
worker MPM の典型的なプロセス・スレッド制御の
設定では、次のようになります。
ServerLimit 16
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
通常 Unix では親プロセスは 80 番ポートにバインドするために
root
で起動されますが、子プロセスやスレッドは
もっと低い権限のユーザで Apache によって起動されます。
User と
Group ディレクティブは
Apache の子プロセスの権限を設定するのに用いられます。
子プロセスはクライアントに送るコンテンツ全てを読めないといけませんが、
可能な限り必要最小限の権限のみを持っているようにするべきです。
さらに、suexec
が使用されていない限り、これらのディレクティブは
CGI スクリプトで継承される権限も設定します。
MaxRequestsPerChild
は、古いプロセスを停止して新しいプロセスを起動することによって、
どの程度の頻度でサーバがプロセスをリサイクルするかを制御します。