Verfolgen von Apache mit VirtualHost

7

Ich habe einen Apache-Webserver, auf dem viele VirtualHosts ausgeführt werden.

In letzter Zeit ist es festgefahren und reagiert nicht mehr. Ich frage mich, wie ich feststellen kann, welche VirtualHosts den größten Teil des Problems verursachen. In der Vergangenheit gab es Fälle, in denen ein Fehler im Code einer einzelnen Site den gesamten Server heruntergefahren hat. Mein Ziel ist es, diese Fälle schnell diagnostizieren zu können.

Ich überwache den Server mit munin und stelle fest, dass die Anzahl der Apache-Prozesse, die Speichernutzung und die Last in den fraglichen Zeiträumen sehr hoch sind. Das Problem ist, dass diese Statistiken für den gesamten Webserver gelten, nicht für einzelne VirtualHosts.

Ich habe ein Skript geschrieben, um die Weblogs für den Datenverkehr pro VirtualHost zu analysieren , aber es scheint, dass dies nicht ausreicht. Ich muss wahrscheinlich bestimmen, für wie viele Apache-Prozesse jeder VirtualHost verantwortlich ist oder wie lange sie jeden Prozess offen halten - oder vielleicht für wie viel Speicherplatz jeder verantwortlich ist.

Wo finde ich diese Informationen? Es macht mir nichts aus, ein Skript zu schreiben, um diese Daten zu verfolgen, aber ich weiß nicht genau, woher ich sie überhaupt extrahieren soll.

Brent
quelle

Antworten:

4

Ich schätze, dass es nicht immer passt, mod_status immer verfügbar zu haben, aber es und apachetop sind die besten Möglichkeiten, diese Probleme zu diagnostizieren. Es gibt jedoch viele Möglichkeiten, eine Katze zu häuten.

Dieser Trick ist unter verschiedenen Umständen nützlich und nicht nur Apache-spezifisch. Es hängt jedoch von einer Reihe von Faktoren ab, und Sie müssen wissen, was es tut, um die Einschränkungen zu kennen.

for pid in `pgrep -u www-data`; do find /proc/${pid}/cwd -printf "%l\n" ; done

Lassen Sie es uns zusammenfassen:

  • pgrep -u www-data gibt Ihnen die Liste der Pids an, die unter den www-Daten des Benutzers ausgeführt werden. Dies ist die Standardeinstellung unter Debian / Ubuntu. Passen Sie sie an Ihr eigenes System an (RedHat-basierte Systeme verwenden beispielsweise httpd als Benutzer). Für Systeme ohne pgrep können Sie ps axuwww | verwenden grep user | awk '{print $ 2}'
  • das * für; tun; ... done * loop bedeutet, dass wir jeden Eintrag durchlaufen, in dem die Befehle im do-Teil der Schleife ausgeführt werden.
  • find / proc / $ {pid} / cwd -printf "% l \ n" sucht / proc einfach nach jeder dieser PIDs und spuckt das aktuelle Arbeitsverzeichnis für diesen Prozess aus. Apache sendet standardmäßig chdir () an den VirtualHost, wenn Dateien von diesem VirtualHost bereitgestellt werden. / proc / PID / cwd ist eine symbolische Verknüpfung zu dem Verzeichnis, in dem der Apache-Prozess ausgeführt wird. printf "% l \ n" druckt den Endpunkt zu dieser Verknüpfung. Weitere Informationen hierzu finden Sie unter find (1).

Dieser Trick hat zwei wesentliche Vorbehalte:

1) Wenn etwas, das unter demselben Kontext wie der Apache-Prozess ausgeführt wird, ein chdir () außerhalb des VirtualHost-Verzeichnisses ausführt, ist es schwierig, dies herauszufinden.

Beispiel: Ein PHP-Skript, das unter mod_php ausgeführt wird (ein CGI unterscheidet sich von einem separaten Prozess in Apache Fork, aber ich gehe davon aus, dass CGIs kein Problem darstellen oder dass Sie sie einfacher verfolgen können).

2) Wenn Sie Apache-Instanzen haben, die sehr, sehr schnell Seiten bedienen (z. B. eine kleine statische HTML-Seite). Dies ist normalerweise kein Problem, aber es kann möglich sein. Wenn Sie viele Fehler "Keine solche Datei oder kein solches Verzeichnis" erhalten, ist dies im Grunde eine Manifestation davon. Ich würde einige erwarten, aber nicht die Mehrheit, es sei denn, sie passen zu diesem speziellen Fall. Grundsätzlich liegt dies daran, dass die Apache-Prozesse, die Sie mit ps gescannt haben, bereits beendet sind, als Sie / proc überprüft haben. Dies bedeutet natürlich, dass sie Seiten sehr, sehr schnell bereitstellen.

In Bezug auf speichergebundene Apache-Prozesse verwende ich ps_mem.py , um die Speichernutzung auf meinen Webservern zu berechnen. Wenn Sie große Apache-Prozesse (in Bezug auf die Größe des residenten Speichers) haben und diese schnell beendet werden, entspricht dies in etwa der Aufforderung eines großen, fetten Mannes, weiterhin 100-m-Sprints auszuführen. Wenn Ihr Webserver kein freigegebener ist, sind diese Fehler "Keine solche Datei oder kein solches Verzeichnis" normalerweise gute Kandidaten, um Inhalte auf einen kleineren, leichtgewichtigen Webserver (z. B. nginx / lighttpd) zu verschieben oder Inhalte (z. B. Lack / Tintenfisch) stark zwischenzuspeichern.

Philip Reynolds
quelle
Das ist genau das, wonach ich gesucht habe! Vielen Dank.
Brent
1
Ich sehe viele "/" Ergebnisse in dieser Liste. Könnten diese ein Ergebnis von mod_php sein, und wenn ja, kennen Sie eine Möglichkeit, diese auch zu verfolgen?
Brent
2

Ich denke du willst Apachetop oder sonst mod_status(mit ExtendedStatus On). Ich habe noch kein Leistungsproblem in Apache, das nicht beleuchtet wurde mod_status, und Apachetop sieht aus wie ein ordentliches Tool (das einige ärgerliche Einschränkungen im Protokolllayout aufweist).

womble
quelle
Vielen Dank - ich möchte mod_status nicht wirklich am Laufen halten, werde aber das Apachetop nach Informationen durchsuchen, falls vorhanden.
Brent
Schalten Sie es also ein, wenn Sie es brauchen, und schalten Sie es wieder aus, wenn Sie fertig sind. Einfach.
womble
Das funktioniert bei dem, was ich versuche, nicht ganz, da Sie zum Ein- und Ausschalten alle aktuellen Apache-Verbindungen trennen müssen. Ich möchte die aktuellen Verbindungen sehen, wenn das Problem auftritt - was entweder bedeutet, ExtendedStatus eingeschaltet zu lassen. (Es liefert die Informationen, die ich suche, obwohl +1)
Brent