Surveillance serveur · 13 min read · Oct 15, 2025

Surveillance du serveur avec Munin et Monit sur Debian 10

Dans cet article, je décris comment vous pouvez surveiller votre serveur Debian 10 (Buster) avec Munin et Monit. Munin génère de jolis petits graphiques sur presque tous les aspects de votre serveur (moyenne de charge, utilisation de la mémoire, utilisation du CPU, débit MySQL, trafic réseau, etc.) sans beaucoup de configuration, tandis que Monit vérifie la disponibilité de services comme Apache, MySQL, Postfix et prend les mesures appropriées comme un redémarrage s’il constate qu’un service ne fonctionne pas comme prévu. La combinaison des deux vous offre une surveillance complète : des graphiques qui vous permettent de voir les problèmes actuels ou imminents (par exemple, “Nous avons bientôt besoin d’un serveur plus grand, notre moyenne de charge augmente rapidement.”), et un chien de garde qui garantit la disponibilité des services surveillés.

Bien que vous puissiez surveiller plus d’un serveur avec Munin, nous ne discuterons ici que de la surveillance du système sur lequel il est installé.

Ce guide a été écrit pour Debian 10 (Buster), mais la configuration devrait également s’appliquer à d’autres distributions comme Ubuntu avec quelques modifications mineures.

1 Remarque préliminaire

Tous les commandes de ce tutoriel sont exécutées en tant qu’utilisateur root. Connectez-vous à votre serveur en tant que root par SSH ou ouvrez une fenêtre de terminal. Si vous vous connectez en tant qu’utilisateur différent de root, utilisez la commande

su -

pour devenir l’utilisateur root, avant de continuer.

Le nom d’hôte de notre système est server1.example.com, et nous avons un site web www.example.com dessus avec le répertoire racine des documents /var/www/www.example.com/web.

Assurez-vous que le système est à jour avant de commencer à installer Munin, exécutez :

apt update  
apt upgrade

Apache est utilisé pour afficher les pages Munin, le module fcgid d’apache est requis pour la fonctionnalité de zoom des graphiques Munin. Installez apache et le module fcgid avec apt.

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

Activez le module fcgid dans apache.

a2enmod fcgid

2 Installer et configurer Munin

Pour installer Munin sur Debian, nous faisons ceci :

apt install munin munin-node munin-plugins-extra

Lorsque le serveur exécute MySQL ou MariaDB, activez quelques plugins Munin supplémentaires pour surveiller MySQL :

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

Ensuite, nous devons éditer le fichier de configuration de Munin /etc/munin/munin.conf. Décommentez les lignes dbdir, htmldir, logdir, rundir et tmpldir (les valeurs par défaut sont correctes). Nous voulons que Munin utilise le nom server1.example.com au lieu de localhost.localdomain dans la sortie HTML, donc nous remplaçons localhost.localdomain par server1.example.com dans la section simple de l’arbre des hôtes. Sans les commentaires, le fichier modifié ressemble à ceci :

nano /etc/munin/munin.conf
# Exemple de fichier de configuration pour Munin, généré par 'make build'  
  
# Les trois variables suivantes spécifient où se trouvent les RRD  
# bases de données, la sortie HTML, les journaux et les fichiers lock/pid. Ils doivent tous  
# être accessibles en écriture par l'utilisateur exécutant munin-cron. Ils sont tous  
# par défaut aux valeurs que vous voyez ici.  
#  
dbdir /var/lib/munin  
htmldir /var/cache/munin/www  
logdir /var/log/munin  
rundir /var/run/munin  
  
# Où chercher les modèles HTML  
#  
tmpldir /etc/munin/templates  
  
# Où chercher les fichiers www statiques  
#  
#staticdir /etc/munin/static  
  
# les fichiers cgi temporaires sont ici. notez qu'ils doivent être accessibles en écriture par  
# l'utilisateur cgi (généralement nobody ou httpd).  
#  
# cgitmpdir /var/lib/munin/cgi-tmp

