Ü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

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

WordPress Installer

~0 Min. LesezeitUm WordPress auf einem Hosting zu installieren, muss dieses imemr zuerst heruntergeladen und …

PHP Trojaner – Wettbewerb

~2 Min. LesezeitIn der Serie der PHP Trojaner gibt es noch viele weitere Möglichkeiten zum …

3 Kommentare

  1. 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. 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

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.