Server Überwachung mit Munin und Monit auf Debian 10

In diesem Artikel beschreibe ich, wie du deinen Debian 10 (Buster) Server mit Munin und Monit überwachen kannst. Munin generiert schicke kleine Graphen über fast jeden Aspekt deines Servers (Lastdurchschnitt, Speichernutzung, CPU-Nutzung, MySQL-Durchsatz, Netzwerkverkehr, etc.) ohne viel Konfiguration, während Monit die Verfügbarkeit von Diensten wie Apache, MySQL, Postfix überprüft und die entsprechenden Maßnahmen wie einen Neustart ergreift, wenn es feststellt, dass sich ein Dienst nicht wie erwartet verhält. Durch die Kombination der beiden erhältst du ein komplettes Monitoring: Graphen, die dich aktuelle oder bevorstehende Probleme erkennen lassen (z.B. „Wir brauchen bald einen größeren Server, unser Lastdurchschnitt steigt rapide an.“), und einen Watchdog, der die Verfügbarkeit der überwachten Dienste sicherstellt.

Obwohl du mit Munin mehr als einen Server überwachen kannst, werden wir hier nur die Überwachung des Systems besprechen, auf dem es installiert ist.

Diese Anleitung wurde für Debian 10 (Buster) geschrieben, aber die Konfiguration sollte mit kleinen Änderungen auch für andere Distributionen wie Ubuntu gelten.

1 Vorbemerkung

Alle Befehle in diesem Tutorial werden als root-Benutzer ausgeführt. Logge dich als root per SSH in deinen Server ein oder öffne ein Terminalfenster. Wenn du dich als ein anderer Benutzer als root anmeldest, benutze den Befehl

su -

um zum root-Benutzer zu werden, bevor du fortfährst.

Der Hostname unseres Systems ist server1.example.com, und wir haben eine Website www.example.com darauf mit dem Dokumenten-Root /var/www/www.example.com/web.

Stelle sicher, dass das System auf dem neuesten Stand ist, bevor du mit der Installation von Munin, run beginnst:

apt update
apt upgrade

Apache wird verwendet, um die Munin-Seiten anzuzeigen, das apache fcgid-Modul wird für die Munin-Graph-Zoom-Funktion benötigt. Installiere apache und das fcgid Modul mit apt.

apt install apache2 libcgi-fast-perl libapache2-mod-fcgid

Aktiviere das fcgid Modul in apache.

a2enmod fcgid

2 Munin installieren und konfigurieren

Um Munin auf Debian Buster zu installieren, gehen wir wie folgt vor:

apt install munin munin-node munin-plugins-extra

Wenn der Server mit MySQL oder MariaDB läuft, dann aktiviere ein paar zusätzliche Munin-Plugins, um MySQL zu überwachen:

cd /etc/munin/plugins
ln -s /usr/share/munin/plugins/mysql_ mysql_
ln -s /usr/share/munin/plugins/mysql_bytes mysql_bytes
ln -s /usr/share/munin/plugins/mysql_innodb mysql_innodb
ln -s /usr/share/munin/plugins/mysql_isam_space_ mysql_isam_space_
ln -s /usr/share/munin/plugins/mysql_queries mysql_queries
ln -s /usr/share/munin/plugins/mysql_slowqueries mysql_slowqueries
ln -s /usr/share/munin/plugins/mysql_threads mysql_threads

Als nächstes müssen wir die Munin-Konfigurationsdatei /etc/munin/munin.conf bearbeiten. Entferne die Kommentare in den Zeilen dbdir, htmldir, logdir, rundir und tmpldir (die Standardwerte sind in Ordnung). Wir wollen, dass Munin den Namen server1.example.com anstelle von localhost.localdomain in der HTML-Ausgabe verwendet, daher ersetzen wir localhost.localdomain mit server1.example.com im Abschnitt für den einfachen Hostbaum. Ohne die Kommentare sieht die geänderte Datei wie folgt aus:

nano /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

# Where to look for the static www files
#
#staticdir /etc/munin/static

