Surveillance de pile LEMP avec Monit sur Ubuntu 14.04

introduction

Monit est une application de surveillance de service gratuite et à source ouverte qui peut effectuer diverses actions basées sur des événements. Monit peut envoyer des notifications par courrier électronique, redémarrer un service ou une application, ou entreprendre d’autres actions réactives.

Ce didacticiel s’appuiera sur une pile LEMP de base (Linux, Nginx, MySQL, PHP). Monit sera incorporé pour surveiller tous les services de la pile et alerter l’utilisateur root de toute situation défavorable.

Un serveur Monit externe en option peut également être utilisé pour la surveillance à distance d’une application Web ou d’autres services.

Conditions préalables

  • Avant de commencer, vous devez d’abord configurer une Droplet Ubuntu 14.04

  • Vous aurez besoin d’un compte d’utilisateur standard doté des privilèges sudo.

  • Ce tutoriel ajoute Monit à une pile LEMP existante. Pour un tutoriel sur la création d’une pile LEMP initiale, voir https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14 -04 [Comment installer des piles Linux, nginx, MySQL, PHP (LEMP) sur Ubuntu 14.04]

  • Facultatif: Si vous souhaitez surveiller un site Web distant, un serveur DNS ou un serveur de messagerie, vous devez configurer ce serveur avec un domaine ou une adresse IP accessible au public (consultez l’étape 6).

Étape 1 - Configurer la livraison par courrier électronique pour les notifications Monit

Une partie de la surveillance du système implique généralement des notifications par courrier électronique pour les alertes. Pour que Monit puisse envoyer des notifications par courrier électronique, il est nécessaire que l’e-mail soit correctement livré. Un email d’alerte Monit typique ressemblera à ceci:

From: [email protected]
To: [email protected]

Resource limit matched Service example.com

       Date:        Mon, 22 Dec 2014 03:04:06
       Action:      alert
       Host:        example.com
       Description: cpu user usage of 79.8% matches resource limit [cpu user usage>70.0%]

Your faithful employee,
Monit

Ce tutoriel va configurer Monit pour qu’il vous envoie un email chaque fois qu’une alerte est déclenchée.

  • Remarque: * Les notifications de Monit iront probablement dans votre dossier spam par défaut. Le DNS inversé (appelé enregistrement PTR) doit être correctement configuré pour garantir la meilleure chance de livraison du courrier. Le nom d’hôte de votre Droplet doit correspondre à son nom de domaine pleinement qualifié (FQDN). Par exemple, ils pourraient tous deux être **. Pour modifier l’enregistrement PTR d’une droplet DigitalOcean, accédez au Panneau de configuration DigitalOcean. Naviguez jusqu’à * Paramètres * et choisissez l’onglet * Renommer *. Entrez le nouveau nom d’hôte et cliquez sur * Renommer *.

Ce guide suppose que vous n’avez pas d’agent de transfert de courrier (MTA) pré-existant, nous allons donc installer Postfix. Une installation locale de Postfix permet au système d’envoyer des courriers électroniques de notification à un fournisseur de messagerie externe tel que Gmail ou Yahoo.

Pour commencer à installer Postfix en tant que votre MTA, commencez par mettre à jour la liste des sources du référentiel du système.

sudo apt-get update

Ensuite, installez les paquets Postfix et GNU Mailutils à partir des référentiels d’Ubuntu.

sudo apt-get install postfix mailutils

Vers la fin de l’installation, vous serez invité à sélectionner un type de configuration de serveur, comme indiqué dans la capture d’écran ci-dessous. Choisissez * Site Internet *.

image: https: //assets.digitalocean.com/articles/Lemp_Monit/1.png [Postfix - sélectionnez Site Internet]

Lorsque vous êtes invité à entrer le * Nom de messagerie système *, utilisez le nom de domaine complet (FQDN) de votre Droplet. * Remarque: * Le nom de messagerie système peut également être modifié ultérieurement dans + / etc / mailname +.

image: https: //assets.digitalocean.com/articles/Lemp_Monit/2.png [Postfix - définit le nom de messagerie du système]

Ensuite, ouvrez le fichier pour le modifier. Ce guide utilisera Nano mais vous pouvez utiliser l’éditeur de texte que vous préférez.

sudo nano /etc/aliases

Ici, nous allons ajouter une adresse électronique personnelle à laquelle nous recevrons les courriels de notification de Monit. Ces notifications par courrier proviendront de l’utilisateur racine de notre serveur LEMP.

postmaster: root
root:

Il est également possible d’ajouter plusieurs destinations si vous le souhaitez:

root: , ,

Enregistrez vos modifications et quittez Nano. Ensuite, exécutez ce qui suit pour mettre à jour le fichier d’alias:

sudo newaliases

