Debian / Ubuntu - Surveiller votre serveur et éviter les plantages du serveur grâce à Monit

Page 1 / 1
  • Publié le : 20 décembre 2014 à 14:11
  • Par Lionel Eppe

Monit est un programme de monitoring pour Linux qui vous permet de :
- surveiller les services souhaités toutes les x minutes
- recevoir des alertes lorsqu'un service commence à consommer trop de ressource CPU ou de mémoire vive
- redémarrer le service quand il commence à devenir instable (ainsi vos services ne deviendront pas inaccessibles très longtemps puisqu'ils seront redémarré automatiquement en cas de problème)
- surveiller les partitions de votre disque dur pour recevoir une alerte lorsque le disque dur ne possède plus assez d'espace libre.

Tutoriel testé sous Ubuntu 12.04 et Debian 7.7.0.

Pour commencer, installez monit en tapant ceci :

Code : Bash

apt-get install monit

Pour configurer monit, vous devez créer un fichier dans le dossier "/etc/monit/conf.d/".
En effet, à la fin du fichier "/etc/monit/monitrc" qui sert de documentation et de mini tutoriel, vous verrez la ligne "include /etc/monit/conf.d/*" en bas du fichier.

Pour configurer monit, créer un fichier de config comme ceci :

Code : Bash

vi /etc/monit/conf.d/monit.cfg

Note : Le script ci-dessous est basé sur la documentation présente dans le fichier "/etc/monit/monitrc".

Code : Bash

set daemon 120            # Vérifier les services toutes les 2 minutes (2*60s = 120s = 2min)
  with start delay 240    # Attend 4 minutes après le démarrage de monit pour la 1ère vérification
			  # des services.

# Fichiers de logs
# Utilise les fichiers de logs de Linux
# set logfile syslog facility log_daemon
# ou un fichier de log spécifique pour monit.
set logfile /var/log/monit.log

# Serveur SMTP à utiliser pour envoyer les alertes par mails.
# Note : Vous pouvez indiquer plusieurs serveurs SMTP séparés par des virgules.
set mailserver localhost

# Si le ou les serveurs SMTP ne fonctionnent pas, vous pouvez stocker les
# alertes sur le disque dur.
# slots 100 indique qu'on stocke uniquement les 100 dernières alertes.
set eventqueue
                    # si le serveur de mail est down, on stock les alertes
    basedir /var/monit              # répertoire de stockage
    slots 100

# Vous pouvez définir le format des emails que monit vous enverra.
set mail-format {
	from: monit@$HOST
	subject: monit alert --  $EVENT $SERVICE
	message: $EVENT Service $SERVICE
		Date:        $DATE
		Action:      $ACTION
		Host:        $HOST
		Description: $DESCRIPTION
		
		Email sent by Monit.
}

# Adresse e-mail de l'administrateur du serveur
# Utiliser, de préférence, une adresse e-mail d'un serveur de mails externe.
# Sinon, vous ne serez pas avertis des problèmes rencontrés avec les composants
# du serveur de mails (serveur mails, protocoles POP3 et imap, ...)
set alert sysadmin@gmail.com

# Pour recevoir uniquement les alertes de type "timeout", vous devrez utiliser cette ligne
# a la place de la précédente. (décommentez la ligne en enlevant le # en début de ligne).
#set alert sysadmin@gmail.com only on { timeout }

# Paramètres de l'interface web de monit
# Par défaut, l'interface web est accessible sur le port "2812" avec les identifiants : admin / monit.
set httpd port 2812 and
	allow admin:monit


# Vérification des services
# En règle générale, la vérification d'un service aura besoin de son pid pour pouvoir arrêter ou redémarrer le service concerné.
# Pour trouver le fichier de pid d'un processus, cherchez le fichier comme ceci : find / -name [nom du service].pid
# Exemple : "find / -name apache2.pid" affichera ceci sous Debian : /run/apache2.pid

# Apache
check process apache with pidfile /run/apache2.pid
  # Commandes pour démarrer et arrêter le service souhaité
  # avec un délai de 60 secondes (1min) pour le démarrage du service.
  start program = "/etc/init.d/apache2 start" with timeout 60 seconds
  stop program  = "/etc/init.d/apache2 stop"
  # Utilisation CPU
  # Si le service utilise 60% du processeur pendant 4 minutes (2 cycles de 120s), on envoi une alerte par e-mail.
  if cpu > 60% for 2 cycles then alert
  # Si le service utilise 80% du processeur, on redémarre le service.
  if cpu > 80% for 5 cycles then restart
  # Si le service utilise 200 MB de mémoire pendant 10 minutes, on redémarre le service.
  if totalmem > 200.0 MB for 5 cycles then restart
  # Si le service a plus de 250 enfants, on redémarre le service.
  if children > 250 then restart
  # Permet de tester la charge du serveur sur 16 minutes.
  if loadavg(5min) greater than 10 for 8 cycles then stop
  # Teste si on sait se connecter sur le port 80 (protocol http)
  if failed host 127.0.0.1 port 80 protocol http
    #and request "/index.php" # permet de tenter de récupérer une page précise (enlever le # pour décommenter la ligne)
    then restart
  # idem pour le port 443 (SSL / https)
  if failed port 443 type tcpssl protocol http
    with timeout 15 seconds
    then restart
  # si le service a redémarré 3 fois en 10 minutes, c'est qu'il y a un problème avec le service
  # donc, on arrête le service en cause.
  if 3 restarts within 5 cycles then timeout
  group server

# MySQL
check process mysqld with pidfile /var/run/mysqld/mysqld.pid
    group database
    start program = "/etc/init.d/mysql start"
    stop program = "/etc/init.d/mysql stop"
    # Pour MySQL, on tente de se connecter au serveur local (127.0.0.1) sur le port 3306
    if failed host 127.0.0.1 port 3306 then restart
    if 5 restarts within 5 cycles then timeout
# SSH
check process sshd with pidfile /var/run/sshd.pid
    group ssh
    start program = "/etc/init.d/ssh start"
    stop program = "/etc/init.d/ssh stop"
    # Pour SSH, le port 22 (si vous l'avez modifié par sécurité, modifiez-le ici aussi).
    if failed host 127.0.0.1 port 22 protocol ssh then restart
    if 5 restarts within 5 cycles then timeout
# Postfix
check process postfix with pidfile /var/spool/postfix/pid/master.pid
    group mail
    start program = "/etc/init.d/postfix start"
    stop program = "/etc/init.d/postfix stop"
    if failed port 25 protocol smtp then restart
    if 5 restarts within 5 cycles then timeout
# FTP
check process proftpd with pidfile /var/run/proftpd.pid
    start program = "/etc/init.d/proftpd start"
    stop program  = "/etc/init.d/proftpd stop"
    if failed port 21 protocol ftp then restart
    if 5 restarts within 5 cycles then timeout
# BIND
check process bind9 with pidfile /var/run/named/named.pid
    group bind
    start program = "/etc/init.d/bind9 start"
    stop  program = "/etc/init.d/bind9 stop"
    if failed port 53 then restart
    if 5 restarts within 5 cycles then timeout
# POP3
check process pop3 with pidfile /var/run/courier/pop3d.pid
    group mail
    start program = "/etc/init.d/courier-pop start"
    stop  program = "/etc/init.d/courier-pop stop"
    if failed port 110 then restart
    if 5 restarts within 5 cycles then timeout
# IMAP
check process imap with pidfile /var/run/courier/imapd.pid
    group mail
    start program = "/etc/init.d/courier-imap start"
    stop  program = "/etc/init.d/courier-imap stop"
    if failed port 143 then restart
    if 5 restarts within 5 cycles then timeout
# POP3S
check process pop3s with pidfile /var/run/courier/pop3d-ssl.pid
    group mail
    start program = "/etc/init.d/courier-pop-ssl start"
    stop  program = "/etc/init.d/courier-pop-ssl stop"
    if failed port 995 type TCPSSL protocol pop for 5 cycles then restart
    if 3 restarts within 5 cycles then timeout
# IMAPS
check process imaps with pidfile /var/run/courier/imapd-ssl.pid
    group mail
    start program = "/etc/init.d/courier-imap-ssl start"
    stop  program = "/etc/init.d/courier-imap-ssl stop"
    if failed port 993 type TCPSSL protocol imap for 5 cycles then restart
    if 3 restarts within 5 cycles then timeout
# Courier (IMAP/POP3) Auth Deamon
check process courier-auth with pidfile /var/run/courier/authdaemon/pid
    group mail
    start program = "/etc/init.d/courier-authdaemon start"
    stop  program = "/etc/init.d/courier-authdaemon stop"
    if 3 restarts within 5 cycles then timeout

# Webmin
# Script trouvé dans la documentation de monit : http://mmonit.com/wiki/Monit/ConfigurationExamples#webmin
check process webmin with pidfile /var/webmin/miniserv.pid
  group webmin
  start program = "/etc/init.d/webmin start"
  stop  program = "/etc/init.d/webmin stop"
  if failed host 127.0.0.1 port 10000 then restart
  if 5 restarts within 5 cycles then timeout
# Webmin (dépendance)
check file webmin_rc with path /etc/init.d/webmin
  group webmin
  if failed checksum then unmonitor
  if failed permission 755 then unmonitor
  if failed uid root then unmonitor
  if failed gid root then unmonitor

# Disque dur
# Note : Pour lister les partitions de votre serveur linux, tapez la commande : lsblk
# La 1ère partition du serveur, sera "/dev/hd1" (HDD IDE) ou "/dev/sda1" (HDD SATA).
#
# SDA1
check device sda1 with path /dev/sda1
    group system
    if space usage > 85% then alert
    if space usage > 85% then alert

Une fois que vous aurez créé votre fichier de configuration, vérifiez la configuration de monit.

Code : Bash

service monit syntax

Si rien ne s'affiche, votre configuration est bonne. Sinon, des erreurs s'afficheront.
Si votre configuration est bonne, redémarrez apache et monit.

Code : Bash

service monit restart
service apache2 restart

Une fois que vous aurez redémarré les services, vous devrez patienter pendant 4 minutes (le temps défini par l'option : with start delay 240).
Après 4 minutes, vous aurez accès à l'interface web.

Si vous modifiez la configuration de monit plus tard, utilisez la commande suivante pour sauvegarder les changements sans redémarrer complètement monit :

Code : Bash

service monit reload

Bizarrement, le monitoring d'apache ne démarre pas automatiquement (même si vous attendez 10 minutes).
Pour régler le problème, connectez-vous à l'interface web de monit. Par défaut : http://votre-domaine.com:2812

Vous verrez que le statut d'apache est : Not monitored.
Cliquez sur "apache" dans la liste.

Puis, cliquez sur le bouton "Enable monitoring" en bas de page.

Vous recevrez un mail : monit alert -- Action done apache

Et le statut deviendra : Not monitored - monitor pending

Patientez 5 minutes et son statut deviendra "Running" excepté si apache a un problème.
Dans ce cas, vous avez du recevoir un mail de monit.

Pour tester monit, nous avons arrêté le service "apache2" via le terminal de Linux. Quelques instants plus tard, nous avons reçu un mail d'alerte de monit disant que le service n'était pas lancé et qu'il avait redémarré automatiquement le service apache2.
Note : Sur la page de monit, le statut du service était "does not exist" et après le redémarrage du service, le statut est redevenu "Running". Le statut n'est pas mis à jour en temps réel mais tous les x temps. (x étant l'intervalle "set daemon 120" indiqué en haut du fichier de configuration).

Si vous avez sécurisé votre serveur avec iptables, autorisez le port de monit en ajoutant ceci dans le script de votre pare-feu :

Code : Bash

# monit
iptables -t filter -A INPUT -p tcp --dport 2812 -j ACCEPT

Une fois que vous aurez modifiez le script de configuration de votre pare-feu, n'oubliez pas de réexécuter ce script.

Note : Pour en savoir plus sur la configuration du pare-feu sous Linux, référez-vous à notre tutoriel : Debian / Ubuntu - Sécuriser votre serveur dédié ou VPS via Iptables