Surveiller son serveur dédié facilement avec Monit

Publié le 16 avril 2015 Temps de lecture : 5 min.

J’ai décidé de commencer une nouvelle petite série d’article suite à la prise en main d’un serveur dédié comme un VPS ou Kimsufi. Ces articles ont tout d’abord pour objectif de partager mon expérience avec vous mais également de me servir de mon blog comme un petit bloc notes. En effet, c’est toujours très pratique de reprendre un ancien article pour retrouver la configuration d’un paquet. On commence aujourd’hui, la présentation de Monit !

Présentation

Je ne l’ai pas fait au début, mais pourtant Monit est vraiment le paquet à installer dès que vous configurez votre serveur. Son rôle est très simple, il va surveiller qu’une liste de processus définis tournent bien sur le serveur. Si ce n’est pas le cas, il va vous avertir par mail et essayer de les relancer automatiquement.

Concrètement, si votre processus MySQL plante pour une raison inconnue, il vous avertit et le relance tout seul. C’est quand même parfait non ? Voici à quoi ressemble l’interface, il faut reconnaitre qu’elle est assez simple mais elle fait le boulot. Si tout est au vert, pas d’inquiétude, si vous voyez du rouge, c’est le moment de vous connecter en SSH !

monit-service-manager-processus

Vous venez choisir ensuite vous même les paquets que vous souhaitez surveiller. J’ai choisi pour ma part de contrôler Apache, MySQL, Sendmail et Vsftpd pour la partie serveur web. J’ai ensuite ajouté SSH, Cron, Fail2ban et Webmin pour le fonctionnement global du serveur. Passons maintenant à la partie installation et configuration du paquet.

Installation et configuration

Comme pour chaque paquet sous Debian, il suffit de vous connecter en root sur le serveur et de taper la commande suivante. Pour le moment, rien de compliqué !

apt-get install monit

Une fois que le paquet est installé correctement, nous allons créer un fichier de configuration pour paramétrer Monit en fonction de nos besoins. Nous allons donc créer le fichier au bon endroit avec la commande suivante.

nano /etc/monit/conf.d/maconfiguration

Maintenant que votre fichier est ouvert avec nano (vous pouvez utiliser vi ou emacs si vous préférez), copier-coller le contenu ci-dessous dans le haut de votre fichier. Cela va nous permettre de définir la durée à laquelle vous rafraichissez Monit, j’ai choisi 60 secondes pour ma part. Vous devez ensuite définir l’adresse mail à laquelle vous souhaitez recevoir les rapports et le port et le login/mot de passe pour accéder à l’interface.

##### Réglages de base de Monit #####
set daemon  60
set mailserver localhost
set mail-format { 
  subject: [Monit] $SERVICE - $EVENT
}
set alert email@domaine.com
set httpd port 1212 and allow utilisateur:motdepasse    

Je vous conseille bien évidemment de changer de le port par celui que vous voulez et de changer également le nom d’utilisateur et le mot de passe. Attention, je crois que les caractères spéciaux passent mal…

Choix des services

Nous allons maintenant venir ajouter à la suite de notre fichier les services que l’on souhaite surveiller au quotidien. On commence donc par ajouter les services de base pour un bon petit serveur web : Apache2 et MySQL dans mon cas.

# Apache2
check process apache with pidfile /var/run/apache2.pid
group apache
start program = "/etc/init.d/apache2 start"
stop program = "/etc/init.d/apache2 stop"
if failed host www.nomdedomaine.fr port 80
protocol http then restart
if 5 restarts within 5 cycles then timeout
if cpu > 80% for 2 cycles then alert
if cpu > 90% for 5 cycles then restart
if children > 250 then restart
 
# 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"
if failed host 127.0.0.1 port 3306 then restart
if 5 restarts within 5 cycles then timeout

Il faut savoir que pour chaque service, vous allez devoir adapter le chemin où se situe votre processus. Si vous partez sur un Debian, vous devrez être proche de la config ci-dessus mais pour le modifier il faut changer le chemin de la ligne où il y a « check process ». Enfin pour Apache2, il faut aussi changer l’URL avec votre nom de domaine.

