Monit ist ein mächtiges Tool um lokale Serverdienste oder auch entferne Systeme zuverlässig zu überwachen. So lassen sich zum Beispiel Apache, Postfix oder SpamAssassin bei zu hoher Last automatisch neu starten. Monit kommt bereits mit einer Vielzahl fertiger Konfigurationsdateien für die gängigsten Dienste. Dieser Beitrag gibt einen kurzen Überblick über die Installation und den Einsatz mit Apache, Postfix und SpamAssassin.
Das Watchdog Modul von Plesk basiert ebenfalls auf Monit, jedoch lässt dieses nur ganz einfache Konfigurationen zu. Wer die Überwachung wichtiger Systemdienste smarter gestalten will, kann Monit parallel zu Plesk Watchdog installieren.
- 1 Monit installieren
- 2 Monit konfigurieren
- 3 Apache Webserver mit Monit überwachen und automatisch neu starten
- 4 Postfix Mailserver mit Monit überwachen und automatisch neu starten
- 5 Spam Assassin mit Monit überwachen und automatisch neu starten
- 6 Konfiguration von Monit überprüfen und starten
- 7 Monit startet nicht ?
- 8 SSH-Tunneling: Monit per Browser sicher überwachen
Monit installieren
Die Installation von Monit gestaltet sich unter Linux mit dem entsprechenden Paketmanager gewohnt einfach:
1 2 |
apt-get install monit |
Die Konfiguration für Monit befindet sich in /etc/monit und hat die folgende Struktur:
- monitrc: Die Konfigurationsdatei von Monit.
- conf-available: Ordner mit Beispielkonfigurationen verschiedener Systemdienste.
- conf-enabled: Dieser Ordner enthält die momentan aktivierten Dienst-Konfigurationen.
- config.d: Wie conf-enabled. In unseren Beispielen werden wir diesen Ordner verwenden.
- templates: Dieser Ordner enthält häufig benutzte “Code-Schnipsel“
Monit konfigurieren
Über monitrc werden alle Dateien, die sich in den Ordnern conf-enabled und config.d befinden automatisch nachgeladen. Da wir nur den Ordner config.d benutzen möchten, kommentieren wir das Nachladen des 2. Ordners am Ende von monitrc durch Voranstellen einer Raute aus:
1 |
# include /etc/monit/conf-enabled/* |
Damit wir alle wesentlichen Änderungen der Hauptkonfiguration an einer Stelle haben, legen wir folgende Datei an:
/etc/monit/conf.d/main
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
set daemon 120 set logfile /var/log/monit.log set alert mail@domain.com set mailserver mail.domain.com port 587 username "mail@domain.com" password "XXXXXXXX" using tlsv1 with timeout 30 seconds set mail-format { from: monit@$HOST subject: monit alert -- $EVENT $SERVICE message: $EVENT Service $SERVICE Date: $DATE Action: $ACTION Host: $HOST Description: $DESCRIPTION -- Monit } set httpd port 2812 and use address localhost # only accept connection from localhost allow localhost # allow localhost to connect to the server and allow admin:monit # require user 'admin' with password 'monit' |
Der Inhalt von “main” überschreibt alle gleichen Inhalte von monitrc. Somit ersparen wir uns langes Suchen in der relativ langen Hauptkonfiguration.
Die o.g. Konfiguration hat folgende Funktion:
- Monit überprüft alle konfigurierten Systemdienste alle 120 Sekunden.
- Es wird eine Log-Datei erzeugt.
- Alarm-Meldungen werden an eine bestimmte Emailadresse gesendet.
- Es wird ein externer Mailserver mit entsprechenden Zugangsdaten verwendet. Das macht Sinn, da wir ja evtl. Ausfälle unseres eigenen Mailservers kontrollieren möchten.
- Der Inhalt der Alarmmeldungen wird festgelegt.
- Der interne HTTP-Server von Monit wird initialisiert. Dazu später mehr.
Apache Webserver mit Monit überwachen und automatisch neu starten
Als Nächstes erzeugen wird die Konfiguration zum Überwachen des Apache Webservers:
/etc/monit/conf.d/apache2
1 2 3 4 5 6 7 8 9 10 |
check process httpd with pidfile /var/run/apache2/apache2.pid group www group apache start program = "/etc/init.d/apache2 start" stop program = "/etc/init.d/apache2 stop" if children > 250 then restart if failed host domain.com port 80 with protocol http and request “/index.php” with timeout 25 seconds for 1 times within 1 cycles then restart if loadavg(5min) greater than 10 for 8 cycles then restart # Uncomment, if you don’t want the service to restart forever: #if 5 restarts within 5 cycles then timeout |
Monit überwacht den Systemdienst Apache anhand seines Namens und Prozess ID. Wenn folgende Bedingungen erfüllt sind, wird Apache neu gestartet:
- Es wurden mehr als 250 Child-Prozesse erzeugt.
- Der HTTP-Dienst für die URL http://domain.com/index.php benötigt länger als 25 Sekunden um eine Seite auszuliefern.
- Die Anzahl der Prozesse in der System Run Queue beträgt 5 Minuten lang mehr als 10, gemessen innerhalb von 8 Zyklen (8 x 120 Sekunden)
Das Aktivieren der letzten Zeile bewirkt, dass Monit die Überwachung nach 5 Neustarts von Apache beendet.
Postfix Mailserver mit Monit überwachen und automatisch neu starten
Das Script zum Überwachen des Postfix Maildienstes ist ähnlich aufgebaut:
/etc/monit/conf.d/postfix
1 2 3 4 5 6 7 8 9 |
check process postfix with pidfile /var/spool/postfix/pid/master.pid group system group mail group postfix start program = "/etc/init.d/postfix start" stop program = "/etc/init.d/postfix stop" if failed host mail.domain.com port 25 with protocol smtp for 1 times within 1 cycles then restart # Uncomment, if you don’t want the service to restart forever: #if 5 restarts within 5 cycles then timeout |
Neben dem laufenden Prozess prüft Monit hier zusätzlich die Erreichbarkeit von Postfix per SMTP-Protokoll.
Spam Assassin mit Monit überwachen und automatisch neu starten
Als letztes Beispiel folgt analog die Überwachung von Spam Assassin:
/etc/monit/conf.d/spamassassin
1 2 3 4 5 6 |
check process spamd with pidfile /var/run/spamassassin.pid group mail start program = "/etc/init.d/spamassassin start" stop program = "/etc/init.d/spamassassin stop" # Uncomment, if you don’t want the service to restart forever: #if 5 restarts within 5 cycles then timeout |
Weitere Beispiele für viele andere Systemdienste sind im Ordner /etc/monit/conf-available zu finden. Es lohnt auf alle Fälle, sich tiefer in die mächtige Skriptsprache von Monit anhand des Manuals einzulesen:
1 |
man monit |
Konfiguration von Monit überprüfen und starten
Mit dem folgenden Befehl überprüfen wir die Syntax unserer Konfigdateien:
1 |
monit -t |
Danach starten wir Monit mit
1 |
/etc/init.d/monit start |
und kontrollieren mit
1 |
monit status |
ob der Monit Daemon läuft.
Monit startet nicht ?
Wenn als Status diese Meldung erscheint, ist etwas schief gelaufen:
Status not available — the monit daemon is not running
In den meisten Fällen muss das Init-Script von Monit etwas modifiziert werden. Sollte das Problem dadurch nicht gelöst worden sein, findet man weitere Hinweise in der Log-Datei:
/var/log/monit.log
Das folgende Init-Script ersetzt das Original Init Script von Monit unter:
/etc/init.d/monit
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
#!/bin/sh ### BEGIN INIT INFO # Provides: monit # Required-Start: $remote_fs # Required-Stop: $remote_fs # Should-Start: $all # Should-Stop: $all # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: service and resource monitoring daemon # Description: monit is a utility for managing and monitoring # processes, programs, files, directories and filesystems # on a Unix system. Monit conducts automatic maintenance # and repair and can execute meaningful causal actions # in error situations. ### END INIT INFO set -e #. /lib/lsb/init-functions DAEMON=/usr/bin/monit CONFIG=/etc/monit/monitrc NAME=monit DESC="daemon monitor" MONIT_OPTS="" PID="/run/$NAME.pid" START=yes log_daemon_msg () { # Dummy function to be replaced by LSB library. echo $@ } log_end_msg () { # Dummy function to be replaced by LSB library. if test "$1" != "0"; then echo "Error with $DESCRIPTION: $NAME" fi return $1 } # Check if DAEMON binary exist [ -f $DAEMON ] || exit 0 [ -f "/etc/default/$NAME" ] && . /etc/default/$NAME MONIT_OPTS="-c $CONFIG $MONIT_OPTS" monit_not_configured () { if [ "$1" != "stop" ] then printf "\tplease configure $NAME and then edit /etc/default/$NAME\n" printf "\tand set the \"START\" variable to \"yes\" in order to allow\n" printf "\t$NAME to start\n" fi exit 0 } monit_checks () { # Check if START variable is set to "yes", if not we exit. if [ "$START" != "yes" ] then monit_not_configured $1 fi } case "$1" in start) log_daemon_msg "Starting $DESC" "$NAME" monit_checks $1 if start-stop-daemon --start --quiet --oknodo --pidfile $PID --exec $DAEMON -- $MONIT_OPTS 1>/dev/null then log_end_msg 0 else log_end_msg 1 fi ;; stop) log_daemon_msg "Stopping $DESC" "$NAME" if start-stop-daemon --retry TERM/5/KILL/5 --oknodo --stop --quiet --pidfile $PID 1>/dev/null then log_end_msg 0 else log_end_msg 1 fi ;; reload) log_daemon_msg "Reloading $DESC configuration" "$NAME" if start-stop-daemon --stop --signal HUP --quiet --oknodo --pidfile $PID --exec $DAEMON -- $MONIT_OPTS 1>/dev/null then log_end_msg 0 else log_end_msg 1 fi ;; restart|force-reload) log_daemon_msg "Restarting $DESC" "$NAME" start-stop-daemon --retry TERM/5/KILL/5 --oknodo --stop --quiet --pidfile $PID 1>/dev/null if start-stop-daemon --start --quiet --oknodo --pidfile $PID --exec $DAEMON -- $MONIT_OPTS 1>/dev/null then log_end_msg 0 else log_end_msg 1 fi ;; syntax) $DAEMON $MONIT_OPTS -t ;; status) status_of_proc -p $PID $DAEMON $NAME ;; *) log_action_msg "Usage: /etc/init.d/$NAME {start|stop|reload|restart|force-reload|syntax|status}" ;; esac exit 0 |
SSH-Tunneling: Monit per Browser sicher überwachen
Zum Abschluss noch ein Tipp, wie man Monit bequem und sicher über den Webbrowser überwachen kann.
Eingangs hatten wir den Webbrowser von Monit in /etc/monit/conf.d/main so konfiguriert, dass er nur auf Verbindungen auf localhost reagiert. Über einen SSH-Tunnel können wir nun den lokalen Port 2812 auf dem Server an unseren Client-Rechner z.B. an Port 8000 weiterleiten. Das geschieht über einen verschlüsselten Tunnel, ohne einen Port in der Firewall des Servers oder dem Client-Rechner zu öffnen.
Hierzu geben wir am Client-Rechner folgenden Befehl ein:
1 |
ssh -l root domain.com -L 8000:localhost:2812 -N |
Nach Eingabe des root Passworts lassen wir den Befehl so im Terminal stehen und geben im Browser die folgende URL ein um auf den Monit Webserver zuzugreifen:
1 |
http://localhost:8000 |
In der Anmeldung geben wir dann als User admin und als Passwort monit ein. Als Belohnung erhalten wir ein schönes, übersichtliches Web-Interface :-)