Superviser PHP-FPM avec Nagios ou Shinken

Date: 30/05/2012 | Catégories: Nagios,Open-source,Planet-libre,Reseau,Web | Tags: ,,

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:

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):

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:

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:

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:

Il est possible de tester le script en ligne de commande:

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:

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:

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:

Le résultat:

A vos configurations 🙂