Server Monitoring met Munin en Monit op Debian 10

In dit artikel beschrijf ik hoe je je Debian 10 (Buster) server kunt monitoren met Munin en Monit. Munin genereert zonder veel configuratie handige grafiekjes over bijna elk aspect van je server (belastingsgemiddelde, geheugengebruik, CPU gebruik, MySQL doorvoer, netwerkverkeer, enz.), terwijl Monit de beschikbaarheid van diensten als Apache, MySQL, Postfix controleert en de juiste actie onderneemt zoals een herstart als hij ontdekt dat een dienst zich niet gedraagt zoals verwacht. Door de twee te combineren krijg je volledige bewaking: grafieken die je huidige of dreigende problemen laten zien (bv. “We hebben binnenkort een grotere server nodig, onze gemiddelde belasting neemt snel toe.”), en een waakhond die de beschikbaarheid van de bewaakte diensten verzekert.

Hoewel je met Munin meer dan één server kunt bewaken, bespreken we hier alleen het bewaken van het systeem waarop het geïnstalleerd is.

Deze gids is geschreven voor Debian 10 (Buster), maar de configuratie zou met kleine veranderingen ook op andere distributies zoals Ubuntu van toepassing moeten zijn.

1 Inleidende Opmerking

Alle commando’s in deze handleiding worden als root gebruiker uitgevoerd. Log in op je server als root via SSH of open een terminal venster. Als je je aanmeldt als een andere gebruiker dan root, gebruik dan het commando

su -

om de root gebruiker te worden, voordat je verder gaat.

De hostnaam van ons systeem is server1.example.com, en we hebben er een website www.example.com op met het document root /var/www/www.example.com/web.

Zorg ervoor dat het systeem up-to-date is voor je Munin gaat installeren, voer uit:

apt update
apt upgrade

Apache wordt gebruikt om de Munin pagina’s te tonen, de apache fcgid module is nodig voor de Munin grafiek zoom functie. Installeer apache en de fcgid module met apt.

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

Schakel de fcgid module in apache in.

a2enmod fcgid

2 Installeer en configureer Munin

Om Munin op Debian te installeren, doen we het volgende:

apt install munin munin-node munin-plugins-extra

Als de server MySQL of MariaDB draait, schakel dan de een paar extra Munin plugins in om MySQL te monitoren:

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

Vervolgens moeten we het Munin configuratiebestand /etc/munin/munin.conf bewerken. Haal het commentaar weg bij de regels dbdir, htmldir, logdir, rundir, en tmpldir (de standaard waarden zijn prima). We willen dat Munin de naam server1.example.com gebruikt in plaats van localhost.localdomain in de HTML uitvoer, daarom vervangen we localhost.localdomain door server1.example.com in de eenvoudige host tree sectie. Zonder de commentaren ziet het veranderde bestand er als volgt uit:

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 [...]

