Tutorial: Live Status Anzeige deines Webservers
Datum 21.08.2009 | Kategorien Hardware, Internet, Programmieren, Software, TutorialeHeute möchte ich euch zeigen, wie Ihr mithilfe von PHP und Shell eine Livestatus Anzeige eures Webspace/Webservers hinbekommt und somit die Auslastung eures Webservers/Webspaces im Blick habt. Ein Beispiel dieser Status Anzeige könnt ihr euch hier ansehen (Die Status Anzeige geht nach dem Wechsel zu einem neuem Webhoster bei mir nicht mehr. Ist auch sicherer so, wenn man nicht allein auf dem Server ist
):

Vorab freue ich mich natürlich sehr über Verlinkungen auf diesen Artikel, wenn ich sehe, dass dieses Tutorial gern gesehen wird, werde ich natürlich in Zukunft öfter mal so ein Tutorial schreiben. Hinweisen möchte ich noch einmal ausdrücklich auf das Copyright dieser Artikel, welches es verbietet das Tutorial ohne schriftliche Genehmigung zu verbreiten.
Funktionen dieser Webserver Status Anzeige:
- Anzeige der CPU Auslastung.
- Anzeige der Speicher Auslastung.
- Anzeige der Load Average der letzten 15 Minuten.
Da ich versuche euch jeden Schritt so genau wie möglich zu erklären, braucht ihr also weder großartigen Vorkenntnisse in PHP noch in der Linux Shell.
Vorraussetzung für die Statusanzeige:
- PHP Unterstüzung
- Shell Ausführungserlaubnis (hier wird es wohl bei den Meisten scheitern)
Warum es bei den Meisten scheitern wird:
- Aus Sicherheitsgründen erlauben die Meisten Hoster zum Glück nicht, Shell auszuführen. Da man somit auch allerhand anderes machen könnte, was sicherlich nicht im Interesse anderer Kunden ist.
- Oft sind auch die Funktionen um externe Programm auszuführen wie exec einfach gesperrt.
Warum dann dieses Tutorial?
- Ich habe schon sehr viele Personen im Internet danach suchen sehen.
- Es ist ein schöner kleiner Kurs um sich weitere Kenntnisse in PHP und Shell anzueignen.
- Serverbesitzer werden sich freuen
.
Jetzt aber los…!
Vorab die grafische Statistik Anzeige und auch die Umsetzung via HTML, war eigentlich gar nicht geplant. Daher ist diese nun nicht im aufwändigsten Etwas konzepiert
.
Zu allererst habe ich mir eine “between” Funktion geschrieben, welche es mir ermöglicht Text zwischen 2 Zeichenketten herauszuschneiden.
function between($von,$bis,$string) {
$a = explode($von,$string);
$b = explode($bis,$a[1]);
return $b[0];
}
Die Funktion explode ermöglicht einen String durch Angabe einenes bestimmten Trenners in ein Array zu schreiben.
Anschließend kommen wir schon zur Berechnung der aktuellen CPU Auslastung:
$cpu = shell_exec("cat /proc/stat");
$cpu = between("cpu ", "\n", $cpu);
$cpu = explode(" ", $cpu);
$cpuges = $cpu[0] + $cpu[1] + $cpu[2] + $cpu[3];
$cpuidle = $cpu[3];
$cpuproz = (100/$cpuges) * $cpuidle;
$cpuproz = round(100 - $cpuproz,2);
Zu erst führe ich einen Shell Befehl mit der Funktion shell_exec aus. Dieser ließt den Auslastungswet aus dem Proc-Dateisystem aus. Nachfolgend schneide ich mit mit unserer oben angesprochenen Funktion between() die Werte heraus, welche ich zur weiteren Berechnung der Linux CPU Auslastung brauche. Die Werte schneide ich mir passend in ein Array indem ich die verbleibenden Werte mit bereits angesprochener Funktion explode() trenne. Danach folgt die Berechnung der momentanen CPU Auslastung. Wer hierzu genaueres wissen will, kann sich den entsprechenden Wikipedia Artikel angucken.
Nun haben wir schon einmal die CPU Auslastung in der Variable $cpuproz. Nun kommt die Speicherauslastungsberechnung, welche auf Grund der unpassenden Shell Rückgabe nicht gerade leicht zu verarbeiten war.
$ram = shell_exec("free -mt");
$ramtotal = between("Mem: ", " ", $ram);
$ramused = between("$ramtotal ", " ", $ram);
$ramproz = round((100/$ramtotal)*$ramused,2);
Mit dem Shell Befehl free, lassen wir uns die aktuelle Ram Auslastung anzeigen. Durch die Option -m erfolgt die Rückgabe in MB und durch -t erreichen wir die Anzeige der Gesamtübersicht. Mit between schneide ich mir wieder die Werte passend, so wie ich sie brauche und rechne dann die aktuelle prozentuale Auslastung des Speichers aus.
Haben wir den Speicher auch abgeschlossen
. Kommen wir nun zur durchschnittlichen Load Berechnung der letzten 15 Minuten.
$load_average = shell_exec('uptime | awk -F: \'{print $NF}\' | awk \'{print $3}\'');
$load_average = str_replace("\n", "", $load_average);
Erneut führe ich mit shell_exec einen Shell Befehl aus und ermittle so die Load Average der letzten 15 Minuten. Uptime gibt mir die vergangene Zeit aus, wann das System zuletzt hochgefahren wurde und die durchschnittlichen Load Zahlen der letzten Minute, der letzten 5 Minuten und der letzten 15 Minuten. Da wir nur den letzten Wert brauchen, habe ich den Shell Befehl entsprechend angepasst. Dies hätte ich aber auch einfacher mit PHP erreicht
. Zuletzt entferne ich noch mit der str_replace() Funktion ein “Newline”-Zeichen, welches bei der späteren Ausgabe stört.
Fortsetzung folgt…?
Wie Ihr nun anhand der ausgerechneten Werte so eine Statusleiste, wie auf meiner Statusseite hinbekommt und wie man diese Werte in XML mittels des XML Writer ausgibt erfahrt ihr in einem weiteren Artikel, wenn das Umfragenergebnis Interesse an einen weiteren Artikel zeigt
.


