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.

Monit installieren

Die Installation von Monit gestaltet sich unter Linux mit dem entsprechenden Paketmanager gewohnt einfach:

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:

#   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
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

 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

 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

 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:
man monit

Konfiguration von Monit überprüfen und starten

Mit dem folgenden Befehl überprüfen wir die Syntax unserer Konfigdateien:

monit -t

Danach starten wir Monit mit
/etc/init.d/monit start

und kontrollieren mit
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

#!/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:

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:
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 :-)