Monit (proaktive Überwachung von Services)

Datum

Monit ist ein einfaches, aber effektives Programm zur Überwachung von Serverdiensten. Falls ein Serverdienst ausfällt, kann er automatisch neu gestartet werden und zusätzlich wird bei Problemen der Systemverwalter per E-Mail informiert.

monit kann problemlos aus den Standard-Repos installiert werden.

Das Programm wird mittels der Datei /etc/monit/monitrc konfiguriert.
Konfigurationsdateien, in welchen Optionen für die zu überwachenden Dienste eingestellt werden, gehören in den Ordner /etc/monit/conf.d/
Auf Red-Hat-basierenden Systemen ist die Konfigurationsdatei: /etc/monitrc und der entsprechende Ordner für die zu überwachenden Dienste /etc/monit.d/.

Konfiguration
Um nun einen Dienst, z.B. Nginx, proaktiv überwachen zu lassen, wird eine nginx.conf im entsprechenden Konfigurationsverzeichnis erstellt.
Die Dateien brauchen auch nicht .conf als Endung. Für Nginx ist eine einfache Überwachung schon mit 3 Zeilen zu erstellen:
check process nginx with pidfile /var/run/nginx.pid
start program = "/etc/init.d/nginx start"
stop program = "/etc/init.d/nginx stop"

Wie man sieht, sind die Konfigurationsdateien quasi selbsterklärend. Hier wird geprüft ob der Dienst noch existiert, indem man prüft ob die entsprechende pid-Datei existiert. Desweiteren ist nur noch angegeben wie der Dienst sauber gestoppt und gestartet wird.
Für Systemd wäre der Aufruf entsprechend:
stop program = "/usr/bin/systemctl stop nginx.service"
start program = "/usr/bin/systemctl start nginx.service"

So lässt sich ein PHP-FPM-Dienst auf die Existenz einer entsprechenden Socket-Datei hin prüfen:
check file php7-blog-socket with path /run/php7-fpm-blog.sock
if not exist then exec "/etc/init.d/php5-fpm restart"

Das Tool kann aber nicht nur auf die bloße Existenz einer Datei hin prüfen, sondern auch z.B. auf die Größe:
check file dump.rdb with path /var/lib/redis/dump.rdb
if size > 100 MB then alert

Monit überwacht aber auch z.B. Ports. Als Beispiel sei hier eine Konfigurationsdatei für MySQL gezeigt:
check process mysql with pidfile /var/run/mysql/mysql.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
So einfach, so gut.

Die Dienste lassen sich natürlich auch unter anderen Benutzern starten. Ein gutes Beispiel ist hier der solr-Dienst:
check process tomcat with pidfile /var/run/tomcat/tomcat.pid
start program = "/etc/init.d/tomcat start"
as uid solr gid solr
stop program = "/etc/init.d/tomcat stop"
as uid solr gid solr
if failed port 8080 then alert
if failed port 8080 for 5 cycles then restart

Wenn man prüfen will wie monit so arbeitet, kann man einen Blick in das monit-Log (/var/log/monit.log) werfen. Dort finden sich dann entsprechende Einträge wie:
[CEST Mar 27 12:19:06] error : 'mysql' process is not running
[CEST Mar 27 12:19:06] info : 'mysql' trying to restart
[CEST Mar 27 12:19:06] info : 'mysql' start: /etc/init.d/mysql
[CEST Mar 27 12:19:09] info : 'mysql' started

Syntax Check

Um die Syntax der Konfigurationsdatei zu prüfen verwendet man monit -t

$ monit -t
Control file syntax OK
WebUI

Man kann die Dienste dank monit auch per einfacher Web-Gui starten oder stoppen.
Hierzu entfernt man das Kommentarzeichen vor den Zeilen:
set httpd port 2812 and
allow rasputin:vollGeheimesPasswort123
und schon erhält man, wenn man im Browser http://[Server-IP]:2812 aufruft und sich als der entsprechende Benutzer mit Passwort identifiziert hat, eine einfach Übersicht:

Fazit: diese kleine Tool monit lässt einen Sysadmin nachts ruhiger schlafen. Ich verwende es auf so ziemlich jedem Server den ich betreue und es hat schon so manchen Ausfall verhindert.

Autor
Kategorien Linux, Software

PRTG Map