Un message de test peut être envoyé à partir de votre Droplet pour vérifier la livraison du courrier. Veuillez vérifier les dossiers de spam si le message de test n’est pas d’abord vu dans votre boîte de réception.

echo test | mail -s "test message from my VPS" root

Étape 2 - Installer et configurer Monit

Monit est également disponible dans les référentiels de paquets Ubuntu. Pour un bref guide de référence sur Monit, veuillez consulter this tutorial.

Monit peut être installé sur votre serveur LEMP avec:

sudo apt-get install monit

Sur Ubuntu 14.04, les fichiers de configuration Monit sont situés dans et le fichier de configuration principal Monit est + / etc / monit / monitrc +.

Pour ouvrir dans Nano pour édition:

sudo nano /etc/monit/monitrc

Décommentez les lignes suivantes et modifiez-les pour qu’elles correspondent à ce qui suit:

set mailserver   #Use localhost for email alert delivery.

set mail-format {
     from: monit@$HOST
  subject: monit alert --  $EVENT $SERVICE
  message: $EVENT Service $SERVICE
                Date:        $DATE
                Action:      $ACTION
                Host:        $HOST
                Description: $DESCRIPTION

           Your faithful employee,
           Monit
}

set alert   #Set email address to receive alerts. This guide uses root mail.

Toujours dans le fichier, décommentez maintenant les lignes suivantes et modifiez-les pour qu’elles correspondent au domaine ou à l’adresse IP de votre serveur.

check system
   if loadavg (1min) > 4 then alert
   if loadavg (5min) > 2 then alert
   if memory usage > 75% then alert
   if swap usage > 25% then alert
   if cpu usage (user) > 70% then alert
   if cpu usage (system) > 30% then alert
   if cpu usage (wait) > 20% then alert

Nous ajouterons également cette entrée à la fin du fichier:

check filesystem rootfs with path / #Alert if low on disk space.
   if space usage > 90% then alert

Enregistrez vos modifications et quittez Nano.

Étape 3 - Configurer la surveillance du service pour les services LEMP dans Monit

Sur Ubuntu 14.04, les configurations Monit peuvent être spécifiées directement dans le fichier + / etc / monit / monitrc + ou via des fichiers individuels dans + / etc / monit / conf.d / +. Dans ce tutoriel, des fichiers individuels seront créés dans le répertoire + / etc / monit / conf.d / +.

Premièrement, nous fournirons à Monit les moyens de gérer un service. Par souci de simplicité, nous allons placer tous les contrôles de processus dans un seul fichier situé + / etc / monit / conf.d / lemp-services +. À l’aide des entrées suivantes, Monit surveillera Nginx, MySQL et PHP-FPM, et redémarrera ces services s’ils sont anormalement arrêtés pour une raison quelconque.

Nous pouvons créer le fichier de travail avec Nano:

sudo nano /etc/monit/conf.d/lemp-services

Ajoutez les entrées suivantes pour les services dans notre pile LEMP:

check process nginx with pidfile /var/run/nginx.pid
   group www-data
   start program = "/etc/init.d/nginx start"
   stop program = "/etc/init.d/nginx stop"

check process mysql with pidfile /var/run/mysqld/mysqld.pid
   start program = "/etc/init.d/mysql start"
   stop program = "/etc/init.d/mysql stop"

check process php5-fpm with pidfile /var/run/php5-fpm.pid
   start program = "/etc/init.d/php5-fpm start"
   stop program = "/etc/init.d/php5-fpm stop"

Puis enregistrez vos modifications.

Étape 4 - Ajout d’actions pour le redémarrage de services LEMP malsains

Maintenant que Monit est capable de gérer certains services, vous pouvez ajouter des actions pour redémarrer les services comme vous le souhaitez. Par exemple, Monit a la capacité de surveiller les connexions TCP. Si le serveur ne prouve plus les connexions HTTP, Monit peut redémarrer PHP-FPM ou Nginx pour résoudre automatiquement le problème.

Pour construire sur notre configuration existante, nous allons maintenant éditer plus avant + / etc / monit / conf.d / lemp-services +. Les ajouts que nous allons faire ci-dessous sont indiqués et nous dirons à Monit de redémarrer Nginx et PHP-FPM si les connexions HTTP ne sont plus disponibles. De plus, Monit redémarrera MySQL si le socket est indisponible.

  • Remarque: * Assurez-vous d’utiliser le domaine ou l’adresse IP de votre Droplet là où vous le voyez dans les première et troisième entrées.

check process nginx with pidfile /var/run/nginx.pid
   group www-data
   start program = "/etc/init.d/nginx start"
   stop program = "/etc/init.d/nginx stop"



check process mysql with pidfile /var/run/mysqld/mysqld.pid
   start program = "/etc/init.d/mysql start"
   stop program = "/etc/init.d/mysql stop"



