Apache HTTP サーバ バージョン 2.2
Apache MPM worker
説明: | マルチスレッドとマルチプロセスのハイブリッド型 ウェブサーバを実装したマルチプロセッシングモジュール |
---|---|
ステータス: | MPM |
モジュール識別子: | mpm_worker_module |
ソースファイル: | worker.c |
概要
このマルチプロセッシングモジュール (MPM) は、マルチスレッドとマルチプロセスのハイブリッド型サーバを 実装しています。リクエストの応答にスレッドを使うと、 プロセスベースのサーバよりも少ないシステム資源で、 多くのリクエストに応答することができます。 さらに、多くのスレッドを持った複数のプロセスを維持することで、 プロセスベースのサーバの持つ安定性を保持しています。
この MPM を制御するのに使われる最も重要なディレクティブは、
ThreadsPerChild
と
MaxClients
です。
ThreadsPerChild
は
各子プロセスで用意されるスレッド数を制御して、
MaxClients
は
起動されるスレッドの総数の最大値を制限します。
動作方法
一つの制御用プロセス (親) が子プロセスを起動します。
子プロセスは
ThreadsPerChild
ディレクティブで指定された一定数のサーバスレッドと接続を
listen するスレッドを一つ作ります。
Listener スレッドは接続が来たときにサーバプロセスに渡します。
Apache はスペアの、つまりアイドルなサーバスレッドの
プールを常に維持していて、それらは入ってくるリクエストに
答えられるように待機しています。
このようにして、クライアントはリクエストの応答が得られるようになるために
新しいスレッドやプロセスが生成されるのを
待たなくてもよいようになっています。
起動初期時のプロセス総数は、
StartServers
ディレクティブで設定されます。その後の稼働中に、
Apache は全プロセスのアイドルスレッドの合計数を見積もって、
MinSpareThreads
と
MaxSpareThreads
で指定された範囲の中にこの数が収まるように fork したり
kill したりします。この操作は非常に自律的なので、
これらのディレクティブをデフォルト値から変更する必要は
めったにないでしょう。
同時に応答することのできるクライアント数の最大数
(つまり全プロセス中の総スレッド数の最大値) は
MaxClients
ディレクティブで決定されます。
活動中の子プロセス数の最大値は
MaxClients
を
ThreadsPerChild
で割った
ものになります。
活動中の子プロセスの数と子プロセス中のサーバスレッドの数の越えられない
上限を設定するディレクティブが二つあります。これらはサーバを
完全に停止して、再起動することでしか変更することはできません。
ServerLimit
は活動中の子プロセスの越えられない上限を設定し、
MaxClients
ディレクティブ
の値を
ThreadsPerChild
の値で割った値以上である
必要があります。ThreadLimit
は
サーバスレッドの越えられない上限で、ThreadsPerChild
ディレクティブの
値以上である必要があります。デフォルト以外の値を指定する場合は
他の worker
ディレクティブよりも前に書かれている
必要があります。
活動中の子プロセス群に加えて、少なくとも一つのサーバスレッドが
既存のクライアントからの接続を扱っている終了しようとしている
子プロセスがある可能性があります。終了中のプロセスは 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
は、古いプロセスを停止して新しいプロセスを起動することによって、
どの程度の頻度でサーバがプロセスをリサイクルするかを制御します。