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:
monitor.php <?php
define('YOUR_DOMAIN',"blog.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:
alerting.php <?php
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']." >/dev/null 2>&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.
Willkommen auf meinem Blog. Wenn Du die Seite interessant findest, kannst Du mit dem
RSS Feed oder per
E-Mail Abo immer auf dem neuesten Stand sein.
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.