check process php5-fpm with pidfile /var/run/php5-fpm.pid
   start program = "/etc/init.d/php5-fpm start"
   stop program = "/etc/init.d/php5-fpm stop"

Enregistrez vos modifications et fermez Nano. Puis redémarrez Monit pour appliquer les modifications de configuration que vous avez effectuées jusqu’à présent.

sudo service monit restart

Étape 5 (facultatif) - Surveillez les journaux à la recherche d’erreurs et de mots-clés

Monit peut également surveiller les journaux à la recherche de mots-clés spécifiques, puis exécuter une action ou envoyer une alerte. Ceci est utile dans les cas où une application Web rencontre des problèmes ou lorsqu’une équipe requiert la notification d’un compte rendu ou d’un événement particulier à partir des journaux.

Vous trouverez ci-dessous un exemple de journal Nginx avec une erreur de temporisation que Monit peut surveiller et une alerte:

2014/12/22 11:03:54 [error] 21913#0: *202571 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 2600:3c01::f03c:91ff:fe6e:5a91, server: example.com, request: "GET /wp-admin/admin-ajax.php?action=wordfence_doScan&isFork=1&cronKey=40cb51ccsdfsf322fs35 HTTP/1.0", upstream: "fastcgi://unix:/var/run/example.com.sock", host: "example.com"

En vous basant sur notre configuration existante, ouvrez à nouveau votre fichier de configuration de services LEMP dans Nano.

sudo nano /etc/monit/conf.d/lemp-services

Ajoutez l’entrée suivante. Cela enverra une notification lorsque Nginx communique avec PHP-FPM après un certain délai.

check file nginx-error with path /var/log/nginx/error.log
   if match "^timed out" then alert

Enregistrez votre monnaie et fermez Nano. Puis redémarrez Monit pour que le changement prenne effet:

sudo service monit restart

Étape 6 (facultatif) - Utilisez Monit pour surveiller un site Web distant et d’autres services

En plus d’utiliser Monit localement, Monit peut surveiller une variété de services et de connexions externes. Dans cet exemple, nous allons utiliser l’instance locale de Monit que nous avons déjà configurée et ajouter de nouvelles configurations de surveillance pour des services externes.

Il est préférable d’avoir un système Monit externe dans un centre de données entièrement différent à des fins hors bande. Si une application Web est basée à New York, il serait idéal d’avoir un petit serveur externe Monit à San Francisco.

Vous trouverez ci-dessous des exemples de contrôles Monit externes pouvant être implémentés sur un deuxième hôte exécutant Monit. Ces exemples seraient placés dans le fichier + / etc / monit / conf.d / lemp-external + du serveur externe pour vérifier à distance notre pile LEMP à **.

Utilisez Nano pour créer ce fichier de configuration:

sudo nano /etc/monit/conf.d/lemp-external

Surveiller la réponse ICMP et la connectivité HTTP et HTTPS:

# ICMP check
check host  with address
   if failed icmp type echo
       for 5 times within 5 cycles
       then alert

# HTTP check
   if failed
         port 80 protocol http
      for 5 times within 5 cycles
      then alert

# HTTPS check
   if failed
         port 443 type tcpSSL protocol http
      for 5 times within 5 cycles
      then alert

Surveiller le DNS:

check host  with address
   if failed port 53 type udp protocol dns then alert

Surveiller SMTP:

check host  with address
   if failed port 25 type tcp protocol smtp then alert

Surveiller l’URL de vérification de l’état de l’application Web

Pour les applications Web, Monit peut également effectuer une demande particulière sur une URL de contrôle de l’intégrité. Vous trouverez ci-dessous un exemple de site ** avec l’URL de vérification de l’intégrité suivante: + https: // remote-example.com / healthcheck +.

check host  with address
   if failed
         port 443 type tcpSSL protocol http
      request "/healthcheck"
      for 5 times within 5 cycles
      then alert

Étape 7 - Gérer Monit à partir de la ligne de commande

Monit fournit également un utilitaire de ligne de commande. À partir de là, de simples commandes permettent de vérifier l’état général de Monit et d’effectuer des tâches utiles, telles que le démarrage ou l’arrêt momentané de la surveillance.

Pour exécuter les contrôles d’état Monit à partir de la ligne de commande, le service Web Monit doit être activé. Pour ce faire, ouvrez + / etc / monit / monitrc + pour l’éditer dans Nano.

sudo nano /etc/monit/monitrc

Décommentez les lignes suivantes pour activer le service Web localement:

set httpd port 2812 and
       use address localhost
       allow localhost

Enregistrez vos modifications et quittez Nano. Puis redémarrez Monit:

sudo service monit restart

Il est maintenant possible de vérifier l’état de Monit à partir de la ligne de commande.

Vous trouverez ci-dessous des commandes pour désactiver et activer temporairement la surveillance:

sudo monit unmonitor all

sudo monit monitor all

