| <?xml version="1.0"?> | |
| <!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd"> | |
| <?xml-stylesheet type="text/xsl" href="../style/manual.en.xsl"?> | |
| <!-- $LastChangedRevision$ --> | |
| <!-- | |
| Licensed to the Apache Software Foundation (ASF) under one or more | |
| contributor license agreements. See the NOTICE file distributed with | |
| this work for additional information regarding copyright ownership. | |
| The ASF licenses this file to You under the Apache License, Version 2.0 | |
| (the "License"); you may not use this file except in compliance with | |
| the License. You may obtain a copy of the License at | |
| http://www.apache.org/licenses/LICENSE-2.0 | |
| Unless required by applicable law or agreed to in writing, software | |
| distributed under the License is distributed on an "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| See the License for the specific language governing permissions and | |
| limitations under the License. | |
| --> | |
| <modulesynopsis metafile="prefork.xml.meta"> | |
| <name>prefork</name> | |
| <description>Implements a non-threaded, pre-forking web server</description> | |
| <status>MPM</status> | |
| <sourcefile>prefork.c</sourcefile> | |
| <identifier>mpm_prefork_module</identifier> | |
| <summary> | |
| <p>This Multi-Processing Module (MPM) implements a non-threaded, | |
| pre-forking web server. Each server process may answer incoming | |
| requests, and a parent process manages the size of the server pool. | |
| It is appropriate for sites that need to avoid | |
| threading for compatibility with non-thread-safe libraries. It | |
| is also the best MPM for isolating each request, so that a problem | |
| with a single request will not affect any other.</p> | |
| <p>This MPM is very self-regulating, so it is rarely necessary to | |
| adjust its configuration directives. Most important is that | |
| <directive module="mpm_common">MaxRequestWorkers</directive> be big enough | |
| to handle as many simultaneous requests as you expect to receive, but | |
| small enough to assure that there is enough physical RAM for all | |
| processes.</p> | |
| <p>When built as a DSO module, it can be loaded with:</p> | |
| <highlight language="config"> | |
| LoadModule mpm_prefork_module modules/mod_mpm_prefork.so | |
| </highlight> | |
| </summary> | |
| <seealso><a href="../mpm.html">Multi-Processing Modules (MPMs)</a></seealso> | |
| <seealso><a href="../bind.html">Setting which addresses and ports Apache HTTP Server | |
| uses</a></seealso> | |
| <section id="how-it-works"><title>How it Works</title> | |
| <p>A single control process is responsible for launching child | |
| processes which listen for connections and serve them when they | |
| arrive. Apache httpd always tries to maintain several <dfn>spare</dfn> | |
| or idle server processes, which stand ready to serve incoming | |
| requests. In this way, clients do not need to wait for a new | |
| child processes to be forked before their requests can be | |
| served.</p> | |
| <p>The <directive module="mpm_common">StartServers</directive>, | |
| <directive module="prefork">MinSpareServers</directive>, | |
| <directive module="prefork">MaxSpareServers</directive>, and | |
| <directive module="mpm_common">MaxRequestWorkers</directive> regulate how | |
| the parent process creates children to serve requests. In general, | |
| Apache httpd is very self-regulating, so most sites do not need to | |
| adjust these directives from their default values. Sites which | |
| need to serve more than 256 simultaneous requests may need to | |
| increase <directive module="mpm_common">MaxRequestWorkers</directive>, | |
| while sites with limited memory may need to decrease <directive | |
| module="mpm_common">MaxRequestWorkers</directive> to keep the server from | |
| thrashing (swapping memory to disk and back). More information | |
| about tuning process creation is provided in the <a | |
| href="../misc/perf-tuning.html">performance hints</a> | |
| documentation.</p> | |
| <p>While the parent process is usually started as <code>root</code> | |
| under Unix in order to bind to port 80, the child processes are | |
| launched by Apache httpd as a less-privileged user. The <directive | |
| module="mod_unixd">User</directive> and <directive | |
| module="mod_unixd">Group</directive> directives are used to set | |
| the privileges of the Apache httpd child processes. The child processes | |
| must be able to read all the content that will be served, but | |
| should have as few privileges beyond that as possible.</p> | |
| <p><directive module="mpm_common">MaxConnectionsPerChild</directive> | |
| controls how frequently the server recycles processes by killing | |
| old ones and launching new ones.</p> | |
| <p>This MPM uses the <code>mpm-accept</code> mutex to serialize | |
| access to incoming connections when subject to the thundering herd | |
| problem (generally, when there are multiple listening sockets). | |
| The implementation aspects of this mutex can be configured with the | |
| <directive module="core">Mutex</directive> directive. The <a | |
| href="../misc/perf-tuning.html">performance hints</a> | |
| documentation has additional information about this mutex.</p> | |
| </section> | |
| <directivesynopsis location="mpm_common"><name>CoreDumpDirectory</name> | |
| </directivesynopsis> | |
| <directivesynopsis location="mpm_common"><name>EnableExceptionHook</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>MaxRequestWorkers</name> | |
| </directivesynopsis> | |
| <directivesynopsis location="mpm_common"><name>MaxMemFree</name> | |
| </directivesynopsis> | |
| <directivesynopsis location="mpm_common"><name>MaxConnectionsPerChild</name> | |
| </directivesynopsis> | |
| <directivesynopsis location="mpm_common"><name>ScoreBoardFile</name> | |
| </directivesynopsis> | |
| <directivesynopsis location="mpm_common"><name>ReceiveBufferSize</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="mod_unixd"><name>User</name> | |
| </directivesynopsis> | |
| <directivesynopsis location="mod_unixd"><name>Group</name> | |
| </directivesynopsis> | |
| <directivesynopsis> | |
| <name>MaxSpareServers</name> | |
| <description>Maximum number of idle child server processes</description> | |
| <syntax>MaxSpareServers <var>number</var></syntax> | |
| <default>MaxSpareServers 10</default> | |
| <contextlist><context>server config</context></contextlist> | |
| <usage> | |
| <p>The <directive>MaxSpareServers</directive> directive sets the | |
| desired maximum number of <em>idle</em> child server processes. An | |
| idle process is one which is not handling a request. If there are | |
| more than <directive>MaxSpareServers</directive> idle, then the | |
| parent process will kill off the excess processes.</p> | |
| <p>Tuning of this parameter should only be necessary on very | |
| busy sites. Setting this parameter to a large number is almost | |
| always a bad idea. If you are trying to set the value equal to or lower than | |
| <directive module="prefork">MinSpareServers</directive>, Apache HTTP Server | |
| will automatically adjust it to <directive | |
| >MinSpareServers</directive><code> + 1</code>.</p> | |
| </usage> | |
| <seealso><directive module="prefork">MinSpareServers</directive></seealso> | |
| <seealso><directive module="mpm_common">StartServers</directive></seealso> | |
| <seealso><directive module="mpm_common">MaxSpareThreads</directive></seealso> | |
| </directivesynopsis> | |
| <directivesynopsis> | |
| <name>MinSpareServers</name> | |
| <description>Minimum number of idle child server processes</description> | |
| <syntax>MinSpareServers <var>number</var></syntax> | |
| <default>MinSpareServers 5</default> | |
| <contextlist><context>server config</context></contextlist> | |
| <usage> | |
| <p>The <directive>MinSpareServers</directive> directive sets the | |
| desired minimum number of <em>idle</em> child server processes. An | |
| idle process is one which is not handling a request. If there are | |
| fewer than <directive>MinSpareServers</directive> idle, then the parent | |
| process creates new children: It will spawn one, wait a second, then spawn | |
| two, wait a second, then spawn four, and it will | |
| continue exponentially until it is spawning 32 children per second. It will | |
| stop whenever it satisfies the <directive>MinSpareServers</directive> | |
| setting.</p> | |
| <p>Tuning of this parameter should only be necessary on very | |
| busy sites. Setting this parameter to a large number is almost | |
| always a bad idea.</p> | |
| </usage> | |
| <seealso><directive module="prefork">MaxSpareServers</directive></seealso> | |
| <seealso><directive module="mpm_common">StartServers</directive></seealso> | |
| <seealso><directive module="mpm_common">MinSpareThreads</directive></seealso> | |
| </directivesynopsis> | |
| </modulesynopsis> | |