|  | <?xml version='1.0' encoding='UTF-8' ?> | 
|  | <!DOCTYPE manualpage SYSTEM "./style/manualpage.dtd"> | 
|  | <?xml-stylesheet type="text/xsl" href="./style/manual.de.xsl"?> | 
|  | <!-- English Revision: 239255:1174747 (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. | 
|  | --> | 
|  |  | 
|  | <manualpage metafile="stopping.xml.meta"> | 
|  |  | 
|  | <title>Beenden und Neustarten</title> | 
|  |  | 
|  | <summary> | 
|  | <p>Dieses Dokument umfasst das Beenden und Neustarten des | 
|  | Apache auf Unix-ähnlichen Systemen. Anwender von Windows NT, 2000 | 
|  | und XP sollten <a href="platform/windows.html#winsvc">Betreiben | 
|  | des Apache als Dienst</a> lesen, während hingegen Anwender von | 
|  | Windows 9x sowie ME <a href="platform/windows.html#wincons">Betreiben | 
|  | des Apache als Konsolenanwendung</a> lesen sollten, um mehr Informationen | 
|  | zur Handhabung des Apache auf diesen Systemen zu erhalten.</p> | 
|  | </summary> | 
|  |  | 
|  | <seealso><program>httpd</program></seealso> | 
|  | <seealso><program>apachectl</program></seealso> | 
|  |  | 
|  | <section id="introduction"><title>Einleitung</title> | 
|  |  | 
|  | <p>Um den Apache zu stoppen oder neu zu starten, müssen Sie | 
|  | ein Signal an den laufenden <program>httpd</program>-Prozess senden. Es gibt | 
|  | zwei Möglichkeiten, diese Signale zu senden. Zum einen können | 
|  | Sie den Unix-Befehl <code>kill</code> verwenden, um den Prozessen | 
|  | direkt Signale zu senden. Sie werden feststellen, dass auf Ihrem | 
|  | System mehrere <program>httpd</program>-Programme laufen. Sie sollten | 
|  | jedoch nicht jedem dieser Prozesse ein Signal senden, sondern nur dem | 
|  | Elternprozess, dessen PID im <directive | 
|  | module="mpm_common">PidFile</directive> steht. Das heißt, Sie | 
|  | sollten es niemals nötig haben, einem anderen Prozess, als dem | 
|  | Elternprozess, ein Signal zu senden. Es gibt drei Signale, die Sie an den | 
|  | Elternprozess senden können: <code><a href="#term">TERM</a></code>, | 
|  | <code><a href="#hup">HUP</a></code> und | 
|  | <code><a href="#graceful">USR1</a></code>, die nachfolgend beschrieben | 
|  | werden.</p> | 
|  |  | 
|  | <p>Um dem Elternprozess ein Signal zu senden, verwenden Sie einen | 
|  | Befehl wie z.B.:</p> | 
|  |  | 
|  | <example>kill -TERM `cat /usr/local/apache2/logs/httpd.pid`</example> | 
|  |  | 
|  | <p>Die zweite Methode, dem <program>httpd</program>-Prozess zu | 
|  | signalisieren, ist die Verwendung der <code>-k</code>-Befehlszeilenoptionen | 
|  | <code>stop</code>, <code>restart</code> und <code>graceful</code>, wie | 
|  | unten beschrieben. Dies sind Argumente des <program> | 
|  | httpd</program>-Programms, es wird jedoch | 
|  | empfohlen, sie unter Verwendung des Steuerskripts <program> | 
|  | apachectl</program> zu senden, welches diese | 
|  | an <program>httpd</program> durchreicht.</p> | 
|  |  | 
|  | <p>Nachdem Sie <program>httpd</program> signalisiert haben, können Sie | 
|  | dessen Fortschritt beobachten, indem Sie eingeben:</p> | 
|  |  | 
|  | <example>tail -f /usr/local/apache2/logs/error_log</example> | 
|  |  | 
|  | <p>Passen Sie diese Beispiele entsprechend Ihren <directive | 
|  | module="core">ServerRoot</directive>- und <directive | 
|  | module="mpm_common">PidFile</directive>-Einstellungen an.</p> | 
|  | </section> | 
|  |  | 
|  | <section id="term"><title>Beenden</title> | 
|  |  | 
|  | <dl><dt>Signal: TERM</dt> | 
|  | <dd><code>apachectl -k stop</code></dd> | 
|  | </dl> | 
|  |  | 
|  | <p>Das Senden des <code>TERM</code>- oder <code>stop</code>-Signals an | 
|  | den Elternprozess veranlasst diesen, sofort zu versuchen, alle seine | 
|  | Kindprozesse zu beenden. Es kann einige Sekunden dauern, bis alle | 
|  | Kindprozesse komplett beendet sind. Danach beendet sich der Elternprozess | 
|  | selbst. Alle gerade bearbeiteten Anfragen werden abgebrochen. | 
|  | Es werden keine weiteren Anfragen mehr bedient.</p> | 
|  | </section> | 
|  |  | 
|  | <section id="graceful"><title>Unterbrechungsfreier Neustart</title> | 
|  |  | 
|  | <dl><dt>Signal: USR1</dt> | 
|  | <dd><code>apachectl -k graceful</code></dd> | 
|  | </dl> | 
|  |  | 
|  | <p>Das <code>USR1</code>- oder <code>graceful</code>-Signal | 
|  | veranlasst den Elternprozess, die Kinder <em>anzuweisen</em>, sich | 
|  | nach Abschluß ihrer momentanen bearbeiteten Anfrage zu beenden | 
|  | (oder sich sofort zu beenden, wenn sie gerade keine Anfrage bedienen). | 
|  | Der Elternprozess liest seine Konfigurationsdateien erneut ein und | 
|  | öffnet seine Logdateien neu. Wenn ein Kindprozess stirbt, | 
|  | ersetzt der Elternprozess ihn durch ein Kind der neuen | 
|  | Konfigurations-<em>Generation</em>. Dieses beginnt sofort damit, | 
|  | neue Anfragen zu bedienen.</p> | 
|  |  | 
|  | <note>Auf bestimmten Plattformen, welche kein <code>USR1</code> | 
|  | für einen unterbrechungsfreien Neustart erlauben, kann ein | 
|  | alternatives Signal verwendet werden (wie z.B. | 
|  | <code>WINCH</code>). Der Befehl <code>apachectl graceful</code> | 
|  | sendet das jeweils richtige Signal für Ihre Platform.</note> | 
|  |  | 
|  | <p>Der Code ist dafür ausgelegt, stets die MPM-Direktiven | 
|  | zur Prozesssteuerung zu beachten, so dass die Anzahl der Prozesse | 
|  | und Threads, die zur Bedienung der Clients bereitstehen, während | 
|  | des Neustarts auf die entsprechenden Werte gesetzt werden. | 
|  | Weiterhin wird <directive module="mpm_common">StartServers</directive> | 
|  | auf folgende Art und Weise interpretiert: Wenn nach einer Sekunde | 
|  | nicht mindestens <directive module="mpm_common">StartServers</directive> | 
|  | neue Kindprozesse erstellt wurden, dann werden, um den Durchsatz zu | 
|  | beschleunigen, entsprechend weitere erstellt. Auf diese Weise versucht | 
|  | der Code sowohl die Anzahl der Kinder entsprechend der Serverlast | 
|  | anzupassen als auch Ihre Wünsche hinsichtlich des Parameters | 
|  | <directive module="mpm_common">StartServers</directive> zu | 
|  | berücksichtigen.</p> | 
|  |  | 
|  | <p>Benutzer von <module>mod_status</module> werden feststellen, | 
|  | dass die Serverstatistiken <strong>nicht</strong> auf Null | 
|  | zurückgesetzt werden, wenn ein <code>USR1</code> gesendet | 
|  | wurde. Der Code wurde so geschrieben, dass sowohl die Zeit minimiert | 
|  | wird, in der der Server nicht in der Lage ist, neue Anfragen zu | 
|  | bedienen (diese werden vom Betriebssystem in eine Warteschlange | 
|  | gestellt, so dass sie auf keinen Fall verloren gehen) als auch | 
|  | Ihre Parameter zur Feinabstimmung berücksichtigt werden. | 
|  | Um dies zu erreichen, muss die <em>Statustabelle</em> (Scoreboard), | 
|  | die dazu verwendet wird, alle Kinder über mehrere Generationen | 
|  | zu verfolgen, erhalten bleiben.</p> | 
|  |  | 
|  | <p>Das Statusmodul benutzt außerdem ein <code>G</code>, um | 
|  | diejenigen Kinder zu kennzeichen, die noch immer Anfragen bedienen, | 
|  | welche gestartet wurden, bevor ein unterbrechungsfreier Neustart | 
|  | veranlaßt wurde.</p> | 
|  |  | 
|  | <p>Derzeit gibt es keine Möglichkeit für ein | 
|  | Log-Rotationsskript, das <code>USR1</code> verwendet, sicher | 
|  | festzustellen, dass alle Kinder, die in ein vor dem Neustart | 
|  | geöffnetes Log schreiben, beendet sind. Wir schlagen vor, dass | 
|  | Sie nach dem Senden des Signals <code>USR1</code> eine angemessene | 
|  | Zeitspanne warten, bevor Sie das alte Log anfassen. Wenn beispielsweise | 
|  | die meisten Ihrer Zugriffe bei Benutzern mit niedriger Bandbreite | 
|  | weniger als 10 Minuten für eine vollständige Antwort | 
|  | benötigen, dann könnten Sie 15 Minuten warten, bevor Sie auf | 
|  | das alte Log zugreifen.</p> | 
|  |  | 
|  | <note>Wenn Ihre Konfigurationsdatei Fehler enthält, während | 
|  | Sie einen Neustart anweisen, dann wird Ihr Elternprozess nicht neu starten, | 
|  | sondern sich mit einem Fehler beenden. Im Falle eines unterbrechungsfreien | 
|  | Neustarts läßt er die Kinder weiterlaufen, wenn er sich beendet. | 
|  | (Dies sind die Kinder, die sich "sanft beenden", indem sie ihre letzte | 
|  | Anfrage erledigen.) Das verursacht Probleme, wenn Sie versuchen, | 
|  | den Server neu zu starten -- er ist nicht in der Lage, sich an die Ports zu | 
|  | binden, an denen er lauschen soll. Bevor Sie einen Neustart | 
|  | durchführen, können Sie die Syntax der Konfigurationsdateien | 
|  | mit dem Befehlszeilenargument <code>-t</code> überprüfen | 
|  | (siehe auch <program>httpd</program>). Das garantiert | 
|  | allerdings nicht, dass der Server korrekt starten wird. Um sowohl die | 
|  | Syntax als auch die Semantik der Konfigurationsdateien zu prüfen, | 
|  | können Sie versuchen, <program>httpd</program> als nicht-root-Benutzer | 
|  | zu starten. Wenn dabei keine Fehler auftreten, wird er versuchen, seine | 
|  | Sockets und Logdateien zu öffnen und fehlschlagen, da er nicht root | 
|  | ist (oder weil sich der gegenwärtig laufende <program>httpd</program> | 
|  | bereits diese Ports gebunden hat). Wenn er aus einem anderen Grund | 
|  | fehlschlägt, dann liegt wahrscheinlich ein Konfigurationsfehler vor. | 
|  | Der Fehler sollte behoben werden, bevor der unterbrechungsfreie Neustart | 
|  | angewiesen wird.</note> | 
|  | </section> | 
|  |  | 
|  | <section id="hup"><title>Neustarten</title> | 
|  |  | 
|  | <dl><dt>Signal: HUP</dt> | 
|  | <dd><code>apachectl -k restart</code></dd> | 
|  | </dl> | 
|  |  | 
|  | <p>Das Senden des Signals <code>HUP</code> oder <code>restart</code> | 
|  | veranlaßt den Elternprozess, wie bei <code>TERM</code> alle seine | 
|  | Kinder zu beenden. Der Elternprozess beendet sich jedoch nicht. Er liest | 
|  | seine Konfigurationsdateien neu ein und öffnet alle Logdateien | 
|  | erneut. Dann erzeugt er einen neuen Satz Kindprozesse und setzt die | 
|  | Bedienung von Zugriffen fort.</p> | 
|  |  | 
|  | <p>Benutzer von <module>mod_status</module> werden feststellen, dass | 
|  | die Serverstatistiken auf Null gesetzt werden, wenn ein <code>HUP</code> | 
|  | gesendet wurde.</p> | 
|  |  | 
|  | <note>Wenn Ihre Konfigurationsdatei einen Fehler enthält, | 
|  | während Sie einen Neustart anweisen, dann wird Ihr Elternprozess | 
|  | nicht neu starten, sondern sich mit einem Fehler beenden. Lesen Sie oben, | 
|  | wie Sie das vermeiden können.</note> | 
|  | </section> | 
|  |  | 
|  | <section id="race"><title>Anhang: Signale und Wettkampfsituationen</title> | 
|  |  | 
|  | <p>Vor der Version 1.2b9 des Apache existierten verschiedene | 
|  | <em>Wettkampfsituationen</em> (race conditions), die den Neustart und | 
|  | die Signale beeinflußt haben. (Einfach erklärt ist eine | 
|  | Wettkampfsituation ein zeitabhängiges Problem - wenn | 
|  | etwas zum falschen Zeitpunkt erfolgt oder Dinge in der falschen | 
|  | Reihenfolge passieren, ist unerwartetes Verhalten die Folge. Wenn die | 
|  | gleichen Dinge zur richtigen Zeit geschehen, funktioniert alles korrekt.) | 
|  | Bei Architekturen mit dem "richtigen" Funktionsumfang | 
|  | haben wir so viele eliminiert wie wir nur konnten. Dennoch | 
|  | sollte beachtet werden, dass noch immer Wettkampfsituationen auf | 
|  | bestimmten Architekturen existieren.</p> | 
|  |  | 
|  | <p>Bei Architekturen, die ein <directive | 
|  | module="mpm_common">ScoreBoardFile</directive> auf Platte verwenden, | 
|  | besteht die Gefahr, dass die Statustabelle beschädigt wird. | 
|  | Das kann zu "bind: Address already in use" ("bind: Adresse wird | 
|  | bereits verwendet", nach einem <code>HUP</code>) oder "long lost | 
|  | child came home!" ("Der verlorene Sohn ist heimgekehrt", nach einem | 
|  | <code>USR1</code>) führen. Ersteres ist ein schwerer Fehler, | 
|  | wärend letzteres lediglich bewirkt, dass der Server einen Eintrag | 
|  | in der Statustabelle verliert. So kann es ratsam sein, unterbrechungsfreie | 
|  | Neustarts zusammen mit einem gelegentlichen harten Neustart zu verwenden. | 
|  | Diese Probleme lassen sich nur sehr schwer umgehen, aber | 
|  | glücklicherweise benötigen die meisten Architekturen keine | 
|  | Statustabelle in Form einer Datei. Bitte lesen Sie für Architekturen, | 
|  | die sie benötigen, die Dokumentation zu <directive | 
|  | module="mpm_common">ScoreBoardFile</directive>.</p> | 
|  |  | 
|  | <p>Alle Architekturen haben in jedem Kindprozess eine kleine | 
|  | Wettkampfsituation, welche die zweite und nachfolgende Anfragen | 
|  | einer persistenten HTTP-Verbindung (KeepAlive) umfaßt. Der Prozess | 
|  | kann nach dem Lesen der Anfragezeile aber vor dem Lesen der Anfrage-Header | 
|  | enden. Es existiert eine Korrektur, die für 1.2 zu spät kam. | 
|  | Theoretisch sollte das kein Problem darstellen, da | 
|  | der KeepAlive-Client derartige Ereignisse aufgrund von | 
|  | Netzwerk-Latenzzeiten und Auszeiten des Servers erwarten sollte. | 
|  | In der Praxis scheint keiner von beiden beeinflußt zu werden | 
|  | -- in einem Testfall wurde der Server zwanzig mal | 
|  | pro Sekunde neu gestartet, während Clients das Angebot abgegrast | 
|  | haben, ohne kaputte Bilder oder leere Dokumente zu erhalten.</p> | 
|  | </section> | 
|  |  | 
|  | </manualpage> |