Über den Author / Internet / Server Monitoring mit PHP

Server Monitoring mit PHP

~7 Min. Lesezeit

Server Monitoring ist immer so eine Sache.

Überblick behalten
Ich möchte gerne ohne grosse Software auf einen Blick sehen ob alle Dienste laufen und wie mein Diskspace aussieht.
Am Besten sollte dies in meiner Sitebar vom Firefox sichtbar sein. Dazu erweiterte ich mein WebPanel, was ich irgendwann in der Zukunft öffentlich bereitstelle. (Momentan keine Zeit um die letzten Funktionen des User Management fertigzustellen).

Jedenfalls ist dies die fertige Ansicht für mein Server, welche Links angezeigt wird.
Die Ansicht aktualisiert sich momentan all 30 Sekunden und braucht keinerlei Ressourcen.

Hier kann man die PHP Datei mit den Bilddateien runter laden: Download

Der PHP Code dazu ist folgender:

<?php
<pre>
define('YOUR_DOMAIN',"www.murawski.ch");

header("Cache-Control: no-cache, must-revalidate");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");

?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>SMu Monitoring</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
<!--
body {
	font-size: 10px;
	font-family: Tahoma;
}
.titel {
	font-size: 12px;
	color: #0000A6;
	font-weight: bold;
}
-->
</style>
</head>
<body>
<?php

function process($name,$befehl)
{
	$output = "<tr><td width=\"88\"><font style=\"font-weight: bold;\">".$name."</a></td>";
	exec($befehl,$return);

	if ( $return[0] >= '1') { $output .= "<td><img width=\"20\" height=\"20\" src=\"img/1.gif\" alt=\"OK\" border=\"0\" /></td></tr>"; }
	else { $output .= "<td><img width=\"20\" height=\"20\" src=\"img/0.gif\" alt=\"FAIL\" border=\"0\" /></td></tr>"; }
	return $output;
}

function disk($name,$disk)
{
	$output = "<tr><td width=\"25\"><font style=\"font-weight: bold;\">".$name."</a></td>";
	exec("df | grep ".$disk,$return);

	$used = substr($return[0],30,10);
	$avail = substr($return[0],40,10);

	$proz = 100 / ($used+$avail) * $used;

	$output .= "<td align=\"center\">".ceil($avail/1048576)." GB free (".ceil(100-$proz)."%)<br/>";
	if ($proz >= '92')
	{
		$output .= "<img width=\"".ceil((80*$proz)/100)."\" height=\"5\" src=\"img/used.gif\" alt=\"OK\" border=\"0\" />";

	}
	else
	{
		$output .= "<img width=\"".ceil((80*$proz)/100)."\" height=\"5\" src=\"img/usedb.gif\" alt=\"WARNING\" border=\"0\" />";
	}
	$output .= "<img width=\"".floor(80-((80*$proz)/100))."\" height=\"5\" src=\"img/free.gif\" alt=\"OK\" border=\"0\" /></td></tr>";

	return $output;
}

?><table hspace="0" vspace="0" cellspacing="0" cellpadding="0">
<tr>
	<td width="125" valign="top">
		<table hspace="0" vspace="0" cellspacing="1" cellpadding="1" bgcolor="#F2F2F2">
		<tr><td colspan="2"><font class="titel">Web-Dienste</font></td></tr><?php

		echo process("Apache2",'ps auwx | grep "/usr/sbin/apache2" |  grep -v -c grep');
		echo process("MySQL",'ps auwx | grep "/usr/sbin/mysqld" |  grep -v -c grep');
		echo process("Bind9",'ps auwx | grep "named" |  grep -v -c grep');
		echo process("ProFTPd",'ps auwx | grep "/usr/sbin/xinetd" |  grep -v -c grep');
		echo process("Webmin",'ps auwx | grep "webmin" |  grep -v -c grep');
		?></table><br/>

		<table hspace="0" vspace="0" cellspacing="1" cellpadding="1" bgcolor="#F2F2F2">
		<tr><td colspan="2"><font class="titel">Mail-Dienste</font></td></tr><?php

		echo process("Xinetd",'ps auwx | grep "/usr/sbin/xinetd" |  grep -v -c grep');
		echo process("Spam Assassin",'ps auwx | grep "/usr/sbin/spamd" |  grep -v -c grep');
		echo process("Postfix",'ps auwx | grep "/usr/lib/postfix/master" |  grep -v -c grep');
		echo process("Courier",'ps auwx | grep "/usr/sbin/couriertcpd" |  grep -v -c grep');
		echo process("Courier-Auth",'ps auwx | grep "/usr/sbin/courierlogger -pid=/var/run/courier/authdaemon/" |  grep -v -c grep');

		?></table>
	</td>
	<td width="125" valign="top">
		<table hspace="0" vspace="0" cellspacing="1" cellpadding="1" bgcolor="#F2F2F2">
		<tr><td colspan="2"><font class="titel">Proxy-Dienste</font></td></tr><?php

		echo process("Squid3",'ps auwx | grep "/usr/sbin/squid3" |  grep -v -c grep');
		echo process("Privoxy",'ps auwx | grep "privoxy" |  grep -v -c grep');
		echo process("Havp",'ps auwx | grep "havp" |  grep -v -c grep');
		echo process("SSL-Explorer",'ps auwx | grep "sslexplorer" |  grep -v -c grep');
		echo process("Clamd",'ps auwx | grep "havp" |  grep -v -c grep');

		?></table><br/>

		<table hspace="0" vspace="0" cellspacing="1" cellpadding="1" bgcolor="#F2F2F2">
		<tr><td colspan="2"><font class="titel">Support-Dienste</font></td></tr><?php

		echo process("SSHd",'ps auwx | grep "/usr/sbin/sshd -l" |  grep -v -c grep');
		echo process("EchoServer",'ps auwx | grep "/opt/echoserver/echoserver -l" |  grep -v -c grep');

		?></table><br/>

		<table hspace="0" vspace="0" cellspacing="1" cellpadding="1" bgcolor="#F2F2F2">
		<tr><td colspan="2"><font class="titel">Diskspace</font></td></tr><?php

		echo disk("/","/dev/md2");
		echo disk("/tmp","/dev/md1");

		?></table>
	</td>
