Apache HTTP サーバ バージョン 2.4

Apache > HTTP サーバ > ドキュメンテーション > バージョン 2.4 > モジュール

# Apache MPM worker

この日本語訳はすでに古くなっている 可能性があります。 最近更新された内容を見るには英語版をご覧下さい。

説明: | マルチスレッドとマルチプロセスのハイブリッド型 ウェブサーバを実装したマルチプロセッシングモジュール
ステータス: | MPM
モジュール識別子: | mpm_worker_module
ソースファイル: | worker.c

### 概要

このマルチプロセッシングモジュール (MPM) は、マルチスレッドとマルチプロセスのハイブリッド型サーバを 実装しています。リクエストの応答にスレッドを使うと、 プロセスベースのサーバよりも少ないシステム資源で、 多くのリクエストに応答することができます。 それにもかかわらず、多くのスレッドを持った複数のプロセスを 維持することで、 プロセスベースのサーバの持つ安定性も保持しています。

この MPM を制御するのに使われる最も重要なディレクティブは、 `ThreadsPerChild` と `MaxClients` です。 `ThreadsPerChild` は 各子プロセスで用意されるスレッド数を制御して、 `MaxClients` は 起動されるスレッドの総数の最大値を制限します。

### トピック

- 動作方法

### ディレクティブ

### Bugfix checklist

- httpd changelog
- Known issues
- Report a bug

### 参照

- Apache の使用するアドレスとポートの設定

## 動作方法

一つの制御用プロセス (親) が子プロセスを起動します。 子プロセスは `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` は、古いプロセスを停止して新しいプロセスを起動することによって、 どの程度の頻度でサーバがプロセスをリサイクルするかを制御します。