Server Überwachung mit munin und monit auf Fedora 7

Version 1.0
Author: Falko Timme <ft [at] falkotimme [dot] com>

Diese Anleitung veranschaulicht, wie man seinen Fedora 7 Server mit munin und monit überwachen kann. Munin erzeugt raffinierte kleine Grafiken von fast jedem Aspekt Deines Servers (durchschnittliche Auslastung, Arbeitsspeicher-auslastung, Prozessorauslastung, MySQL Datendurchsatz, Netzwerk-Datendurchsatz, etc.) ohne großartige Konfiguration, wohingegen monit die Verfügbarkeit von Services wie Apache, MySQL, Postfix überprüft und die entsprechende Aktion ausführt wie zum Beispiel einen Neustart, wenn es feststellt, dass ein Service sich nicht so verhält wie erwartet. Die Kombination der Beiden bietet Dir vollkommene Überwachung: Grafik, die Dir derzeitige oder demnächst stattfindende Probleme aufzeigt (wie zum Beispiel „Wir brauchen bald einen größeren Server, unsere durchschnittliche Auslastung erhöht sich rasant“.) und einen Wächter, der die Verfügbarkeit überwachter Services sichert.

Obwohl munin Dich mehr als einen Server überwachen lässt, werden wir hier nur das Überwachen des Systems diskutieren, in dem munin installiert ist.

Diese Anleitung wurde für Fedora 7 geschrieben, jedoch sollte die Konfiguration mit kleinen Änderungen auch für andere Distributionen zutreffen.

Allerdings möchte ich an dieser Stelle darauf hinweisen, dass dies hier nicht der einzige Weg ist, ein solches System zu installieren. Es gibt viele Möglichkeiten – ich selbst habe mich für diese entschieden. Ich kann aber nicht garantieren, dass diese Lösung bei jedem funktioniert bzw. für jeden die richtige ist!

1 Vorbemerkung

Der Host Name unseres Systems ist server1.example.com.Wir haben darauf eine Website www.example.com mit dem Document Root /var/www/www.example.com/web.

2 Installation und Konfiguration von munin

Um munin auf Fedora 7 zu installieren, führen wir Folgendes aus:

yum install munin munin-node

Dann erstellen wir die System Startup Links für munin und starten es:

chkconfig –levels 235 munin-node on
/etc/init.d/munin-node start

Als Nächstes müssen wir die munin Konfigurationsdatei bearbeiten /etc/munin/munin.conf. Wir möchten, dass munin die Ausgabe in das Verzeichnis /var/www/www.example.com/web/monitoring packt, dazu ändern wir den Wert von htmldir. Wir möchten den Namen server1.example.com an Stelle von localhost.localdomain in der HTML Ausgabe verwenden , dazu ersetzen wir localhost.localdomain mit server1.example.com. Ohne Kommentare sieht die veränderte Datei wie folgt aus:

vi /etc/munin/munin.conf

[...]
dbdir   /var/lib/munin
htmldir /var/www/www.example.com/web/monitoring
logdir  /var/log/munin
rundir  /var/run/munin   

# Where to look for the HTML templates
tmpldir /etc/munin/templates
[...]
# a simple host tree
[server1.example.com]
    address 127.0.0.1
    use_node_name yes
[...]

Als Nächstes erstellen wir das Verzeichnis /var/www/www.example.com/web/monitoring und übergeben dessen Besitz an den Nutzer und die Gruppe munin, anderenfalls kann munin seine Ausgabe nicht in dieses Verzeichnis packen. Dann starten wir munin neu:

mkdir -p /var/www/www.example.com/web/monitoring
chown munin:munin /var/www/www.example.com/web/monitoring
/etc/init.d/munin-node restart

Warte ein paar Minuten sodass munin seine erste Ausgabe erstellen kann, gehe dann in Deinem Browser zu http://www.example.com/monitoring/ und Du siehst die ersten Statistiken. Nach ein paar Tagen, könnte es so aussehen:

(Dies ist nur ein kleiner Auszug aus den zahlreichen Grafiken, die munin erzeugt…)

