Superviser PHP-FPM avec Nagios ou Shinken
Vous savez que j'ai un faible pour le couple Nginx / PHP-FPM que je trouve à la fois léger, rapide et simple à administrer. Suite à un message d'un follower (@JulSa_ pour ne pas le citer), je me suis intéressé à la supervision du process PHP-FPM depuis mon serveur de supervision Shinken (mais la procédure suivante fonctionne également avec Nagios).
Petite introduction
Pour superviser PHP-FPM, mieux vaut comprendre comment il fonctionne. PHP-FPM est une implémentation du langage PHP proposant, à votre serveur Web, une interface basée sur FastCGI. Contrairement à une interface CGI classique, FastCGI permet d'optimiser le nombre, la gestion et les caractéristiques des processus PHP en attente des requêtes venant de votre serveur Web.
Ma première réponse au message de @JulSa_ a été: "tu n'as qu'à surveiller si le processus est bien lancé sur ton serveur". Bien que cette solution soit possible elle est insuffisante. En effet, comme l'on vient de le voir, l'interface FastCGI de PHP-FPM permet d'optimiser le chargement des processus en mémoire et sur certaines configuration, un fonctionnement "normal" doit se caractériser par la présence d'au moins 5 processus PHP-FPM. On se rend compte qu'il va falloir utiliser une autre méthode si l'on veut obtenir une supervision plus fine.
La solution: check_phpfpm_status
En cherchant sur la toile on tombe rapidement sur le plugin check_phpfpm_status (page officielle sur GitHub) qui propose d'utiliser les informations remontées directement par PHP-FPM (qui est quand même le mieux placé pour dire comment il va...) à travers son URL de statut.
Configuration de votre serveur à superviser
Si vous avez une installation par défaut de PHP-FPM, il y a de forte chance que cette URL de statut ne soit pas activée. Nous allons donc dans un premier temps configurer PHP-FPM et NGinx pour qu'ils répondent à cette URL.
La configuration de PHP-FPM se fait à travers le fichier /etc/php5/fpm/pool.d/www.conf (out tout autre pool utilisé par votre serveur) en éditant la ligne suivante:
pm.status_path = /status
Pour Nginx, il faut ajouter la cible /status et la rediriger vers PHP-FPM en ajoutant la section suivante à votre configuration (par exemple /etc/nginx/sites-enabled/default-site):
# PHP-FPM Status location /status { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }
Note: cette configuration part sur le principe ou les processus PHP-FPM écoute sur le port 9000 (port TCP par défaut)
On doit ensuite relancer Nginx et PHP-FPM:
sudo service php5-fpm restart sudo service nginx restart
Puis tester que votre serveur répond bien à l'URL: http://votreserveur.com/status
Installation de check_phpfpm_status sur votre serveur de supervision
On peut maintenant passer à la configuration de votre serveur de supervision (Nagios ou Shinken).
La première étape est de récupérer le script et de l'installer:
cd /tmp wget https://raw.github.com/regilero/check_phpfpm_status/master/check_phpfpm_status.pl chmod a+x check_phpfpm_status.pl
Sur ma configuration (Debian 6 + Shinken), j'ai dû éditer le script pour remplacer la ligne:
use lib "/usr/local/nagios/libexec";
par
use lib "/usr/local/shinken/libexec";
On copie ensuite le script dans le répertoire des plugins de Nagios/Shinken:
sudo cp check_phpfpm_status.pl /usr/local/shinken/libexec/
Il est possible de tester le script en ligne de commande:
$ /usr/local/shinken/libexec/check_phpfpm_status.pl -H votreserveur.com -u /status PHP-FPM OK - www, 0.070 sec. response time, Busy/Idle 1/2, (max: 2, reached: 0), ReqPerSec 0.3, Queue 0 (len: 128, reached: 0)|Idle=2;Busy=1;MaxProcesses=2;MaxProcessesReach=0;Queue=0;MaxQueueReach=0;QueueLen=128;ReqPerSec=0.312155
Configuration de Nagios/Shinken pour surveiller PHP-FPM
La dernière étape consiste à configurer votre serveur de supervision en y intégrant ce nouveau plugin. Il y a plein de méthode possible pour cette étape.
Fichier commands.cfg:
### PHP-FPM define command{ command_name check_php_fpm command_line $USER1$/check_phpfpm_status.pl -H $HOSTADDRESS$ -s $ARG1$ -u $ARG2$ -w $ARG3$ -c $ARG4$ }
On voit donc que le service va prendre 3 paramètres:
- ARG1: le nom d'host sous lequel votre serveur Web répond (par exemple votreserveur.com)
- ARG2: l'url de status sous laquelle le serveur va répondre (par exemple /status)
- ARG2: les 3 valeurs de PHP-FPM (MIN_AVAILABLE_PROCESSES,PROC_MAX_REACHED,QUEUE_MAX_REACHED, séparés par des virgules) qui vont déclencher une alarme WARNING
- ARG3: les 3 valeurs de PHP-FPM (MIN_AVAILABLE_PROCESSES,PROC_MAX_REACHED,QUEUE_MAX_REACHED, séparés par des virgules) qui vont déclencher une alarme CRITICAL
Les 3 valeurs représentent:
- MIN_AVAILABLE_PROCESSES: Working with the number of available (Idle) and working process (Busy).
- PROC_MAX_REACHED: the fpm-status report will show us how many times the max processes were reached sinc start, this script will record how many time this happended since last check, letting you fix thresolds for alerts
- QUEUE_MAX_REACHED: the php-fpm report will show us how many times the max queue was reached since start, this script will record how many time this happended since last check, letting you fix thresolds for alerts
Une valeur négative (-1) permet d'ignorer le paramètre.
Par exemple, l'appel à la commande suivante:
./check_phpfpm_status.pl -H votreserveur.com -s votreserveur.com -u /status -w 1,-1,-1 -c 0,2,5
va déclencher une alarme CRITICAL si vous avez 0 processus PHP-FPM ou si vous avez atteint le nombnre maximum de processus 2 fois depuis le dernier check ou bien si vous avez atteint 5 fois la taille maximale de la queue. Une alarme de type WARNING sera émise si il n'y a qu'une seul processus.
On déclare enfin le service de check sur la machine à surveiller:
define service { use generic-service host_name votreserveur.com service_description PHP_FPM check_command check_php_fpm!votreserveur.com!/status!1,-1,-1!0,2,5 }
Le résultat:
A vos configurations
Cet article Superviser PHP-FPM avec Nagios ou Shinken est apparu en premier sur Le blog de NicoLargo.