Tutorial : comment monitorer votre serveur web et relancer ses services automatiquement en cas de problème.
Après quelques années d’expérience dans la gestion de serveurs web, et de nombreuses contraintes rencontrées sur le terrain, j’ai décidé de partagé quelques expériences sous forme d’articles ou petits tutos, j’avais commencé il y a pas mal de temps avec un petit tuto sur comment mettre en place un CDN gratuit à l’aide de google app Engine, mais faute de temps je n’ai pas pu en faire d’autres.
J’espère que je trouverais le temps pour tenir une cadence d’un tutorial toutes les deux à quatre semaine.
Pour ce deuxième tutorial, j’explique comment mettre en place un système de monitoring pour un serveur web sous linux. Le monitoring doit permettre de surveiller les process, de les redémarrer s’ils s’arrêtent brutalement, ou de les relancer s’ils deviennent instables.
Mon besoins initial pour un tel service est survenu suite à la montée brutale de trafic sur un serveur qui n’était pas dimensionné pour. Sur ce serveur, apache suffoquait pour manque de RAM, le serveur se mettait à swapper, et les visiteurs voyaient des pages avec des erreurs 503 (ouie c’est moche pour le visiteur et pour le référencement). La solution que j’avais en attendant de migrer vers un autre serveur était de relancer apache, et tout rentrait dans l’ordre … pendant quelque temps …. Puis il fallait redémarrer. Le problème se produisait uniquement en heure de forte fréquentation (heureusement).
J’ai donc cherché plusieurs solutions pour enfin tomber sur Monit.
Qu’est ce que monit
Monit est un outil open source qui permet de surveiller des processus, des fichiers, des dossiers et de faire des actions suivant les conditions que l’on souhaite. Il est configurable via un langage de scripting assez simple et permet de répondre à quasiment tous les besoins du monitoring s’il est bien configuré.
(vous remarquerez que l’into de cet article est longue mais c’est normal car la mise en place de Monit va aller très très vite 😉 ).
Installer monit
Tout d’abord l’installation de monit, ce dernier est disponible dans les repositories standards de la plupart des distribution, si vous avez une debian ou une ubuntu comme moi tapez
Apt-get install monit.
A ce stade votre monitoring est déjà opérationnel 🙂 mais il faut le « tuner » un peu. Pour cela ouvrez le fichier /etc/monit/monitrc avec votre éditeur favoris et parcourez ce dernier pour vous rendre compte à quel point la logique de configuration de cet outil est simple, en plus ce fichier de conf est assez bien documenté.
La plupart des admin système moyen ou avertis arriveront à mettre en place très rapidement une conf sans lire la suite, pour les autres, je vais prendre un cas concret et configurer monit en fonction.
Configurer monit
Tout d’abord il faut savoir que monit fait des cycles de vérification chaque n seconde, cette valeur est à ajustée en fonction de votre configuration ou à la sensibilité de vos services.
Pour faire simple on va demander à monit de faire un cycle par minute
Dans le fichier de conf (vers la ligne 20) modifier la valeur en
Set daemon 60
Ensuite vous pouvez si vous le souhaitez activer ou désactiver les logs, ici laissez la ligne par défaut pour logger les messages monit dans le syslog
set logfile syslog facility log_daemon
Ensuite on configure le serveur de messagerie et l’email sur lequel on reçoit les messages. En général vous disposez déjà d’un serveur de messagerie sur votre serveur web.
Ici je déclare donc localhost comme serveur de messagerie, et je veux que mes emails aient pour émetteur monitoring@emaroc.tld et que le récepteur soit sysadmin@emaroc.tld
set mailserver localhost set mail-format { From: monitoring@emaroc.tld } set alert sysadmin@emaroc.tld
monit a un format d’email par défaut, que vous pouvez personnaliser ; utile si vous mettez en place ce service pour un client par exemple, si c’est le cas documentez-vous sur mail-format … (bein oui je ne vais pas vous mâcher tout le travail :p )
Maintenant commençons le monitoring plus concrètement
Je souhaite qu’il me prévienne également si la RAM consommée et supérieur à 90%.
Je souhaite aussi qu’il me prévienne si la charge moyenne du serveur (load average) et supérieur à 3 durant plus de 4 minutes.
check system localhost if memory usage > 90% then alert if loadavg (4min) > 3 then alert
Bien entendu d’autres configurations sont possible (surveillance de la charge CPU système, utilisateur …etc)
et enfin, on va surveiller notre serveur apache, c’est là que ça devient plus amusant 😀
Notez que si comme moi vous utilisez une distrib ubuntu avec apache2, il faut modifier la configuration proposée par monit pour pointer vers le bon pid apache.
Pour notre configuration, nous allons demander à monit de surveiller apache et de le relancer s’il s’arrête.
Nous allons aussi lui demander de nous alerter par email si la quantité de RAM consommée dépasse 3.5Go durant 3 minutes.
et de relancer apache si la quantité de RAM consommée dépasse 3.8Go durant 5 minutes
et de relancer apache si le CPU utilisé 80% durant 5 minutes.
(rappelez-vous que nous avons défini des cycles d’une minute 1 cycle = 1 minute)
check process apache2 with pidfile /var/run/apache2.pid start program = "/etc/init.d/apache2 start'" stop program = "/etc/init.d/apache2 stop'" if cpu > 80% for 5 cycles then restart if totalmem > 3500.0 MB for 3 cycles then alert if totalmem > 3800.0 MB for 5 cycles then alert group server
notez que vous pouvez aller beaucoup plus loin dans la configuration, par exemple demander à monit de checker le contenu d’un page html ou php et d’effectuer une action en fonction de la réponse, de surveiller les ports ouverts (notamment pour le SSL par exemple) …etc
Lancement du demon monit et test
Sauvegardez votre fichier monitrc puis relancer le service /etc/init.d/monit restart.
Déjà là vous devez recevoir un mail vous indiquant que monit est lancé.
Si c’est le cas, vous pouvez alors faire un test simple, arrêtez apache via la commande /etc/init.d/apache2 stop. Normalement au prochain cylce monit va le relancer automatiquement (une minute max avec notre config) et va vous prévenir par email que l’instance apache à changée.
En cas de problème et pour débugger tapez la ligne de commande
grep –Iin ‘monit’ /var/log/syslog
pour voir ce qui cloche avec monit 😉
notez que ceci n’est qu’une infime partie de ce que permet monit, pour aller plus loin documentez vous 😉 http://mmonit.com/monit/documentation/
Dans le prochain tutorial j’expliquerais comment j’ai pu multiplié par quatre la capacité d’un serveur web sans upgrade matériel, et comment j’ai pu accélérer les temps de réponse de ce dernier par la même occasion. Et je ne dirais rien de plus …