3 Schütze das munin Ausgabe-Verzeichnis mit einem Passwort (Optional)

Es ist sehr vorteilhaft das Verzeichnis /var/www/www.example.com/web/monitoring mit einem Passwort zu schützen, wenn Du nicht möchtest, dass jeder jede noch so kleine Statistik Deines Servers sehen soll.

Dafür erstellen wir eine .htaccess Datei in /var/www/www.example.com/web/monitoring:

vi /var/www/www.example.com/web/monitoring/.htaccess

AuthType Basic
AuthName "Members Only"
AuthUserFile /var/www/www.example.com/.htpasswd
<limit GET PUT POST>
require valid-user
</limit>

Dann müssen wir die Passwortdatei erstellen /var/www/www.example.com/.htpasswd. Wir möchten uns mit dem Nutzernamen admin einloggen, daher führen wir Folgendes aus:

htpasswd -c /var/www/www.example.com/.htpasswd admin

Gib ein Passwort für admin ein und fertig bist Du!

4 Installation und Konfiguration von monit

Monit ist nicht in den offiziellen Fedora 7 Paketdatenbanken erhältlich, sondern in den RPMforge Datenbanken (siehe http://dag.wieers.com/rpm/FAQ.php#B2 für Instruktionen). Wir installieren das RPMforge Paket für RHEL 5, welches auch auf Fedora 7 funktioniert:

rpm -Uhv http://apt.sw.be/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm

Danach installieren wir monit:

yum install monit

Dann erstellen wir die System Startup Links für monit:

chkconfig –levels 235 monit on

Monits Standard-Konfigurationsdatei ist /etc/monit.conf in der Du ein paar Beispiele von Konfigurationen sehen kannst (mehr Beispiele findest Du auf http://www.tildeslash.com/monit/doc/examples.php), die alle auskommentiert sind, sie gibt Monit auch an, in dem Verzeichnis /etc/monit.d nach Konfigurationsdateien nachzusehen. An Stelle der Bearbeitung von /etc/monit.conf erstellen wir daher eine neue Konfigurationsdatei /etc/monit.d/monitrc. In meinem Fall möchte ich proftpd, sshd, mysql, apache, und postfix überwachen. Weiterhin möchte ich das monit Web Interface auf Port 2812 aktivieren. Ich möchte ein https Web Interface und mich mit dem Nutzernamen admin und dem Passwort test in das Web Interface einloggen. Zuguterletzt möchte ich, dass monit Email-Warnungen an diese Adresse schickt root@localhost, also sieht meine Datei so aus:

vi /etc/monit.d/monitrc

set daemon  60
set logfile syslog facility log_daemon
set mailserver localhost
set mail-format { from: monit@server1.example.com }
set alert root@localhost
set httpd port 2812 and
     SSL ENABLE
     PEMFILE  /var/certs/monit.pem
     allow admin:test   

check process proftpd with pidfile /var/run/proftpd.pid
   start program = "/etc/init.d/proftpd start"
   stop program  = "/etc/init.d/proftpd stop"
   if failed port 21 protocol ftp then restart
   if 5 restarts within 5 cycles then timeout   

check process sshd with pidfile /var/run/sshd.pid
   start program  "/etc/init.d/sshd start"
   stop program  "/etc/init.d/sshd stop"
   if failed port 22 protocol ssh then restart
   if 5 restarts within 5 cycles then timeout   

check process mysql with pidfile /var/run/mysqld/mysqld.pid
   group database
   start program = "/etc/init.d/mysqld start"
   stop program = "/etc/init.d/mysqld stop"
   if failed host 127.0.0.1 port 3306 then restart
   if 5 restarts within 5 cycles then timeout   

check process apache with pidfile /var/run/httpd.pid
   group www
   start program = "/etc/init.d/httpd start"
   stop program  = "/etc/init.d/httpd stop"
   if failed host www.example.com port 80 protocol http
      and request "/monit/token" then restart
   if cpu is greater than 60% for 2 cycles then alert
   if cpu > 80% for 5 cycles then restart
   if totalmem > 500 MB for 5 cycles then restart
   if children > 250 then restart
   if loadavg(5min) greater than 10 for 8 cycles then stop
   if 3 restarts within 5 cycles then timeout   

check process postfix with pidfile /var/spool/postfix/pid/master.pid
   group mail
   start program = "/etc/init.d/postfix start"
   stop  program = "/etc/init.d/postfix stop"
   if failed port 25 protocol smtp then restart
   if 5 restarts within 5 cycles then timeout

(Bitte vergewissere Dich, dass Du nur die Prozesse überwachst, die es auch tatsächlich auf Deinem Server gibt – anderenfalls startet monit nicht. Das heißt, wenn Du monit sagst, dass es Postfix überprüfen soll, Postfix aber nicht installiert ist, wird monit nicht starten.)

Die Konfigurationsdatei ist sehr selbserklärend; wenn Du Dir über eine Option nicht sicher bist, kannst Du in folgenden monit Dokumenten nachsehen: http://www.tildeslash.com/monit/doc/manual.php

Im apache Teil der monit Konfiguration wirst Du auf Folgendes stoßen:

   if failed host www.example.com port 80 protocol http
      and request "/monit/token" then restart

was bedeutet, dass monit versucht sich mit www.example.com auf Port 80 zu verbinden und auf die Datei /monit/token zuzugreifen, welche diese ist /var/www/www.example.com/web/monit/token da der Document Root unserer Website /var/www/www.example.com/web ist. Wenn monit nicht erfolgreich ist, heißt das, dass Apache nicht läuft und monit es neu starten wird. Nun müssen wir die Datei /var/www/www.example.com/web/monit/token erstellen und ein paar zufällige Worte rein schreiben:

mkdir /var/www/www.example.com/web/monit
echo „hello“ > /var/www/www.example.com/web/monit/token

Als Nächstes erstellen wir das pem cert (/var/certs/monit.pem), das wir für das SSL-verschlüsselte monit Web Interface benötigen:

mkdir /var/certs
cd /var/certs

Wir brauchen eine OpenSSL Konfigurationsdatei um unser Zertifikat zu erstellen. Es kann wie folgt aussehen:

vi /var/certs/monit.cnf

# create RSA certs - Server   

RANDFILE = ./openssl.rnd   

[ req ]
default_bits = 1024
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type   

[ req_dn ]
countryName = Country Name (2 letter code)
countryName_default = MO   

stateOrProvinceName             = State or Province Name (full name)
stateOrProvinceName_default     = Monitoria   

localityName                    = Locality Name (eg, city)
localityName_default            = Monittown   

organizationName                = Organization Name (eg, company)
organizationName_default        = Monit Inc.   

organizationalUnitName          = Organizational Unit Name (eg, section)
organizationalUnitName_default  = Dept. of Monitoring Technologies   

commonName                      = Common Name (FQDN of your server)
commonName_default              = server.monit.mo   

emailAddress                    = Email Address
emailAddress_default            = root@monit.mo   

[ cert_type ]
nsCertType = server

Nun erstellen wir das Zertifikat wie folgt:

openssl req -new -x509 -days 365 -nodes -config ./monit.cnf -out /var/certs/monit.pem -keyout /var/certs/monit.pem

openssl gendh 512 >> /var/certs/monit.pem

openssl x509 -subject -dates -fingerprint -noout -in /var/certs/monit.pem

chmod 700 /var/certs/monit.pem

Endlich können wir monit starten:

/etc/init.d/monit start

Richte Deinen Browser auf https://www.example.com:2812/ (vergewissere Dich, dass Port 2812 nicht von Deiner Firewall blockiert ist), logge Dich mit admin und test ein. Du müsstest das monit Web Interface sehen. So sollte es aussehen:

(Main Screen)

(Apache Status Seite)

Je nach dem wie Deine Konfiguration in /etc/monit.d/monitrc ist, wird monit Deine Services neu starten, wenn sie ausfallen und Meldungen senden wenn sich Prozess IDs Deiner Services verändern etc.

Viel Spaß!

5 Links

Das könnte Dich auch interessieren …