On continue maintenant avec quelques services liés au système en lui même. Je surveille donc le processus SSH, qui est quand même très utile pour se connecter, le processus Cron, essentiel pour que mes sauvegardes se déroulent sans encombres et aussi Fail2ban pour la sécurité !

# 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"
if failed host 127.0.0.1 port 22 protocol ssh then restart
if 5 restarts within 5 cycles then timeout
  
# Cron
check process cron with pidfile /var/run/crond.pid
group system
start program = "/etc/init.d/cron start"
stop  program = "/etc/init.d/cron stop"
if 5 restarts within 5 cycles then timeout

# Fail2ban
check process fail2ban with pidfile /var/run/fail2ban/fail2ban.pid
start program = "/etc/init.d/fail2ban start"
stop  program = "/etc/init.d/fail2ban stop"
if failed unixsocket /var/run/fail2ban/fail2ban.sock then restart
if 5 restarts within 5 cycles then timeout

Vous n’avez rien à changer ici si ce n’est le port SSH dans le cas où vous avez mis un port personnalisé. Ce que je vous conseille fortement au passage ! Très pratique pour éviter les connexions malveillantes.

On termine avec quelques petits processus personnel, c’est à dire Webmin, pour gérer mon serveur à distance avec une interface, Sendmail, pour l’envoi des mails et Vsftpd pour le protocole FTP.

# Sendmail
check process sendmail with pidfile /var/run/sendmail/mta/sendmail.pid
group mail
start program = "/etc/init.d/sendmail start"
stop  program = "/etc/init.d/sendmail stop"
if failed port 25 protocol smtp then restart
if 5 restarts within 5 cycles then timeout

# Vsftpd
check process vsftpd with pidfile /var/run/vsftpd/vsftpd.pid
start program = "/etc/init.d/vsftpd start"
stop program  = "/etc/init.d/vsftpd stop"
if failed port 21 protocol ftp then restart
if 5 restarts within 5 cycles then timeout

# 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

Bien sur, vous devrez adapter les quelques lignes ci-dessus avec les bons ports notamment pour le FTP et Webmin si vous les avez changé.

Côté services, il se peut que les miens ne vous suffisent pas. En effet, chacun à sa configuration un peu personnalisée. Vous pouvez par exemple choisir d’utiliser NginX à la place de Apache2 ou encore Postfix à la place de Sendmail.

Vous trouverez donc sur ce site de nombreux exemples avec plusieurs processus. Idéal pour adapter ce tutoriel en fonction de votre configuration. Il ne vous reste plus qu’à enregistrer votre fichier, vérifiez votre syntax et lancer Monit avec les commandes ci-dessous.

/etc/init.d/monit syntax
/etc/init.d/monit start

Pour accéder à l’interface, voici l’adresse à utiliser : http://votreadresseip:port/

Surveillez votre hardware

Vous n’avez pas seulement la possibilité de surveiller des services pour s’assurer que tout tourne correctement. Vous pouvez également monitorer des composants de votre machine.

Il est donc possible de savoir l’espace disponible sur votre serveur dédié, la température de votre processeur, celle de votre disque dur, etc.

Je ne l’ai pas mis pour le moment mais ça ne saurait tarder, surtout pour recevoir une petite alerte quand le disque commence à être plein ! Vous trouverez des exemples sur le site mentionné ci-dessus.

Notifications

Quand un processus s’arrête ou se relance, vous recevez automatiquement une alerte. Cela vous permet d’aller vérifier si c’est récurrent d’où peut venir le problème.

notifications-mail-monit

C’est vraiment pratique ! C’est grâce à Monit que j’ai découvert que mon processus MySQL tombait régulièrement. Monit m’a donc permis de le relancer automatiquement, pratique pour éviter les interruptions de service et aussi de corriger le problème !