# (Exactement un) répertoire à inclure tous les fichiers.
includedir /etc/munin/munin-conf.d
[...]  
# un arbre d'hôtes simple  
[server1.example.com]  
 address 127.0.0.1  
 use_node_name yes
[...]  

Nous devrions trouver le fichier de configuration Apache 2.4 pour Munin /etc/munin/apache24.conf - il définit un alias appelé munin vers le répertoire de sortie HTML de Munin /var/cache/munin/www, ce qui signifie que nous pouvons accéder à munin depuis tous les sites web sur ce serveur en utilisant le chemin relatif /munin (par exemple, http://www.example.com/munin).

La configuration apache de Munin n’est pas activée par défaut, cela a été changé de DebianWheezy à Jessie. Le nouveau répertoire de configuration est /etc/apache2/conf-enabled au lieu de /etc/apache2/conf.d qui était utilisé dans les anciennes versions comme Wheezy et Squeeze.

Exécutez ces commandes pour activer et charger la configuration dans apache.

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

Assurez-vous de commenter la ligne Require local et d’ajouter Require all granted et Options FollowSymLinks SymLinksIfOwnerMatch à la place (sinon, vous ne pourrez accéder à la sortie de Munin que depuis localhost) :

nano /etc/munin/apache24.conf
Alias /munin /var/cache/munin/www  
  
 # Require local  
 Require all granted  
 Options FollowSymLinks SymLinksIfOwnerMatch  
  
  
ScriptAlias /munin-cgi/munin-cgi-graph /usr/lib/munin/cgi/munin-cgi-graph  
  
 # Require local  
 Require all granted  
 Options FollowSymLinks SymLinksIfOwnerMatch  
   
 SetHandler fcgid-script  
   
   
 SetHandler cgi-script  
   

Redémarrez Apache :

systemctl restart apache2.service

Puis redémarrez Munin :

systemctl restart munin-node.service

Maintenant, attendez quelques minutes pour que Munin puisse produire sa première sortie, puis allez sur http://www.example.com/munin/ dans votre navigateur, et vous verrez les premières statistiques :

Moniteur de processus Munin

(Ceci n’est qu’un petit extrait des nombreux graphiques que munin produit…)

3 Protéger par mot de passe le répertoire de sortie de Munin (optionnel mais fortement recommandé)

Il est maintenant judicieux de protéger par mot de passe le répertoire de sortie de munin à moins que vous ne souhaitiez que tout le monde puisse voir chaque petite statistique sur votre serveur.

Pour ce faire, nous devons créer le fichier de mot de passe /etc/munin/munin-htpasswd. Nous voulons nous connecter avec le nom d’utilisateur admin, donc nous faisons ceci :

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

Entrez un mot de passe pour admin. Ensuite, ouvrez à nouveau /etc/munin/apache24.conf…

nano /etc/munin/apache24.conf

… commentez “Require all granted” et ajoutez les lignes que j’ai marquées en rouge :

Alias /munin /var/cache/munin/www  
  
 # Require local  
 # Require all granted  
 AuthUserFile /etc/munin/munin-htpasswd  
 AuthName "Munin"  
 AuthType Basic  
 Require valid-user  
 Options None  
  
  
ScriptAlias /munin-cgi/munin-cgi-graph /usr/lib/munin/cgi/munin-cgi-graph  
  
 # Require local  
 # Require all granted  
 AuthUserFile /etc/munin/munin-htpasswd  
 AuthName "Munin"  
 AuthType Basic  
 Require valid-user  
   
 SetHandler fcgid-script  
   
   
 SetHandler cgi-script  
   

Puis redémarrez Apache :

systemctl restart apache2.service

4 Activer des modules supplémentaires dans Munin

La commande Munin “munin-node-configure –suggest” peut être utilisée pour obtenir des recommandations pour des modules Munin supplémentaires qui peuvent être activés sur le serveur. Exécutez :

munin-node-configure --suggest

La sortie devrait être similaire à ceci :

Suggestions de modules Munin supplémentaires

La colonne “utilisé” montre si un module est activé, la colonne “Suggestions” montre si le serveur exécute un service qui peut être surveillé par ce module. Créez un lien symbolique pour le module dans /etc/munin/plugins pour l’activer.

Ici, je vais activer les modules apache_* par exemple :

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

Redémarrez Munin pour charger la nouvelle configuration.

systemctl restart munin-node.service

5 Installer et configurer Monit

Monit est disponible dans le dépôt backports de Debian Buster. Ce dépôt n’est pas activé par défaut, donc nous devons l’ajouter d’abord. Exécutez cette commande :

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

et ensuite mettez à jour les listes de paquets avec :

apt update

Pour installer Monit, nous faisons ceci :

apt install monit

Maintenant, nous devons éditer /etc/monit/monitrc. Le fichier par défaut /etc/monit/monitrc a beaucoup d’exemples, et vous pouvez trouver plus d’exemples de configuration sur http://mmonit.com/monit/documentation/. Cependant, dans mon cas, je veux surveiller proftpd, sshd, mysql, apache et postfix, je veux activer l’interface web de Monit sur le port 2812, je veux une interface web https, je veux me connecter à l’interface web avec le nom d’utilisateur admin et le mot de passe howtoforge, et je veux que Monit envoie des alertes par email à root@localhost, donc mon fichier ressemble à ceci (j’ai ajouté des exemples pour d’autres démons à la configuration afin que vous puissiez ajuster le fichier à vos besoins) :

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 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  
   
# ---------------------------------------------------------------------------------------------  
# REMARQUE : Remplacez example.pid par le nom de pid de votre serveur, le nom dépend du nom d'hôte  
# ---------------------------------------------------------------------------------------------  
#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

Le fichier de configuration est assez explicite ; si vous n’êtes pas sûr d’une option, jetez un œil à la documentation de Monit : http://mmonit.com/monit/documentation/monit.html

Dans la partie apache de la configuration de Monit, vous trouvez ceci :

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

ce qui signifie que Monit essaie de se connecter à localhost sur le port 80 et essaie d’accéder au fichier /monit/token qui est /var/www/html/monit/token car le répertoire racine de notre site web est /var/www/html. Si Monit ne réussit pas, cela signifie qu’Apache ne fonctionne pas, et Monit va le redémarrer. Maintenant, nous devons créer le fichier /var/www/html/monit/token et y écrire une chaîne aléatoire :

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

Ensuite, nous créons le certificat pem (/var/certs/monit.pem) dont nous avons besoin pour l’interface web Monit chiffrée SSL :

mkdir /var/certs  
cd /var/certs

Nous avons besoin d’un fichier de configuration OpenSSL pour créer notre certificat. Il peut ressembler à ceci :

nano /var/certs/monit.cnf
# créer des certificats RSA - Serveur

[ 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

Maintenant, nous créons le certificat comme ceci :

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

Enfin, nous pouvons démarrer Monit :

service monit restart

Maintenant, pointez votre navigateur vers https://www.example.com:2812/ (assurez-vous que le port 2812 n’est pas bloqué par votre pare-feu), connectez-vous avec admin et howtoforge, et vous devriez voir l’interface web de Monit. Elle devrait ressembler à ceci :

Gestionnaire de services Monit sur Debian

(Écran principal)

État du processus SSH

État du processus Apache

(Page d’état SSHd)

Selon votre configuration dans /etc/monit/monitrc, Monit redémarrera vos services s’ils échouent et enverra des emails de notification si les identifiants de processus des services changent, etc.

Pour obtenir le statut de Monit sur le shell, exécutez la commande “monit status” :

monit status

La commande affichera le statut de tous les services surveillés.

Statut de Monit sur la ligne de commande

6 Liens

Share: X/Twitter LinkedIn

Recevez de nouveaux articles dans votre boîte de réception.

Aucun spam. Désabonnez-vous à tout moment.