Vielen Dank! Nach so einem Tutorial habe ich schon lange gesucht
Hallo,
vielleicht sollte man noch erwähnen, dass exec und shell_exec zu jenen Funktionen gehören, die aus Sicherheitsgründen auch gesperrt sein sollten. Es ist also nicht unbedingt als Pech zu bezeichnen, wenn der Provider die Ausführung dieser Funktionen verhindert. Um eventuelle Angriffspunkte möglichst klein zu halten, sollten die Funktionen – auch wenn sie nicht gesperrt sind – in allen Verzeichnissen über die PHP.ini gesperrt werden. (Direktive disable_functions) Nur in dem Verzeichnis, wo man sie auch benötigt wirklich – wie eben beim in diesem Tutorial beschriebenen Status-Script – kann eine Sperrung ausbleiben.
Gruß
Alex
Bitte bitte
@ alm
Ich habe doch oben geschrieben:
Ich habe das vielleicht ein wenig unglücklich rübergebracht. Viele werden sich darüber ärgern, dass es an der Ausführungsverhinderung scheitert. Für die meisten Nutzer sollte es das Beste sein, wenn es ihnen verwehrt ist eine Shell zu starten. Allerdings sieht es auf der freien Wildbahn – besonders schlimm finde ich das bei den großen Hostern (1und1 erlaubt beispielsweise Shells sogar bei seinen Shared-Paketen also einer recht breiten Masse) – leider nicht nach Sicherheitsbewusstsein aus. Deshalb auch der Hinweis bzgl. der manuellen Sperrung per PHP.ini. Wenn sie nicht gesperrt sind, dann sollte man dies zur Vermeidung unnötiger Risiken auf diesem Wege machen. War also nicht als Kritik gemeint…