J’espère que ce petit tutoriel vous aidera à monitorer votre serveur dédié et à éviter des problèmes avec celui-ci. Si vous avez des idées/améliorations à apporter à celui-ci, n’hésitez pas dans les commentaires ci-dessous ! Bon monitoring les amis.

Monit

Gratuit

5/ 5

Outil vraiment indispensable à mes yeux, Monit vous permet de gérer et de surveiller votre serveur VPS ou dédié. Simple et rapide à installer, essayez cet outil gratuitement !

24 commentaires

  1. Bonjour à tous,

    Je viens d’installer monit sur Xubuntu14.04LTS

    J’ai mis dans
    /etc/monit/conf.d le fichier maconfiguration contenant ceci:

    ##### Réglages de base de Monit #####
    set daemon 5
    set mailserver mail.monsrv.nc port 587
    USERNAME "monitor@monsrv.nc" PASSWORD "monpass"
    set mail-format {
    subject: [Monit] $SERVICE - $EVENT
    message: Serveur Laurux $ACTION $SERVICE le $DATE sur $HOST: $DESCRIPTION.
    }
    set alert admin@monsrv.nc
    set httpd port 1212 and allow corail:"monpass"

    check system $HOST
    if loadavg (1min) > 3 then alert
    if loadavg (5min) > 2 then alert
    if loadavg (15min) > 1 then alert
    if memory usage > 80% for 4 cycles then alert
    if swap usage > 20% for 4 cycles then alert
    if cpu usage (user) > 1% for 2 cycles then alert
    if cpu usage (system) > 2% for 2 cycles then alert
    if cpu usage (wait) > 3% for 2 cycles then alert

    ## Check filesystem permissions, uid, gid, space and inode usage. Other services,
    ## such as databases, may depend on this resource and an automatically graceful
    ## stop may be cascaded to them before the filesystem will become full and data
    ## lost.
    #
    check filesystem datafs with path /dev/sda
    start program = "/bin/mount /data"
    stop program = "/bin/umount /data"
    if failed permission 660 then unmonitor
    if failed uid root then unmonitor
    if failed gid disk then unmonitor
    if space usage > 80% for 5 times within 15 cycles then alert
    if space usage > 99% then stop
    if inode usage > 30000 then alert
    if inode usage > 99% then stop
    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"
    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"
    if failed host 127.0.0.1 port 22 protocol ssh then restart
    if 5 restarts within 5 cycles then timeout

    # Cron
    check process cron with pidfile /var/run/crond.pid
    group system
    start program = "/etc/init.d/cron start"
    stop program = "/etc/init.d/cron stop"
    if 5 restarts within 5 cycles then timeout

    # Sendmail
    check process sendmail with pidfile /var/run/sendmail/mta/sendmail.pid
    group mail
    start program = "/etc/init.d/sendmail start"
    stop program = "/etc/init.d/sendmail stop"
    if failed port 587 protocol smtp then restart
    if 5 restarts within 5 cycles then timeout

    de façon volontaire afin de tester si ça envoit un mail, j’ai mis le cpu à 1 2 et 3 (il tourne à 7), je devrais donc recevoir une
    alerte par email… mais rien depuis 10minutes :( :( alors que le check est toutes les 5 secondes.

    En console je fais:
    sudo monit -t

    qui me renvoit
    Control file syntax OK

    Mais tjrs pas de mail reçu :( :(

    Svp…. merci d’avance de votre aide.

    Waca

  2. Bonjour à tous,

    Je viens d’installer monit sur Xubuntu14.04LTS

    J’ai mis dans
    /etc/monit/conf.d le fichier maconfiguration contenant ceci:

    ##### Réglages de base de Monit #####
    set daemon 5
    set mailserver mail.monsrv.nc port 587
    USERNAME "monitor@monsrv.nc" PASSWORD "monpass"
    set mail-format {
    subject: [Monit] $SERVICE - $EVENT
    message: Serveur Laurux $ACTION $SERVICE le $DATE sur $HOST: $DESCRIPTION.
    }
    set alert admin@monsrv.nc
    set httpd port 1212 and allow corail:"monpass"

    check system $HOST
    if loadavg (1min) > 3 then alert
    if loadavg (5min) > 2 then alert
    if loadavg (15min) > 1 then alert
    if memory usage > 80% for 4 cycles then alert
    if swap usage > 20% for 4 cycles then alert
    if cpu usage (user) > 1% for 2 cycles then alert
    if cpu usage (system) > 2% for 2 cycles then alert
    if cpu usage (wait) > 3% for 2 cycles then alert

    ## Check filesystem permissions, uid, gid, space and inode usage. Other services,
    ## such as databases, may depend on this resource and an automatically graceful
    ## stop may be cascaded to them before the filesystem will become full and data
    ## lost.
    #
    check filesystem datafs with path /dev/sda
    start program = "/bin/mount /data"
    stop program = "/bin/umount /data"
    if failed permission 660 then unmonitor
    if failed uid root then unmonitor
    if failed gid disk then unmonitor
    if space usage > 80% for 5 times within 15 cycles then alert
    if space usage > 99% then stop
    if inode usage > 30000 then alert
    if inode usage > 99% then stop
    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"
    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"
    if failed host 127.0.0.1 port 22 protocol ssh then restart
    if 5 restarts within 5 cycles then timeout

    # Cron
    check process cron with pidfile /var/run/crond.pid
    group system
    start program = "/etc/init.d/cron start"
    stop program = "/etc/init.d/cron stop"
    if 5 restarts within 5 cycles then timeout

    # Sendmail
    check process sendmail with pidfile /var/run/sendmail/mta/sendmail.pid
    group mail
    start program = "/etc/init.d/sendmail start"
    stop program = "/etc/init.d/sendmail stop"
    if failed port 587 protocol smtp then restart
    if 5 restarts within 5 cycles then timeout

    de façon volontaire afin de tester si ça envoit un mail, j’ai mis le cpu à 1 2 et 3 (il tourne à 7), je devrais donc recevoir une
    alerte par email… mais rien depuis 10minutes :( :( alors que le check est toutes les 5 secondes.

    En console je fais:
    sudo monit -t

    qui me renvoit
    Control file syntax OK

    Mais tjrs pas de mail reçu :( :(

    Svp…. merci d’avance de votre aide.

    Waca

  3. Bonjour Antoine Guilbert.

    J’ai bien installer, malgré tout, impossible d’accéder à monit.

    En cherchant sur le net, j’ai chmodé en 600 /etc/monit/conf.d/maconfig.

    J’ai ensuite executé : monit -c /etc/monit/conf.d/maconfig

    monit -v me montre bien que j’ai demandé de passer par le port 1312.

    Mais impossible, http://mon-adresse-vps:1312/ , chrome me donne Page Web inaccessible ERR_CONNECTION_REFUSED

    Une idée ?
    Merci pour ce tuto

    1. Merci pour ton commentaire ! Première question, chez quel hébergeur es-tu pour VPS ?Je suis chez OVH pour ma part qui ouvre tous les ports mais pas sur que ça soit le cas partout !Ensuite, regarde dans ta conf ou du côté d’un firewall que tu aurais pu mettre en place.Si tu trouves la solution, n’hésite pas à reposter un commentaire :-)

      1. Bon, c’est résolu. Tout bêtement, il fallait faire un restart de monit pour que ce soit pris en compte.Par contre, j’ai un doute sur ceci :# Apache2check process apache with pidfile /var/run/apache2.pidgroup apachestart program = « /etc/init.d/apache2 start »stop program = « /etc/init.d/apache2 stop »if failed host monvps.rock-hosting.net port 80protocol http then restartif 5 restarts within 5 cycles then timeoutif cpu > 80% for 2 cycles then alertif cpu > 90% for 5 cycles then restartif children > 250 then restartAi-je bien configuré « if failed host monvps.rock-hosting.net port 80″ ?J’ai tellement changé de port pour la sécurité que j’en viens à douter.Par ailleurs, j’ai stopé moi même apache. Apache re-demarre bien, mais je ne recois aucun mail.Est-ce possible de s’assurer du bon fonctionnement ? Fail2ban lui me tiens bien au courant…Merci :-)

      2. Merci Antoine.Finalement il fallait tout bêtement relancé Monit pour que tout sois pris en compte.Par contre j’ai ceci en config :# Apache2check process apache with pidfile /var/run/apache2.pidgroup apachestart program = « /etc/init.d/apache2 start »stop program = « /etc/init.d/apache2 stop »if failed host monvps.rock-hosting.net port 80protocol http then restartif 5 restarts within 5 cycles then timeoutif cpu > 70% for 2 cycles then alertif cpu > 90% for 5 cycles then restartif children > 250 then restartAi-je bon sur cette config : if failed host monvps.rock-hosting.net port 80Ou dois-je mettre plutôt l’ip publique ou local ?J’ai stoppé Apache ou encore Mysql, le démarrage s’effectue.Par contre, impossible de recevoir un mail :-/Merci :-)

  4. Bonjour Antoine Guilbert.

    J’ai bien installer, malgré tout, impossible d’accéder à monit.

    En cherchant sur le net, j’ai chmodé en 600 /etc/monit/conf.d/maconfig.

    J’ai ensuite executé : monit -c /etc/monit/conf.d/maconfig

    monit -v me montre bien que j’ai demandé de passer par le port 1312.

    Mais impossible, http://mon-adresse-vps:1312/ , chrome me donne Page Web inaccessible ERR_CONNECTION_REFUSED

    Une idée ?
    Merci pour ce tuto

    1. Merci pour ton commentaire ! Première question, chez quel hébergeur es-tu pour VPS ?

      Je suis chez OVH pour ma part qui ouvre tous les ports mais pas sur que ça soit le cas partout !

      Ensuite, regarde dans ta conf ou du côté d’un firewall que tu aurais pu mettre en place.

      Si tu trouves la solution, n’hésite pas à reposter un commentaire :-)

      1. C’est un peu vieillot mais ça marche du tonnerre.Et super modulable. Je monitore toute ma domotique dessus en plus de mes serveurs et services.

      1. C’est un peu vieillot mais ça marche du tonnerre.
        Et super modulable. Je monitore toute ma domotique dessus en plus de mes serveurs et services.

  5. Bravo pour ce guide ! Je te conseille de coupler monit à un système de supervision externe tel que Woozweb qui est gratuit, car si ton serveur crash violemment alors monit ne se pas là pour te le dire, car mort dans la bataille. Je me demandais s’il existe des thèmes un peu sympa pour le dashboard de monit ?

    A noter aussi le projet glances qui est sympa pour avoir l’état de son serveur d’un coup d’oeil, de chez l’excellent nicolargo

    1. Merci pour ton commentaire Xhark ! J’ai trouvé de mon côté un autre petit outil bien sympa également qui permet de surveiller si un serveur répond bien au ping. Je ferais un petit article dessus prochainement !J’ai essayé de trouver quelques personnalisations pour Monit mais bien pour le moment. Un petit bootstrap dessus ça serait sympa !

  6. Bravo pour ce guide ! Je te conseille de coupler monit à un système de supervision externe tel que Woozweb qui est gratuit, car si ton serveur crash violemment alors monit ne se pas là pour te le dire, car mort dans la bataille. Je me demandais s’il existe des thèmes un peu sympa pour le dashboard de monit ?

    A noter aussi le projet glances qui est sympa pour avoir l’état de son serveur d’un coup d’oeil, de chez l’excellent nicolargo

    1. Merci pour ton commentaire Xhark ! J’ai trouvé de mon côté un autre petit outil bien sympa également qui permet de surveiller si un serveur répond bien au ping. Je ferais un petit article dessus prochainement !

      J’ai essayé de trouver quelques personnalisations pour Monit mais bien pour le moment. Un petit bootstrap dessus ça serait sympa !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *