<?xml version="1.0" encoding="iso-2022-jp"?>
<!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd">
<?xml-stylesheet type="text/xsl" href="../style/manual.ja.xsl"?>
<!-- English revision: 1.6 -->
<modulesynopsis>
<name>worker</name>
<description>マルチスレッドとマルチプロセスのハイブリッド型
ウェブサーバを実装したマルチプロセッシングモジュール</description>
<status>MPM</status>
<sourcefile>worker.c</sourcefile>
<identifier>mpm_worker_module</identifier>

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

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

</summary>
<seealso><a href="../bind.html">Apache 
の使用するアドレスとポートの設定</a></seealso>

<section><title>動作方法</title>
    <p>プロセスは決まった数のスレッドを持ちます。
    負荷への適応はプロセスの数を増減により対応します。</p>

    <p>一つの制御用プロセスが子プロセスを起動します。
    子プロセスは
    <directive module="mpm_common">ThreadsPerChild</directive>
    ディレクティブで指定された一定数のスレッドを作ります。
    それから、個々のスレッドがコネクションに対して listen
    して、しかるべき時に動作します。</p>

    <p>Apache は<em>スペアの</em>、つまりアイドルなサーバスレッドの
    プールを常に維持していて、それらは入ってくるリクエストに
    答えられるように待機しています。
    このようにして、クライアントはリクエストの応答が得られるようになるために
    新しいスレッドやプロセスが生成されるのを
    待たなくてもよいようになっています。
    起動初期時のプロセス総数は、
    <directive module="mpm_common">StartServers</directive>
    ディレクティブで設定されます。その後の稼働中に、
    Apache は全プロセスのアイドルスレッドの合計数を見積もって、
    <directive module="mpm_common">MinSpareThreads</directive> と
    <directive module="mpm_common">MaxSpareThreads</directive>
    で指定された範囲の中にこの数が収まるように fork したり
    kill したりします。この操作は非常に自律的なので、
    これらのディレクティブをデフォルト値から変更する必要は
    めったにないでしょう。
    同時に応答することのできるクライアント数の最大数
    (つまり全プロセス中の総スレッド数の最大値) は
    <directive module="mpm_common">MaxClients</directive>
    ディレクティブで決定されていて、
    一方で起動することのできるプロセス数の最大値は
    <directive module="mpm_common">ServerLimit</directive>
    ディレクティブで設定されています。
    <directive module="mpm_common">ServerLimit</directive> と
    <directive module="mpm_common">ThreadsPerChild</directive> との積は、
    <directive module="mpm_common">MaxClients</directive>
    と等しいかそれより大きい必要があります。</p>
    
    <p><module>worker</module> MPM の典型的なプロセス・スレッド制御の
    設定では、次のようになります。</p>

<example><pre>StartServers         2
MaxClients         150
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
ServerLimit         16</pre></example>

    <p>通常 Unix では親プロセスは 80 番ポートにバインドするために
    root で起動されますが、子プロセスやスレッドは
    もっと低い権限のユーザで Apache によって起動されます。
    <directive module="mpm_common">User</directive> と
    <directive module="mpm_common">Group</directive> ディレクティブは
    Apache の子プロセスの権限を設定するのに用いられます。
    子プロセスはクライアントに送るコンテンツ全てを読めないといけませんが、
    可能な限り必要最小限の権限のみを持っているようにするべきです。
    さらに、<a href="../suexec.html">suexec</a>
    が使用されていない限り、これらのディレクティブは
    CGI スクリプトで継承される権限も設定します。</p>

    <p><directive module="mpm_common">MaxRequestsPerChild</directive>
    は、古いプロセスを停止して新しいプロセスを起動することによって、
    どの程度の頻度でサーバがプロセスをリサイクルするかを制御します。</p>
</section>

<directivesynopsis location="mpm_common"><name>CoreDumpDirectory</name>
</directivesynopsis>
<directivesynopsis location="mpm_common"><name>Group</name>
</directivesynopsis>
<directivesynopsis location="mpm_common"><name>PidFile</name>
</directivesynopsis>
<directivesynopsis location="mpm_common"><name>Listen</name>
</directivesynopsis>
<directivesynopsis location="mpm_common"><name>ListenBacklog</name>
</directivesynopsis>
<directivesynopsis location="mpm_common"><name>LockFile</name>
</directivesynopsis>
<directivesynopsis location="mpm_common"><name>MaxClients</name>
</directivesynopsis>
<directivesynopsis location="mpm_common"><name>MaxRequestsPerChild</name>
</directivesynopsis>
<directivesynopsis location="mpm_common"><name>MaxSpareThreads</name>
</directivesynopsis>
<directivesynopsis location="mpm_common"><name>MinSpareThreads</name>
</directivesynopsis>
<directivesynopsis location="mpm_common"><name>ScoreBoardFile</name>
</directivesynopsis>
<directivesynopsis location="mpm_common"><name>SendBufferSize</name>
</directivesynopsis>
<directivesynopsis location="mpm_common"><name>ServerLimit</name>
</directivesynopsis>
<directivesynopsis location="mpm_common"><name>StartServers</name>
</directivesynopsis>
<directivesynopsis location="mpm_common"><name>ThreadLimit</name>
</directivesynopsis>
<directivesynopsis location="mpm_common"><name>ThreadsPerChild</name>
</directivesynopsis>
<directivesynopsis location="mpm_common"><name>User</name>
</directivesynopsis>

</modulesynopsis>
