| <?xml version="1.0"?> | |
| <!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd"> | |
| <?xml-stylesheet type="text/xsl" href="../style/manual.de.xsl"?> | |
| <!-- English Revision: 280384:1935407 (outdated) --> | |
| <!-- | |
| 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="worker.xml.meta"> | |
| <name>worker</name> | |
| <description>Multi-Processing-Modul, das einen Hybrid-Webserver mit | |
| Multi-Thread und Multi-Prozess-Unterstützung implementiert</description> | |
| <status>MPM</status> | |
| <sourcefile>worker.c</sourcefile> | |
| <identifier>mpm_worker_module</identifier> | |
| <summary> | |
| <p>Dieses Multi-Processing-Modul (MPM) implementiert einen Hybrid-Server | |
| mit Multi-Thread und Multi-Prozess-Unterstützung. Durch die Verwendung | |
| von Threads für die Bedienung von Anfragen ist er in der Lage, | |
| eine große Anzahl von Anfragen mit weniger Systemressourcen als | |
| ein Prozess-basierter Server zu bedienen. Er behält jedoch viel von | |
| der Stabilität eines Prozess-basierten Servers bei, indem er | |
| mehrere Prozesse verfügbar hält, jeden mit etlichen Threads.</p> | |
| <p>Die wichtigsten Direktiven zur Steuerung des MPMs sind <directive | |
| module="mpm_common">ThreadsPerChild</directive>, welche die Anzahl | |
| der Threads beeinflusst, die von jedem Kindprozess verwendet werden, und | |
| <directive module="mpm_common">MaxClients</directive>, welche die | |
| maximale Gesamtzahl an Threads regelt, die gestartet werden | |
| können.</p> | |
| </summary> | |
| <seealso><a href="../bind.html">Bestimmen der vom Apache verwendeten Adressen | |
| und Ports</a></seealso> | |
| <section id="how-it-works"><title>Arbeitsweise</title> | |
| <p>Ein einzelner Steuerprozess (der Elternprozess) ist für den | |
| Start der Kindprozesse verantwortlich. Jeder Kindprozess erstellt eine | |
| feste Anzahl von Server-Threads, wie durch die <directive | |
| module="mpm_common">ThreadsPerChild</directive>-Direktive | |
| angegeben, sowie einen "Listener-Thread", der auf Verbindungen wartet und | |
| diese an einen Server-Thread zur Bearbeitung weiterreicht, sobald sie | |
| eintreffen.</p> | |
| <p>Der Apache versucht immer, einen Vorrat von <dfn>freien</dfn> oder | |
| unbeschäftigten Threads zu verwalten, die zur Bedienung | |
| hereinkommender Anfragen bereit stehen. Auf diese Weise brauchen | |
| Clients nicht auf die Erstellung eines neuen Threads oder Prozesses | |
| zu warten, bevor ihre Anfrage bedient werden kann. Die Anzahl der | |
| Prozesse, die anfangs gestartet wird, wird mit der Direktive | |
| <directive module="mpm_common">StartServers</directive> festgelegt. | |
| Dann, während des Betriebes, berechnet der Apache die Gesamtzahl | |
| der unbeschäftigten Threads und forkt oder beendet Prozesse, um diese | |
| Anzahl innerhalb der durch <directive | |
| module="mpm_common">MinSpareThreads</directive> und <directive | |
| module="mpm_common">MaxSpareThreads</directive> angegebenen Grenzen | |
| zu halten. Da dieser Prozess sehr selbstregulierend ist, ist es nur selten | |
| notwendig, die Voreinstellung dieser Direktiven zu ändern. Die | |
| maximale Anzahl Clients, die gleichzeitig bedient werden kann (d.h. | |
| die maximale Gesamtzahl der Threads in allen Prozessen), wird mit der | |
| Direktive <directive module="mpm_common">MaxClients</directive> | |
| festgelegt. Die maximale Anzahl der aktiven Kindprozesse ergibt sich aus | |
| <directive module="mpm_common">MaxClients</directive> dividiert durch | |
| <directive module="mpm_common">ThreadsPerChild</directive>.</p> | |
| <p>Zwei Direktiven legen harte Limits für die Anzahl der aktiven | |
| Kindprozesse fest und können nur geändert werden, indem der Server | |
| komplett gestoppt und dann wieder neu gestartet wird. <directive | |
| module="mpm_common">ServerLimit</directive> stellt die obere Grenze für | |
| die Anzahl der aktiven Kindprozesse dar und muss größer oder | |
| gleich dem Quotienten aus <directive | |
| module="mpm_common">MaxClients</directive> und <directive | |
| module="mpm_common">ThreadsPerChild</directive> sein. <directive | |
| module="mpm_common">ThreadLimit</directive> ist die obere Grenze für | |
| die Anzahl der Server-Threads und muss größer oder gleich | |
| <directive module="mpm_common">ThreadsPerChild</directive> sein. Sofern für | |
| diese Direktiven keine Voreinstellungen verwendet werden, sollten sie vor | |
| allen anderen <module>worker</module>-Direktiven platziert werden.</p> | |
| <p>Neben den normalen aktiven Kindprozessen gibt es möglicherweise noch | |
| zusätzliche Kindprozesse, welche gerade beendet werden, wo allerdings | |
| zumindest noch ein Server-Thread eine existierende Verbindung bearbeitet. | |
| Obwohl die tatsächlich zu erwartende Anzahl deutlich kleiner ist, | |
| können bis zu <directive module="mpm_common">MaxClients</directive> | |
| solcher Prozesse auftreten. Dieses Verhalten können Sie vermeiden, | |
| indem Sie die Terminierung einzelner Kindprozesse wie folgt abschalten:</p> | |
| <ul> | |
| <li>setzen Sie den Wert von <directive module="mpm_common" | |
| >MaxRequestsPerChild</directive> auf Null</li> | |
| <li>setzen Sie den Wert von <directive module="mpm_common" | |
| >MaxSpareThreads</directive> auf den gleichen Wert wie <directive | |
| module="mpm_common">MaxClients</directive></li> | |
| </ul> | |
| <p>Eine typische Konfiguration der Prozess-Thread-Steuerung für | |
| das MPM <module>worker</module> könnte wie folgt aussehen:</p> | |
| <example> | |
| ServerLimit 16<br /> | |
| StartServers 2<br /> | |
| MaxClients 150<br /> | |
| MinSpareThreads 25<br /> | |
| MaxSpareThreads 75<br /> | |
| ThreadsPerChild 25 | |
| </example> | |
| <p>Während der Elternprozess unter Unix normalerweise als | |
| <code>root</code> gestartet wird, um sich an Port 80 binden zu können, | |
| werden die Kindprozesse und Threads unter einem weniger privilegierten | |
| Benutzer gestartet. Die Direktiven <directive | |
| module="mpm_common">User</directive> und <directive | |
| module="mpm_common">Group</directive> werden dazu verwendet, die | |
| Privilegien der Apache-Kindprozesse festzulegen. Die Kindprozesse | |
| müssen in der Lage sein, alle Inhalte zu lesen, die sie ausliefern | |
| sollen, sollten darüber hinaus jedoch so wenig wie möglich Rechte | |
| besitzen. Zusätzlich, solange nicht <program> | |
| suexec</program> verwendet wird, legen diese | |
| Direktiven auch die Privilegien fest, die von CGI-Skripts | |
| geerbt werden.</p> | |
| <p><directive module="mpm_common">MaxRequestsPerChild</directive> | |
| bestimmt, wie häufig der Server Prozesse erneuert, indem er alte | |
| beendet und neue startet.</p> | |
| </section> | |
| <directivesynopsis location="mpm_common"><name>AcceptMutex</name> | |
| </directivesynopsis> | |
| <directivesynopsis location="mpm_common"><name>CoreDumpDirectory</name> | |
| </directivesynopsis> | |
| <directivesynopsis location="mpm_common"><name>EnableExceptionHook</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>MaxMemFree</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>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="mpm_common"><name>ThreadLimit</name> | |
| </directivesynopsis> | |
| <directivesynopsis location="mpm_common"><name>ThreadsPerChild</name> | |
| </directivesynopsis> | |
| <directivesynopsis location="mpm_common"><name>ThreadStackSize</name> | |
| </directivesynopsis> | |
| <directivesynopsis location="mpm_common"><name>User</name> | |
| </directivesynopsis> | |
| </modulesynopsis> |