Serverüberwachung mit munin und monit unter Debian Squeeze

Version 1.0

Author: Falko Timme , Christian Schmalfeld <c [dot] schmalfeld [at] projektfarm [dot] de>

Follow me on Twitter


In diesem Tutorial zeige ich Ihnen, wie Sie Ihren Debian Squeeze Server mit munin und monit überwachen. Munin erstellt ohne große Konfiguration hübsche Grafiken zu beinahe jedem Aspekt Ihres Servers (durchschnittliche Auslastung, Speicherverbrauch, CPU Auslastung, MySQL Datendurchlauf, eth0 Traffic, etc.), während monit die Verfügbarkeit von Diensten wie Apache, MySQL und Postfix anzeigt und die entsprechenden Operationen durchführt, sollte ein Dienst nicht laufen wie geplant, wie z.B. einen Neustart. Die Kombination der beiden gewährt Ihnen komplette Überwachung: mit Hilfe der Grafiken können Sie zukünftige oder aktuelle Probleme erkennen und mit monit sind Ihre überwachten Dienste immer verfügbar.

Obwohl munin auch mehr als einen Server überwachen kann, werde ich an dieser Stelle nur das Überwachen des Servers beschreiben, auf dem es installiert ist.

Dieses Tutorial wurde für Debian Squeeze geschrieben, müsste allerdings, möglicherweise mit kleinen Änderungen, genauso auf anderen Distributionen funktionieren.

Die hier beschriebene Weise, das System aufzusetzen, ist nicht die einzig mögliche. Es ist lediglich die Art und Weise, die ich bevorzuge. Für die Richtigkeit der Inhalte dieses Tutorials gebe ich keinerlei Garantie.

1 Vorbemerkung

Ich benutze den Hostnamen server1.example.com mit die Webseite www.example.com, deren Stammverzeichnis /var/www/www.example.com/web ist.

2 Installation und Konfiguration von munin

Tun Sie folgendes um munin unter Debian Squeeze zu installieren:

apt-get install munin munin-node munin-plugins-extra

Als nächstes müssen Sie die munin Konfigurationsdatei /etc/munin/munin.conf editieren. Entkommentieren Sie die dbdir, htmldir, logdir, rundir und tmpldir Zeilen (die Standardwerte sind in Ordnung). Munin soll in der HTML Ausgabe den Namen server1.example.com statt localhost.localdomain anzeigen, deshalb ersetzen Sie in der simple host tree Sektion localhost.localdomain durch server1.example.com. Ohne die Kommentare sieht die geänderte Datei folgendermaßen aus:

vi /etc/munin/munin.conf