Étape 8 - Afficher les rapports

Jetons un coup d’œil aux rapports de toutes les vérifications que nous avons préparées.

sudo monit status

Vous verrez maintenant tout ce que vous avez configuré pour que Monit soit vérifié, y compris les services LEMP locaux et toutes les vérifications externes:

sudo monit status
The Monit daemon 5.6 uptime: 0m

System 'example.com'
 status                            Running
 monitoring status                 Monitored
 load average                      [0.00] [0.01] [0.05]
 cpu                               0.5%us 0.4%sy 0.0%wa
 memory usage                      115132 kB [22.9%]
 swap usage                        0 kB [0.0%]
 data collected                    Mon, 22 Dec 2014 16:50:42

Filesystem 'rootfs'
 status                            Accessible
 monitoring status                 Monitored
 permission                        755
 uid                               0
 gid                               0
 filesystem flags                  0x1000
 block size                        4096 B
 blocks total                      5127839 [20030.6 MB]
 blocks free for non superuser     4315564 [16857.7 MB] [84.2%]
 blocks free total                 4581803 [17897.7 MB] [89.4%]
 inodes total                      1310720
 inodes free                       1184340 [90.4%]
 data collected                    Mon, 22 Dec 2014 16:50:42

Process 'nginx'
 status                            Running
 monitoring status                 Monitored
 pid                               14373
 parent pid                        1
 uptime                            28m
 children                          4
 memory kilobytes                  1364
 memory kilobytes total            9228
 memory percent                    0.2%
 memory percent total              1.8%
 cpu percent                       0.0%
 cpu percent total                 0.0%
 port response time                0.018s to example.com:80 [HTTP via TCP]
 data collected                    Mon, 22 Dec 2014 16:50:42

Process 'mysql'
 status                            Running
 monitoring status                 Monitored
 pid                               12882
 parent pid                        1
 uptime                            32m
 children                          0
 memory kilobytes                  44464
 memory kilobytes total            44464
 memory percent                    8.8%
 memory percent total              8.8%
 cpu percent                       0.0%
 cpu percent total                 0.0%
 unix socket response time         0.000s to /var/run/mysqld/mysqld.sock [DEFAULT]
 data collected                    Mon, 22 Dec 2014 16:50:42

Process 'php5-fpm'
 status                            Running
 monitoring status                 Monitored
 pid                               17033
 parent pid                        1
 uptime                            0m
 children                          2
 memory kilobytes                  13836
 memory kilobytes total            22772
 memory percent                    2.7%
 memory percent total              4.5%
 cpu percent                       0.0%
 cpu percent total                 0.0%
 port response time                0.018s to example.com:80 [HTTP via TCP]
 data collected                    Mon, 22 Dec 2014 16:50:42

File 'nginx-error'
 status                            Accessible
 monitoring status                 Monitored
 permission                        644
 uid                               0
 gid                               0
 timestamp                         Mon, 22 Dec 2014 16:18:21
 size                              0 B
 data collected                    Mon, 22 Dec 2014 16:50:42

Remote Host 'example.com'
 status                            Online with all services
 monitoring status                 Monitored
 icmp response time                0.021s [Echo Request]
 port response time                0.107s to example.com:443 [HTTP via TCPSSL]
 port response time                0.062s to example.com:80 [HTTP via TCP]
 data collected                    Mon, 22 Dec 2014 16:50:42

Utilisez ces données pour vérifier la santé de vos services et consulter des statistiques utiles.

Dépannage

En cas de problème, consultez d’abord les journaux de Monit situés sur + / var / log / monit.log +. Cela vous donnera plus d’informations sur la nature du problème.

Exemple d’entrées du journal des erreurs:

[UTC Dec 22 13:59:54] error    : ICMP echo response for example.com 1/3 timed out -- no response within 5 seconds
[UTC Dec 22 14:10:16] error    : ICMP echo response for example.com 1/3 timed out -- no response within 5 seconds
[UTC Dec 22 15:24:19] error    : 'example.com' failed protocol test [HTTP] at INET[example.com:80] via TCP -- HTTP: Error receiving data -- Resource temporarily unavailable
[UTC Dec 22 15:57:15] error    : ICMP echo response for example.com 1/3 timed out -- no response within 5 seconds
[UTC Dec 22 17:00:57] error    : ICMP echo response for example.com 1/3 timed out -- no response within 5 seconds
[UTC Dec 22 17:49:00] error    : 'example.com' failed, cannot open a connection to INET[example.com:443/API] via TCPSSL

Conclusion

Une fois ce guide terminé, vous devez maintenant configurer Monit pour surveiller une pile LEMP sous Ubuntu 14.04. Monit est assez extensible et peut être facilement personnalisé ou étendu pour surveiller tous types de services pour les petits et les grands réseaux.

Voici quelques liens supplémentaires pour Monit: