Server-Überwachung mit munin und monit

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

Diese Anleitung veranschaulicht, wie Du Deinen Server mit munin und monit überwachen kannst. munin erzeugt schicke, kleine Grafiken über fast jeden Aspekt Deines Servers (durchschnittliche Auslastung, Speicherauslastung, Prozessorauslastung, MySQL Durchsatz, Netzwerkverkehr, etc.) ohne aufwendige Konfiguration. Wohingegen monit die Verfügbarkeit von Diensten wie Apache, MySQL und Postfix überprüft und handelt entsprechend . Wenn es zum Beispiel feststellt, dass ein Dienst nicht wie gewünscht funktioniert, veranlasst monit einen Neustart. Die Kombination der beiden ermöglicht Dir eine optimale Kontrolle: Grafiken, die Dir derzeitige oder aufkommende Probleme anzeigen (wie z.B. “Wir benötigen bald einen größeren Server, unsere durchschnittliche Auslastung erhöht sich rasch.”), und ein Wachhund, der die Verfügbarkeit der zu überwachenden Dienste gewährleistet.

Obwohl Du mit munin mehr als einen Server überwachen kannst, werden wir hier nur die Überwachung des Systems diskutieren, auf dem es installiert ist.

Diese Anleitung ist für Debian Sarge geschrieben worden, die Konfiguration sollte allerdings mit kleinen Änderungen auch auf andere Distributionen passen.

Ich möchte an dieser Stelle darauf hinweisen, dass dies nicht der einzige Weg ist ein solches System einzurichten. Es gibt viele Möglichkeiten das Ziel zu erreichen – dies ist der Weg, den ich gewählt habe. Ich übernehme keine Garantie, dass dies auch bei Dir funktioniert!

1 Derzeitige Situation

Der Hostname unseres Systems ist erver1.example.com und wir haben eine Webseite www.example.com mit dem Dokumenten-Root /var/www/www.example.com/web.

2 Installation und Konfiguration von munin

Um munin auf Debian Sarge zu installieren, führen wir Folgendes aus:

apt-get install munin munin-node

Als Nächstes müssen wir die munin Konfigurationsdatei bearbeiten /etc/munin/munin.conf. Wir möchten, dass munin seine Ausgabe in das Verzeichnis  /var/www/www.example.com/web/monitoring setzt, daher ändern wir den Wert von htmldir. Außerdem möchten wir, dass es server1.example.com anstelle von localhost.localdomain in der HTML Ausgabe verwendet, daher 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

tmpldir /etc/munin/templates

[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 ändern die Benutzerrechte auf den Benutzer und die Gruppe munin, sonst kann munin seine Ausgabe nicht in dieses Verzeichnis setzen. 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 nun ein paar Minuten, so dass munin seine erste Ausgabe erzeugen kann und gehe dann zu http://www.example.com/monitoring/ in Deinem Browser. Du siehst die ersten Statistiken. Nach ein paar Tagen könnte dies wie folgt aussehen:

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

3 Das munin Ausgabenverzeichnis mit einem Passwort schützen (optional)

Es ist keine schlechte Idee, das Verzeichnis /var/www/www.example.com/web/monitoring mit einem Passwort zu schützen, wenn Du nicht möchtest, dass sich jeder die Statistiken Deines Servers ansehen kann.

Dazu 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 Passwort-Datei /var/www/www.example.com/.htpasswd erstellen. Wir möchten uns mit dem Benutzernamen admin anmelden, also führen wir dies aus:

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

Gib für admin ein Passwort ein und das war’s!

4 Installation und Konfiguration von monit

Um monit zu installieren, führen wir dies aus:

apt-get install monit

Nun müssen wir  /etc/monit/monitrc bearbeiten. Die Standarddatei /etc/monit/monitrc hat viele Beispiele. Mehr Konfigurationsbeispiele findest Du auf http://www.tildeslash.com/monit/doc/examples.php. In meinem Fall möchte ich jedoch proftpd, sshd, mysql, apache und postfix überwachen, das monit Web Interface auf Port 2812 aktivieren, ich möchte ein https Web Interface, möchte mich mit dem Benutzernamen admin und dem Passwort test auf dem Web Unterface anmelden und ich möchte, dass monit E-Mail-Warnungen an root@localhost sendet, also sieht meine Datei wie folgt aus:

vi /etc/monit/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/ssh start"
   stop program  "/etc/init.d/ssh 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/mysql start"
   stop program = "/etc/init.d/mysql 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/apache2.pid
   group www
   start program = "/etc/init.d/apache2 start"
   stop program  = "/etc/init.d/apache2 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

Die Konfigurationsdatei ist ziemlich selbsterklärend; wenn Du Dir über eine Option nicht ganz sicher bist, sieh Dir die monit Dokumentation an: http://www.tildeslash.com/monit/doc/manual.php

Im apache Teil der monit Konfiguration findest Du Folgendes:

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

was bedeutet, dass monit versucht, sich zu www.example.com auf Port 80 zu verbinden und auf die Datei /monit/token zuzugreifen, die /var/www/www.example.com/web/monit/token ist, da der Dokumenten-Root unserer Webseite /var/www/www.example.com/web ist. Wenn monit nicht erfolgreich ist, heißt das, dass Apache nicht ausgeführt und monit es neu starten wird. Nun müssen wir die Datei /var/www/www.example.com/web/monit/token erstellen und einige Zuallszeichen hinein 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 unsere Zertifikate erstellen zu können. So könnte es 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

Danach bearbeiten wir /etc/default/monit um den monit Daemon zu aktivieren. Ändere startup zu 1 und setze CHECK_INTERVALS auf das Interval in Sekunden, in dem monit Dein System überwachen soll. Ich habe 60 (Sekunden) gewählt, also sieht meine Datei wie folgt aus:

vi /etc/default/monit

# Defaults for monit initscript
# sourced by /etc/init.d/monit
# installed at /etc/default/monit by maintainer scripts
# Fredrik Steen <stone@debian.org>

# You must set this variable to for monit to start
startup=1

# To change the intervals which monit should run uncomment
# and change this variable.
CHECK_INTERVALS=60

Nun können wir monit endlich starten:

/etc/init.d/monit start

Richte Deinen Browser nun auf https://www.example.com:2812/ (pass auf, dass Port 2812 nicht von Deiner Firewall geblockt wird), melde Dich mit admin und test an und Du siehst das monit Web Interface. So sollte es aussehen:

(Haupt-Screen)

(Apache Status Seite)

Je nach Konfiguration in /etc/monit/monitrc, wird monit Deine Dienste neu starten, falls sie ausfallen und Benachrichtigungen per E-Mail senden, wenn sich Prozess-IDs von Diensten ändern etc.

Viel Spaß!

5 Links

Das könnte dich auch interessieren …