# Example configuration file for Munin, generated by 'make build'
# The next three variables specifies where the location of the RRD # databases, the HTML output, logs and the lock/pid files. They all # must be writable by the user running munin-cron. They are all # defaulted to the values you see here. # dbdir /var/lib/munin htmldir /var/cache/munin/www logdir /var/log/munin rundir /var/run/munin # # Where to look for the HTML templates tmpldir /etc/munin/templates # (Exactly one) directory to include all files from. # includedir /etc/munin/munin-conf.d [...] # a simple host tree [server1.example.com] address 127.0.0.1 use_node_name yes [...]
Sie sollten die Apache Konfigurationsdatei für Munin, /etc/apache2/conf.d/munin, ändern (dies ist eigentlich nur ein Symlink zu /etc/munin/apache.conf) - sie definiert ein Alias namens munin zu munins HTML Ausgabeverzeichnis /var/cache/munin/www, was bedeutet, dass Sie munin von allen Webseiten dieses Servers mit dem relativen Pfad /munin (z.B. http://www.example.com/munin) aufrufen können.

Kommentieren Sie die Zeile Allow from localhost 127.0.0.0/8 ::1 aus und benutzen Sie statt dessen Allow from all (andernfalls können Sie munin nur über localhost benutzen):

vi /etc/apache2/conf.d/munin

Alias /munin /var/cache/munin/www
<Directory /var/cache/munin/www> Order allow,deny Allow from all #Allow from localhost 127.0.0.0/8 ::1 Options None # This file can be used as a .htaccess file, or a part of your apache # config file. # # For the .htaccess file option to work the munin www directory # (/var/cache/munin/www) must have "AllowOverride all" or something # close to that set. # # AuthUserFile /etc/munin/munin-htpasswd # AuthName "Munin" # AuthType Basic # require valid-user # This next part requires mod_expires to be enabled. # # Set the default expiration time for files to 5 minutes 10 seconds from # their creation (modification) time. There are probably new files by # that time. # <IfModule mod_expires.c> ExpiresActive On ExpiresDefault M310 </IfModule> </Directory>
Starten Sie Apache neu:

/etc/init.d/apache2 restart

Starten Sie dann munin neu:

/etc/init.d/munin-node restart

Warten Sie nun einpaar Minuten damit munin seine erste Ausgabe erstellen kann und gehen Sie dann mit Ihrem Browser auf http://www.example.com/munin/, wo Sie die ersten Statistiken vorfinden sollten. Nach einpaar Tagen könnte es folgendermaßen aussehen:


(Dies ist nur ein kleiner Ausschnitt der vielen Grafiken, die munin erstellt...)

3 Das munin Ausgabeverzeichnis durch ein Passwort schützen (optional)

Wenn Sie nicht möchten, dass jeder Dahergelaufene die Statistiken Ihres Servers einsehen kann, wäre es gut das Ausgabeverzeichnis durch ein Passwort zu sichern.

Erstellen Sie hierzu die Passwortdatei /etc/munin/munin-htpasswd. Ich möchte mich mit dem Benutzernamen admin anmelden, deshalb benutze ich:

htpasswd -c /etc/munin/munin-htpasswd admin

Geben Sie ein Passwort für admin ein. Öffnen Sie dann erneut /etc/apache2/conf.d/munin...

vi /etc/apache2/conf.d/munin

... und entkommentieren Sie die folgende Sektion:
[...]
AuthUserFile /etc/munin/munin-htpasswd AuthName "Munin" AuthType Basic require valid-user [...]
Starten Sie Apache dann neu:

/etc/init.d/apache2 restart


4 Installation und Konfiguration von monit

Um monit zu installieren benutzen Sie folgendes:

apt-get install monit

Nun müssen Sie /etc/monit/monitrc editieren. Die Standarddatei /etc/monit/monitrc beinhaltet viele Beispiele, zusätzlich können Sie weitere Konfigurationsbeispiele unter http://mmonit.com/monit/documentation/ finden. In meinem Fall möchte ich jedoch proftpd, sshd, mysql, apache und postfix überwachen, die monit Web-Oberfläche über Port 2812 laufen lassen, eine https Web-Oberfläche, mich mit dem Benutzernamen admin und dem Passwort test in der Oberfläche anmelden und monit E-Mail-Warnungen an root@localhost verschicken lassen, sodass meine Datei letztenendes folgendermaßen aussieht (Ich habe Beispiele für andere Daemons zur Datei hinzugefügt, sodass Sie Ihre Datei Ihren Wünschen nach anpassen können):

cp /etc/monit/monitrc /etc/monit/monitrc_orig
cat /dev/null > /etc/monit/monitrc
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 #check process nginx with pidfile /var/run/nginx.pid # start program = "/etc/init.d/nginx start" # stop program = "/etc/init.d/nginx stop" # if failed host 127.0.0.1 port 80 then restart # #check process memcached with pidfile /var/run/memcached.pid # start program = "/etc/init.d/memcached start" # stop program = "/etc/init.d/memcached stop" # if failed host 127.0.0.1 port 11211 then restart # #check process pureftpd with pidfile /var/run/pure-ftpd/pure-ftpd.pid # start program = "/etc/init.d/pure-ftpd-mysql start" # stop program = "/etc/init.d/pure-ftpd-mysql stop" # if failed port 21 protocol ftp then restart # if 5 restarts within 5 cycles then timeout # #check process named with pidfile /var/run/named/named.pid # start program = "/etc/init.d/bind9 start" # stop program = "/etc/init.d/bind9 stop" # if failed host 127.0.0.1 port 53 type tcp protocol dns then restart # if failed host 127.0.0.1 port 53 type udp protocol dns then restart # if 5 restarts within 5 cycles then timeout # #check process ntpd with pidfile /var/run/ntpd.pid # start program = "/etc/init.d/ntp start" # stop program = "/etc/init.d/ntp stop" # if failed host 127.0.0.1 port 123 type udp then restart # if 5 restarts within 5 cycles then timeout # #check process mailman with pidfile /var/run/mailman/mailman.pid # group mail # start program = "/etc/init.d/mailman start" # stop program = "/etc/init.d/mailman stop" # #check process amavisd with pidfile /var/run/amavis/amavisd.pid # group mail # start program = "/etc/init.d/amavis start" # stop program = "/etc/init.d/amavis stop" # if failed port 10024 protocol smtp then restart # if 5 restarts within 5 cycles then timeout # #check process courier-imap with pidfile /var/run/courier/imapd.pid # group mail # start program = "/etc/init.d/courier-imap start" # stop program = "/etc/init.d/courier-imap stop" # if failed host localhost port 143 type tcp protocol imap then restart # if 5 restarts within 5 cycles then timeout # #check process courier-imap-ssl with pidfile /var/run/courier/imapd-ssl.pid # group mail # start program = "/etc/init.d/courier-imap-ssl start" # stop program = "/etc/init.d/courier-imap-ssl stop" # if failed host localhost port 993 type tcpssl sslauto protocol imap then restart # if 5 restarts within 5 cycles then timeout # #check process courier-pop3 with pidfile /var/run/courier/pop3d.pid # group mail # start program = "/etc/init.d/courier-pop start" # stop program = "/etc/init.d/courier-pop stop" # if failed host localhost port 110 type tcp protocol pop then restart # if 5 restarts within 5 cycles then timeout # #check process courier-pop3-ssl with pidfile /var/run/courier/pop3d-ssl.pid # group mail # start program = "/etc/init.d/courier-pop-ssl start" # stop program = "/etc/init.d/courier-pop-ssl stop" # if failed host localhost port 995 type tcpssl sslauto protocol pop then restart # if 5 restarts within 5 cycles then timeout # #check process dovecot with pidfile /var/run/dovecot/master.pid # group mail # start program = "/etc/init.d/dovecot start" # stop program = "/etc/init.d/dovecot stop" # if failed host localhost port 993 type tcpssl sslauto protocol imap then restart # if 5 restarts within 5 cycles then timeout
Die Konfigurationsdatei ist relativ selbsterklärend. Sind Sie sich bei einer Option unsicher, schauen Sie sich die monit Dokumentation an http://mmonit.com/monit/documentation/monit.html
Im apache Teil der monit Konfiguration werden Sie folgendes finden:
 if failed host www.example.com port 80 protocol http
and request "/monit/token" then restart
Dies bedeutet, dass monit versucht sich über Port 80 mit www.example.com zu verbinden und auf die Datei /monit/token zuzugreifen, deren Pfad /var/www/www.example.com/web/monit/token ist, da das Stammverzeichnis der Webseite /var/www/www.example.com/web ist. Sollte monit dies nicht bewerkstelligen können bedeutet das, dass Apache nicht läuft und monit dieses neu starten wird. Erstellen Sie nun die Datei /var/www/www.example.com/web/monit/token und fügen dort eine beliebige Zufallszeichenkette ein:

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

Als nächstes erstellen Sie das pem Zertifikat (/var/certs/monit.pem), welches Sie für die SSL-verschlüsselte Web-Oberfläche benötigen:

mkdir /var/certs
cd /var/certs

Sie benötigen eine OpenSSL Konfiguration um das Zertifikat zu erstellen. Diese könnte so aussehen:

vi /var/certs/monit.cnf

# create RSA certs - Server
RANDFILE = ./openssl.rnd [ req ] default_bits = 2048 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
Erstellen Sie jetzt folgendermaßen das Zertifikat:

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

Editieren Sie im Anschluss /etc/default/monit um den monit Daemon zu aktivieren. Setzen Sie startup gleich 1:

vi /etc/default/monit

# Defaults for monit initscript
# sourced by /etc/init.d/monit # installed at /etc/default/monit by maintainer scripts # Stefan Alfredsson <alfs@debian.org> # You must set this variable to for monit to start startup=1 # You can change the location of the state file here # It can also be set in monitrc # STATEFILE="/var/lib/monit/monit.state" # To change the intervals which monit should run, # edit the configuration file /etc/monit/monitrc # It can no longer be configured here.
Schließlich können Sie monit starten:

/etc/init.d/monit start

Gehen Sie nun mit Ihrem Internetbrowser auf https://www.example.com:2812/ (stellen Sie sicher, dass Port 2812 nicht von Ihrer Firewall geblock wird), melden Sie sich mit admin und test an und Sie können die monit Web-Oberfläche sehen. Diese sollte etwa so aussehen:


(Hauptbildschirm)


(Apache Statusseite)

Abhängig von Ihrer Konfiguration in /etc/monit/monitrc wird monit Ihre Dienste bei einem Ausfall neu starten und E-Mail Notizen versenden, wenn sich die Prozess ID eines Dienstes ändert, etc.

Viel Spaß!

5 Links