Haben Sie Apache-Protokollanforderungen, wenn sie eingehen, anstatt wenn sie fertig sind

9

Ich versuche, ein bizarres Problem mit einem Serverabsturz zu diagnostizieren ( Server reagiert auf Pings, akzeptiert jedoch keine SSH-Verbindungen bis zum Neustart. 0% CPU ), bei dem beim Neustart des Servers alles wieder normal wird. Ich möchte, dass meine Apache-Zugriffsprotokolle (oder ein anderes Protokoll) alle Anforderungen enthalten, die beim Absturz richtig gestellt wurden, aber leider protokolliert Apache Anforderungen erst nach Abschluss. Das heißt, wenn eine Anforderung den Server zum Absturz bringt, wird diese Anforderung nie beendet und daher nicht in den Protokollen angezeigt.

Gibt es eine Möglichkeit, Apache so zu konfigurieren, dass eine Protokolldatei erstellt wird, in die beim Eintreffen der Anforderungen geschrieben wird?

Ben Dilts
quelle
Schauen Sie sich auch Ihre DNS-Konfiguration an. Ein defekter oder hängender DNS-Server kann alle möglichen Probleme mit SSH verursachen und kann sich nicht anmelden. [Wer weiß, wie Apache funktioniert - stellen Sie sicher, dass die Suche nach Hostnamen deaktiviert ist.]
Sean Kimball

Antworten:

15

Ich denke, was Sie für die forensische Protokollierung benötigen, finden Sie unter folgendem Link: http://httpd.apache.org/docs/current/mod/mod_log_forensic.html

Ausschnitt:

Forensisches Protokollformat:

Jede Anfrage wird zweimal protokolliert. Das erste Mal ist, bevor es weiter verarbeitet wird (dh nach dem Empfang der Header). Der zweite Protokolleintrag wird nach der Anforderungsverarbeitung gleichzeitig mit der normalen Protokollierung geschrieben.

Um jede Anforderung zu identifizieren, wird eine eindeutige Anforderungs-ID zugewiesen. Diese forensische ID kann im normalen Übertragungsprotokoll mit der Zeichenfolge% {forensic-id} n formatiert werden. Wenn Sie mod_unique_id verwenden, wird die generierte ID verwendet.

In der ersten Zeile werden die forensische ID, die Anforderungszeile und alle empfangenen Header protokolliert, getrennt durch Pipe-Zeichen (|). Eine Beispielzeile sieht wie folgt aus (alle in einer Zeile):

+ yQtJf8CoAB4AAFNXBIEAAAAA | GET /manual/de/images/down.gif HTTP / 1.1 | Host: localhost% 3a8080 | Benutzeragent: Mozilla / 5.0 (X11; U; Linux i686; en-US; rv% 3a1.6) Gecko / 20040216 Firefox / 0.8 | Akzeptieren: image / png, etc ...

Das Pluszeichen am Anfang zeigt an, dass dies die erste Protokollzeile dieser Anforderung ist. Die zweite Zeile enthält nur ein Minuszeichen und die ID erneut:

-yQtJf8CoAB4AAFNXBIEAAAAA

Das Skript check_forensic verwendet als Argument den Namen der Protokolldatei. Es sucht nach diesen +/- ID-Paaren und beschwert sich, wenn eine Anfrage nicht abgeschlossen wurde.

Sandroid
quelle
Dies ist, wonach ich gesucht habe, aber es sieht nicht so aus, als könnte ich dieses Protokoll nur regelmäßig löschen (rm /var/log/apache2/forensic.log jede Stunde) oder die forensische Protokollierung wird nur unterbrochen, bis ich Apache neu starte. Ideen?
Ben Dilts
Wenn Sie Apache-Protokolle erstellen, wird dies sicherlich passieren. Versuchen Sie, logrotate oder ein in Ihrer Umgebung vorhandenes Äquivalent zu verwenden, um Protokolle regelmäßig (zeitlich oder größenmäßig) zu erstellen. Wenn nicht, anstatt sie zu löschen, versuchen Sie, die Datei zu verschieben, und berühren Sie dann /var/log/apache2/forensic.log (überprüfen Sie die Berechtigungen)
sandroid
2

Die Antwort von Sandroid ist richtig für Ihre Frage, aber Sie sollten auch in Betracht ziehen, eine Netzwerkpaketerfassung durchzuführen. Wenn Sie über die Ressourcen verfügen, kann es sehr hilfreich sein, den Port innerhalb des Switch zu spiegeln und einen zweiten Computer zu verwenden, auf dem WireShark ausgeführt wird, um den gesamten IP-Verkehr aufzuzeichnen. Wenn der Server so weit entfernt wird, dass Nicht-HTTP-Dienste nicht mehr reagieren, wird möglicherweise der IP-Stack entfernt, bevor die fehlerhaften Daten zu Apache gelangen.

Wenn Sie sicherstellen können, dass der Computer, auf dem die Erfassung ausgeführt wird, über andere Netzwerkhardware und / oder Treiber als der andere verfügt. Würde saugen, um zwei zum Preis von einem zum Absturz zu bringen. ;-);

Kennzeichen
quelle