We moeten het Apache 2.4 configuratiebestand voor Munin /etc/munin/apache24.conf vinden – het definieert een alias genaamd munin naar Munin’s HTML uitvoermap /var/cache/munin/www, wat betekent dat we munin vanaf alle websites op deze server kunnen benaderen door het relatieve pad /munin te gebruiken (bv . http://www.example.com/munin).

De apache Munin configuratie is standaard niet ingeschakeld, dit is veranderd van DebianWheezy in Jessie. De nieuwe config directory is /etc/apache2/conf-enabled in plaats van /etc/apache2/conf.d die in oudere versies als Wheezy en Squeeze gebruikt werd.

Voer deze commando’s uit om de configuratie in apache in te schakelen en te laden.

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

Let op dat je de regel Require local uitcommentarieert en in plaats daarvan Require all granted en Options FollowSymLinks SymLinksIfOwnerMatch toevoegt (anders kun je de Munin uitvoer alleen vanaf localhost benaderen):

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>

Herstart Apache:

systemctl restart apache2.service

Start dan Munin opnieuw op:

systemctl restart munin-node.service

Wacht nu een paar minuten zodat Munin zijn eerste uitvoer kan produceren, en ga dan in je browser naar http://www.example.com/munin/, en je ziet de eerste statistieken:

Munin proces monitor

(Dit is maar een klein uittreksel van de vele grafieken die munin produceert…)

3 Bescherm de Munin Output Directory met een wachtwoord (Optioneel maar zeer aan te bevelen)

Nu is het een goed idee om de munin output directory met een wachtwoord te beveiligen, tenzij je wilt dat iedereen elke kleine statistiek over je server kan zien.

Om dit te doen moeten we het wachtwoordbestand /etc/munin/munin-htpasswd aanmaken. We willen inloggen met de gebruikersnaam admin, dus doen we dit:

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

Geef een wachtwoord voor admin. Open dan opnieuw /etc/munin/apache24.conf

nano /etc/munin/apache24.conf

… commentarieer “Require all granted” uit en voeg de regels toe die ik rood gemarkeerd heb:

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>

Herstart dan Apache:

systemctl restart apache2.service

4 Schakel extra modules in Munin in

Het Munin commando “munin-node-configure –suggest” kan gebruikt worden om aanbevelingen te krijgen voor extra Munin modules die op de server ingeschakeld kunnen worden. Voer uit:

munin-node-configure --suggest

De uitvoer zou ongeveer zo moeten zijn:

Aanvullende Munin module suggesties

De kolom “used” laat zien of een module ingeschakeld is, de kolom “Suggestions” laat zien of de server een dienst draait die door deze module bewaakt kan worden. Maak een symlink voor de module in /etc/munin/plugins om hem in te schakelen.

Hier schakel ik bijvoorbeeld de apache_* modules in:

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

Herstart Munin om de nieuwe configuratie te laden.

systemctl restart munin-node.service

5 Installeer en configureer Monit

Monit is beschikbaar in de Debian Buster backports repository. Deze repository is niet standaard ingeschakeld, dus we moeten hem eerst toevoegen. Voer dit commando uit:

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

en werk dan de pakketlijsten bij met:

apt update

Om Monit te installeren, doen we dit:

apt install monit

Nu moeten we /etc/monit/monitrc bewerken. Het standaard /etc/monit/monitrc heeft veel voorbeelden, en je kunt meer configuratievoorbeelden vinden op http://mmonit.com/monit/documentation/. In mijn geval wil ik echter proftpd, sshd, mysql, apache, en postfix bewaken, ik wil de Monit webinterface op poort 2812 inschakelen, ik wil een https webinterface, ik wil op de webinterface inloggen met de gebruikersnaam admin en het wachtwoord howtoforge, en ik wil dat Monit e-mail waarschuwingen stuurt naar [email protected], dus mijn bestand ziet er als volgt uit (ik heb voorbeelden voor andere daemons aan de configuratie toegevoegd, zodat je het bestand aan je eigen behoeften kunt aanpassen):

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: [email protected] }
set alert [email protected]
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

Het configuratiebestand spreekt voor zich; als je niet zeker bent over een optie, kijk dan in de Monit documentatie: http://mmonit.com/monit/documentation/monit.html

In het apache deel van de Monit configuratie vind je dit:

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

wat betekent dat Monit probeert verbinding te maken met localhost op poort 80 en toegang probeert te krijgen tot het bestand /monit/token dat /var/www/html/monit/token is omdat de document root van onze website /var/www/html is. Als Monit daar niet in slaagt betekent het dat Apache niet draait, en Monit gaat het opnieuw starten. Nu moeten we het bestand /var/www/html/monit/token aanmaken en er een willekeurige string in schrijven:

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

Vervolgens maken we het pem cert(/var/certs/monit.pem) dat we nodig hebben voor de SSL-vercijferde Monit webinterface:

mkdir /var/certs
cd /var/certs

We hebben een OpenSSL configuratiebestand nodig om ons certificaat te maken. Het kan er als volgt uitzien:

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            = [email protected]

[ cert_type ]
nsCertType = server

Nu maken we het certificaat als volgt aan:

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

Tenslotte kunnen we Monit starten:

service monit restart

Richt nu je browser op https://www.example.com:2812/ (zorg ervoor dat poort 2812 niet door je firewall geblokkeerd wordt), log in met admin en howtoforge, en je zou de Monit webinterface moeten zien. Het zou er als volgt uit moeten zien:

Monit Dienst manager op Debian

(Hoofdscherm)

SSH proces toestand

Apache proces toestand

(SSHd statuspagina)

Afhankelijk van je configuratie in /etc/monit/monitrc zal monit je diensten herstarten als ze falen en meldingsmails sturen als proces ID’s van diensten veranderen, enz.

Om de Monit status op de shell te krijgen, voer je het commando “monit status” uit:

monit status

Het commando toont de status van alle gemonitorde diensten.

Monit status op de commandoregel

6 Verbindingen