</tr>
</table>
<meta http-equiv="refresh" content="30; URL=http://<?=YOUR_DOMAIN?>/" />
</body></html>

Monitoring
Problematischer wird es beim Monitoring, ob der Server überhaupt erreichbar ist. Dies muss daher auf einem FREMDEN Server untergebracht werden, womöglich in einem anderen Rechenzentrum.
Das folgende PHP Script kann man sehr einfach erweitern, das es den ERROR nicht ausgibt, sondern ein SMS oder Mail verschickt bei Problemen…

Das PHP Script:

<?php
<pre>
set_time_limit(30);

if ($_SERVER['SERVER_NAME'] != '')
{
	exit("Cronjob Befehl: 5,10,15,20,25,30,35,40,45,50,55 * * * * /usr/bin/php -q ".$_SERVER['SCRIPT_FILENAME']." &gt;/dev/null 2&gt;&amp;1");
}

$check_server = fsockopen("www.murawski.ch", 80, $errno, $errstr, 5);
if ($check_server && $errno == 0)
{
	stream_set_timeout($check_server, 6);
	fputs($check_server, "GET /index.php HTTP/1.1\r\n");
	fputs($check_server, "Accept: *# /*\r\n");
	fputs($check_server, "Referer: http://www.murawski.ch/index.php\r\n");
	fputs($check_server, "Accept-Language: de-ch\r\n");
	fputs($check_server, "User-Agent: smu_mon\r\n");
	fputs($check_server, "Host: www.murawski.ch\r\n");
	fputs($check_server, "Connection: close\r\n");
	fputs($check_server, "Cache-Control: no-cache\r\n\r\n");
	socket_set_timeout($check_server, 10);
	while(!feof($check_server)) {
		$res .= fgets($check_server, 1024);
	}
		if (!ereg("Mon Script",$res))
	{
		$ERROR = "Server erreichbar, Webseite hängt!";
	}
	else
	{
		echo "Server erreichbar (Keine Aktion)";
	}
	fclose($check_server);
}
else
{
	$ERROR = "Server nicht erreichbar";
}
if ($ERROR != '') { echo $ERROR; }
?>

Ich erhalte so ein SMS wenn der Server nicht erreichbar sein sollte und nebenbei sehe ich ob alle Dienste laufen.

Die Dienste sind bei mir nicht im Alerting eingebunden, da ich ein Autorestart Script implementiert habe, wo die hängenden oder nicht laufenden Dienste neu startet.

About Stefan

avatar
Ein männlicher IT Nerd, durchstöbert das Web nach speziellen Gadgets, unentbehrlicher Software und Alles was man im IT Sektor nicht verpassen darf.Immer hilfsbereit wenn Probleme zu lösen sind oder das Unmögliche umgesetzt werden sollte.

Weitere interessante Artikel

PHP Trojaner (Teil 3: Spamsender Infektion)

~1 Min. LesezeitSpam ist ein grosses Problem der heutigen Zeit, doch wer verschickt Spam und …

PHP Trojaner (Teil 2: Uploader Infektion)

~1 Min. LesezeitPHP Trojaner sind beliebt, denn oft werden solche Infektionen übersehen und überstehen Jahre …

3 Kommentare

  1. avatar

    Besten Dank an encodingit, welcher mich auf einen kleinen Fehler im Monitoring Script aufmerksam machte. Der eine Rückgabewert musste von $return auf $return[0] geändert werden. Skript wurde angepasst.

  2. avatar

    Hallo Stefan,

    wie genau geht das? Ich pack das Skript (index.php und img-Ordner) auf meinen Server und steuere die Seite im Browser an? Was muss noch getan werden? Welche Rechte braucht die php? Was muss im Skript angepasst werden (Nur YOUR_DOMAIN oder?)

    Grüße
    Frank

  3. avatar

    Je nachdem welche Prozesse du anschauen möchstest, musst du da schon ein wenig noch anpassen.

    Aber grundsätzlich nur Domain anpassen 🙂

    Gruss
    Stefan

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

eMail-Benachrichtigung bei weiteren Kommentaren.
Auch möglich: Abo ohne Kommentar.

This Blog will give regular Commentators DoFollow Status. Implemented from IT Blögg