Überwachung eines CentOS 5.2 Servers mit munin und monit

Version 1.0
Autor: Falko Timme


In dieser Anleitung erfahrt Ihr wie man einen CentOS 5.2 server mit munin und monit überwacht. munin erstellt schicke kleine Graphiken zu fast allen Leistungen des Servers, wie CPU-Auslastung, eth0 Traffic, MySQL Durchsatz, durschnittliche Auslastung etc., und zwar ohne viel konfigurieren zu müssen. monit überprüft die laufenden Dienste wie Apache, MySQL, Postfix und kann gegebenenfalls einen Neustart veranalssen wenn die Dienste sich nicht korrekt verhalten. Die beiden Dienste kombiniert geben die Möglichkeit einer kompletten, graphisch dargestellten Überwachung dass aktuelle oder zukünftige Probleme erkennen lässt. Das können z. B. Dinge sein wie ein zukünftig benötigter grösserer Server aufgrund der wachsenden Auslastung. Zusätzlich hat man eine zuverlässige Überwachung, die die Verfügbarkeit aller Dienste sicher stellt.

Obwohl man mit munin mehrere Server verwalten kann, werde ich in dieser Anleitung auschliesslich auf das hier angegebene System eingehen.

Diese Anleitung wurde für CentOS 5.2 geschrieben, aber die Konfiguration sollte mit kleinen Abweichungen für andere Distributionen ebenfalls funktionieren.
Dieser Weg ist nur eines der zahlreichen Möglichkeiten solch ein System aufzusetzen. Das ist der Weg, den ich gewählt habe und ich kann leider keine Gewähr dafür übernehmen, dass es bei Dir genau so funktioniert!

1 Vorbemerkung

Der Name unseres Hosts ist server1.example.com, und wir haben eine Webseite mit dem Namen www.example.com und mit einem Dokumenten-Root /var/www/www.example.com/web.

2 Die RPMforge Repository aktivieren

munin und monit sind auf CentOS 5.2 nicht in den Standard-Repository verfügbar, doch können wir diese von der RPMforge installieren. Um die RPMforge Repository zu aktivieren, führen wir folgendes aus:

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

rm -f rpmforge-release-0.3.6-1.el5.rf.i386.rpm


auf i386 Hosts und

wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm
rpm -Uvh rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm

rm -f rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm


auf x86_64 Hosts (bitte hol Dir hier die aktuellste Version: https://rpmrepo.org/RPMforge/Using).

3 munin installieren und konfigurieren

Um munin auf CentOS 5.2 zu installieren, machen wir folgendes:

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 /etc/munin/munin.conf editieren. Wir wollen dass munin seine Ergebnisse in das Verzeichnis /var/www/www.example.com/web/monitoring ablegt, daher ändern wir den Wert von htmldir, und wir wollen dass er den Namen server1.example.com anstatt von localhost.localdomain in der HTML Ausgabe verwendet, daher ersetzen wir localhost.localdomain mit server1.example.com. Ohne die Kommentare sieht die geänderte Datei folgendermassen 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 geben die Zugriffsrechte für den Benutzer und Gruppe munin, da sonst munin seine Ergebnisse nicht in das Verzeichnis reintun kann. Danach 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 bitte einige Minuten bis munin seine ersten Ergebnisse erstellen kann, und gehe dann auf http://www.example.com/monitoring/ in Deinem Browser, wo Du die erste Statistik angezeigt bekommst. So kann die Statistik nach einigen Tagen dann aussehen:


(Das ist nur eine kleines Beispiel für die vielen Graphiken, die munin erstellen kann....)

4 Passwortschutz für das Ergebniss-Verzeichnis (Optional)

Es ist natürlich ein gute Iddee das Verzeichnis /var/www/www.example.com/web/monitoring mit einem Passwort zu schützen, wenn Du nicht möchtest dass man jede Statistik Deines Servers sieht.

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 require valid-user

Danach müssen wir die Passwort-Datei erstellen: /var/www/www.example.com/.htpasswd. Wir wollen uns mit dem Benutzernamen admin einloggen, also machen wir folgendes:

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


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

5 monit installieren und konfigurieren

Als Nächstes 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 sich bereits einige Beispiele für eine Konfiguration befinden (noch mehr Beispiele gibt es hier:http://mmonit.com/wiki/Monit/ConfigurationExamples). Sie sind alle auskommentiert, aber monit schaut auch in das Verzeichnis /etc/monit.d nach Konfigurationsdateien, daher anstatt /etc/monit.conf zu modifizieren, erstellen wir einen neue Konfigurationsdatei /etc/monit.d/monitrc. In meinem Fall möchte ich proftpd, sshd, mysql, apache, und postfix überwachen, das monit Webinterface auf Port 2812 aktivieren, ein https Webinterface, dann möchte ich mich mit dem Benutzernamen admin und dem Passwort test in das Webinterface einloggen, und ich möchte dass monit Warnmails an root@localhost sendet, so dass meine Datei so aussieht:

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 versichere Dich dass Du nur Prozesse die tatsächlich auf Deinem Server laufen kontrollierst, sonst wid monit nicht starten. Z.B. wenn man monit mitteilt Postfix zu überprüfen, aber Postfix wurde nicht installiert, wird monit gar nicht erst starten.)


Die Konfigurationsdatei ist selbsterklärend. Solltest Du trotzdem Fragen haben, schau einfach in die Bedienungsanleitung nach: http://mmonit.com/monit/documentation/monit.html
Im apache Teil der monit Konfigurationsdatei findest Du folgendes:

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

Das bedeutet monit versucht sich mit www.example.com auf Port 80 zu verbinden und auf die/monit/token Datei zuzugreifen, welche /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 darauf zugreifen kann, bedeutet es dass Apache nicht läuft, und monit es neu starten wird. Jetzt müssen wir die /var/www/www.example.com/web/monit/token Datei erstellen und ein paar Zeilen reinschreiben:

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 Zertifikat (/var/certs/monit.pem), den wir für ein SSL-verschlüsseltes monit Webinterface benötigen:

mkdir /var/certs
cd /var/certs

Wir benötigen eine OpenSSL Konfigurationsdatei um unser Zertifikat zu erstellen. Es kann so 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 folgendermassen 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


Nun können wir monit endlich starten:

/etc/init.d/monit start


Nun gib in Deinem Browser https://www.example.com:2812/ ein (versichere Dich zuvor dass der Port 2812 nicht von Deiner Firewall blockiert wird), log Dich mit admin und test ein, und dann solltest Du das monit Webinterface sehen können. Es sollte so aussehen:


(Hauptanzeige)


(Apache Status Seite)

Abhängig von Deiner Konfiguration in /etc/monit.d/monitrc wird monit alle Dienste neu starten wenn sie nicht funktionieren und Dir eine Benachrichtigungsmail schicken wenn Prozess-IDs von Diensten sich ändern usw.

Viel Spass !

6 Links