# temporary cgi files are here. note that it has to be writable by
# the cgi user (usually nobody or httpd).
#
# cgitmpdir /var/lib/munin/cgi-tmp # (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 […]

Wir sollten die Apache 2.4 Konfigurationsdatei für Munin /etc/munin/apache24.conf finden – sie definiert einen Alias namens munin für Munins HTML-Ausgabeverzeichnis /var/cache/munin/www, was bedeutet, dass wir von allen Webseiten auf diesem Server auf munin zugreifen können, indem wir den relativen Pfad /munin verwenden (z. B. http://www.example.com/munin).

Die apache Munin Konfiguration ist standardmäßig nicht aktiviert, dies wurde von DebianWheezy auf Jessie geändert. Das neue Konfigurationsverzeichnis ist /etc/apache2/conf-enabled anstelle von /etc/apache2/conf.d, welches in älteren Versionen wie Wheezy und Squeeze verwendet wurde.

Führe diese Befehle aus, um die Konfiguration zu aktivieren und in den Apache zu laden.

cd /etc/apache2/conf-enabled/
ln -s /etc/munin/apache24.conf munin.conf
service apache2 restart

Stelle sicher, dass du die Zeile Require local auskommentierst und stattdessen Require all granted und Options FollowSymLinks SymLinksIfOwnerMatch hinzufügst ( sonst kannst du nur von localhost auf die Munin-Ausgabe zugreifen) :

nano /etc/munin/apache24.conf
Alias /munin /var/cache/munin/www
<Directory /var/cache/munin/www>
 # Require local
 Require all granted
 Options FollowSymLinks SymLinksIfOwnerMatch
</Directory>

ScriptAlias /munin-cgi/munin-cgi-graph /usr/lib/munin/cgi/munin-cgi-graph
<Location /munin-cgi/munin-cgi-graph>
# Require local
Require all granted
Options FollowSymLinks SymLinksIfOwnerMatch
<IfModule mod_fcgid.c>
SetHandler fcgid-script
</IfModule>
<IfModule !mod_fcgid.c>
SetHandler cgi-script
</IfModule>
</Location>

Starte den Apache neu:

systemctl restart apache2.service

Dann starte Munin neu:

systemctl restart munin-node.service

Warte nun ein paar Minuten, damit Munin seine erste Ausgabe produzieren kann, und gehe dann in deinem Browser auf http://www.example.com/munin/, und du siehst die ersten Statistiken:

Munin Prozess Monitor

(Dies ist nur ein kleiner Auszug der vielen Grafiken, die Munin produziert…)

3 Das Munin-Ausgabeverzeichnis mit einem Passwort schützen (Optional, aber sehr empfohlen)

Nun ist es eine gute Idee, das munin Ausgabeverzeichnis mit einem Passwort zu schützen, es sei denn, du möchtest, dass jeder jede kleine Statistik über deinen Server sehen kann.

Um dies zu tun, müssen wir die Passwortdatei /etc/munin/munin-htpasswd erstellen. Wir wollen uns mit dem Benutzernamen admin anmelden, also machen wir dies:

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

Gib ein Passwort für admin ein. Dann öffne wieder /etc/munin/apache24.conf

nano /etc/munin/apache24.conf

… kommentiere „Require all granted“ aus und füge die Zeilen hinzu, die ich rot markiert habe:

Alias /munin /var/cache/munin/www
<Directory /var/cache/munin/www>
 # Require local
 # Require all granted
 AuthUserFile /etc/munin/munin-htpasswd
 AuthName "Munin"
 AuthType Basic
 Require valid-user
 Options None
</Directory>

ScriptAlias /munin-cgi/munin-cgi-graph /usr/lib/munin/cgi/munin-cgi-graph
<Location /munin-cgi/munin-cgi-graph>
# Require local
# Require all granted
AuthUserFile /etc/munin/munin-htpasswd
AuthName „Munin“
AuthType Basic
Require valid-user
<IfModule mod_fcgid.c>
SetHandler fcgid-script
</IfModule>
<IfModule !mod_fcgid.c>
SetHandler cgi-script
</IfModule>
</Location>

Starte dann den Apache neu:

systemctl restart apache2.service

4 Zusätzliche Module in Munin aktivieren

Der Munin-Befehl „munin-node-configure –suggest“ kann verwendet werden, um Empfehlungen für zusätzliche Munin-Module zu erhalten, die auf dem Server aktiviert werden können. Ausführen:

munin-node-configure --suggest

Die Ausgabe sollte in etwa so aussehen:

Zusätzliche Munin Modul Vorschläge

Die Spalte „used“ zeigt, ob ein Modul aktiviert ist, die Spalte „Suggestions“ zeigt, ob auf dem Server ein Dienst läuft, der von diesem Modul überwacht werden kann. Erstelle einen Symlink für das Modul in /etc/munin/plugins, um es zu aktivieren.

Hier werde ich zum Beispiel die apache_* Module aktivieren:

cd /etc/munin/plugins
ln -s /usr/share/munin/plugins/apache_accesses
ln -s /usr/share/munin/plugins/apache_processes
ln -s /usr/share/munin/plugins/apache_volume

Starte Munin neu, um die neue Konfiguration zu laden.

systemctl restart munin-node.service

5 Monit installieren und konfigurieren

Monit ist im Debian Buster Backports Repository verfügbar. Dieses Repository ist standardmäßig nicht aktiviert, also müssen wir es zuerst hinzufügen. Führe diesen Befehl aus:

echo 'deb http://ftp.de.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/buster-backports.list

und aktualisiere dann die Paketlisten mit:

apt update

Um Monit zu installieren, tun wir dies:

apt install monit

Nun müssen wir /etc/monit/monitrc bearbeiten. Die Standard /etc/monit/monitrc hat viele Beispiele, und du kannst weitere Konfigurationsbeispiele auf http://mmonit.com/monit/documentation/ finden. In meinem Fall möchte ich jedoch proftpd, sshd, mysql, apache und postfix überwachen, ich möchte das Monit-Webinterface auf Port 2812 aktivieren, ich möchte ein https-Webinterface, ich möchte mich mit dem Benutzernamen admin und dem Passwort howtoforge am Webinterface anmelden und ich möchte, dass Monit E-Mail-Benachrichtigungen an root@localhost sendet, also sieht meine Datei wie folgt aus (ich habe Beispiele für andere Daemons zur Konfiguration hinzugefügt, so dass du die Datei an deine Bedürfnisse anpassen kannst):

cp /etc/monit/monitrc /etc/monit/monitrc_orig
cat /dev/null > /etc/monit/monitrc
nano /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:howtoforge

check process sshd with pidfile /var/run/sshd.pid
start program „/usr/sbin/service ssh start“
stop program „/usr/sbin/service ssh stop“
if failed port 22 protocol ssh then restart
if 5 restarts within 5 cycles then timeout

check process apache with pidfile /var/run/apache2/apache2.pid
group www
start program = „/usr/sbin/service apache2 start“
stop program = „/usr/sbin/service apache2 stop“
if failed host localhost 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

# ———————————————————————————————
# NOTE: Replace example.pid with the pid name of your server, the name depends on the hostname
# ———————————————————————————————
#check process mysql with pidfile /var/lib/mysql/example.pid
# group database
# start program = „/usr/sbin/service mysql start“
# stop program = „/usr/sbin/service mysql stop“
# if failed host 127.0.0.1 port 3306 then restart
# if 5 restarts within 5 cycles then timeout

#check process proftpd with pidfile /var/run/proftpd.pid
# start program = „/usr/sbin/service proftpd start“
# stop program = „/usr/sbin/service proftpd stop“
# if failed port 21 protocol ftp then restart
# if 5 restarts within 5 cycles then timeout
#
#check process postfix with pidfile /var/spool/postfix/pid/master.pid
# group mail
# start program = „/usr/sbin/service postfix start“
# stop program = „/usr/sbin/service 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 = „/usr/sbin/service nginx start“
# stop program = „/usr/sbin/service nginx stop“
# if failed host 127.0.0.1 port 80 then restart
#
#check process memcached with pidfile /var/run/memcached.pid
# start program = „/usr/sbin/service memcached start“
# stop program = „/usr/sbin/service 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 = „/usr/sbin/service pure-ftpd-mysql start“
# stop program = „/usr/sbin/service 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 = „/usr/sbin/service bind9 start“
# stop program = „/usr/sbin/service 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 = „/usr/sbin/service ntp start“
# stop program = „/usr/sbin/service 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 = „/usr/sbin/service mailman start“
# stop program = „/usr/sbin/service mailman stop“
#
#check process amavisd with pidfile /var/run/amavis/amavisd.pid
# group mail
# start program = „/usr/sbin/service amavis start“
# stop program = „/usr/sbin/service 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 = „/usr/sbin/service courier-imap start“
# stop program = „/usr/sbin/service 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 = „/usr/sbin/service courier-imap-ssl start“
# stop program = „/usr/sbin/service 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 = „/usr/sbin/service courier-pop start“
# stop program = „/usr/sbin/service 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 = „/usr/sbin/service courier-pop-ssl start“
# stop program = „/usr/sbin/service 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 = „/usr/sbin/service dovecot start“
# stop program = „/usr/sbin/service 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 ziemlich selbsterklärend; wenn du dir bei einer Option unsicher bist, wirf einen Blick in die Monit-Dokumentation: http://mmonit.com/monit/documentation/monit.html

Im apache-Teil der Monit-Konfiguration findest du dies:

   if failed host localhost port 80 protocol http
      and request "/monit/token" then restart

Das bedeutet, dass Monit versucht, sich mit localhost auf Port 80 zu verbinden und versucht, auf die Datei /monit/token zuzugreifen, die sich in /var/www/html/monit/token befindet, da der Dokumentenstamm unserer Website /var/www/html ist. Wenn Monit nicht erfolgreich ist, bedeutet das, dass Apache nicht läuft und Monit ihn neu starten wird. Nun müssen wir die Datei /var/www/html/monit/token erstellen und einen zufälligen String hineinschreiben:

mkdir /var/www/html/monit
echo "hello" > /var/www/html/monit/token

Als nächstes erstellen wir das pem cert(/var/certs/monit.pem), das wir für das SSL-verschlüsselte Monit-Webinterface benötigen:

mkdir /var/certs
cd /var/certs

Wir brauchen eine OpenSSL Konfigurationsdatei, um unser Zertifikat zu erstellen. Diese kann wie folgt aussehen:

nano /var/certs/monit.cnf
# create RSA certs - Server

[ 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

Nun erstellen wir das Zertifikat wie folgt:

openssl req -new -x509 -days 365 -nodes -config ./monit.cnf -out /var/certs/monit.pem -keyout /var/certs/monit.pem
openssl dhparam 2048 >> /var/certs/monit.pem
openssl x509 -subject -dates -fingerprint -noout -in /var/certs/monit.pem
chmod 600 /var/certs/monit.pem

Endlich können wir Monit starten:

service monit restart

Rufe mit deinem Browser https://www.example.com:2812/ auf (stelle sicher, dass Port 2812 nicht von deiner Firewall blockiert wird), logge dich mit admin und howtoforge ein, und du solltest das Monit-Webinterface sehen. Es sollte wie folgt aussehen:

Monit Service Manager auf Debian

(Main Screen)

SSH Prozess Status

Apache Prozess Zustand

(SSHd Status Seite)

Abhängig von deiner Konfiguration in /etc/monit/monitrc startet Monit deine Dienste neu, wenn sie ausfallen und sendet Benachrichtigungsmails, wenn sich Prozess-IDs von Diensten ändern, etc.

Um den Monit-Status auf der Shell zu erhalten, führe den Befehl „monit status“ aus:

monit status

Der Befehl wird den Status aller überwachten Dienste anzeigen.

Monit Status auf der Kommandozeile

6 Links

Das könnte dich auch interessieren …