Blog

Superviser Opcache avec Nagios et Cacti

Écrit le 23 03 2017 par Kévin MET _

Comme je l’avais dit dans mon article concernant le fonctionnement d’Opcache, je devais faire un billet au sujet de la supervision de ce dernier en utilisant Cacti et Nagios et c’est exactement ce que vous êtes en train de lire. Pour ceux qui se demanderaient pourquoi Cacti ET Nagios et non pas soit l’un soit l’autre, ce sont deux outils complètement différents qui n’ont pas les mêmes fonctions.

Nagios est un outil d’alerting et ne devrait donc servir qu’à vous alerter en cas de problème. Même si il existe des plugins comme PNP4Nagios qui collecte les métriques je trouve préférable de déléguer la tâche à Cacti qui a été conçu pour cela. Cacti permet de journaliser les métriques sous forme de graphique, cela va permettre d’analyser très finement (jusqu’à un delta de 5 minutes) vos métriques après un problème. Par exemple, vous ne savez pas pourquoi votre applicatif est devenu lent et en vous connectant sur Cacti vous vous apercevez que le graph des IO a explosé mais que cela ne se voyait pas forcément très bien avec iotop ou iostat qui relèvent les IO de manière instantanée. Bref, après ce petit plaidoyer en faveur de mes outils de supervision préférés on va commencer avec la partie Cacti.

Installation sur Cacti

Avant de commencer, je tenais à dire que je me suis très fortement inspiré du template de Glen Pitt-Pladdy auquel j’ai ajouté un graphique concernant les chaînes en mémoire, une métrique qui n’est pas souvent supervisée alors que si elle est pleine, elle engendre un restart de PHP au même titre que la mémoire globale d’Opcache. J’ai un peu modifié son template pour ajouter les graph templates dans le host template, j’ai ajouté des métriques dans le fichier qui collecte les données et j’ai ajouté weekly, monthly and yearly dans les data templates mais j’ai la flemme de faire un PR...

Pour commencer, vous allez avoir besoin d’un fichier php à placer sur le serveur à superviser qui permettra de remonter diverses métriques via la fonction opcache_get_status. Le fichier est utilisé par nagios également et je rappelle que les instances d’Opcache ne sont pas partagées entre le CLI et PHP en fpm ce qui oblige à poser ce fichier sur votre serveur web. Pour apache, je le pose à la racine d’un vhost et pour nginx je le pose dans un dossier opcache à la racine, j’explique pourquoi en fin d’article. Voici son contenu :


<?php
header('Content-Type: text/plain');
$opcachestat = opcache_get_status( );
print $opcachestat['memory_usage']['used_memory']."\n";
print $opcachestat['memory_usage']['free_memory']."\n";
print $opcachestat['memory_usage']['wasted_memory']."\n";
print $opcachestat['opcache_statistics']['num_cached_scripts']."\n";
print $opcachestat['opcache_statistics']['num_cached_keys']."\n";
print $opcachestat['opcache_statistics']['max_cached_keys']."\n";
print $opcachestat['opcache_statistics']['hits']."\n";
print $opcachestat['opcache_statistics']['misses']."\n";
print $opcachestat['interned_strings_usage']['used_memory']."\n";
print $opcachestat['interned_strings_usage']['free_memory']."\n";
print $opcachestat['opcache_statistics']['oom_restarts']."\n";
print $opcachestat['opcache_statistics']['hash_restarts']."\n";
?>

Le fichier est également disponible sur github. Dans une troisième partie on verra comment ajouter des directives dans Apache et Nginx afin de préserver les appels externes à ce fichier.

En effet, ce fichier sera seulement appelé en local via snmp et pour cela on va utiliser la directive extend de snmp. Dans votre fichier snmpd.conf, il faut ajouter la configuration suivante :


# To monitor PHP Opcache
extend phpopcache /usr/bin/curl --silent https://mnt-tech.fr/opcache_status.php

On oublie pas de relancer snmp après avoir fait cette modification puis pour vérifier que tout fonctionne bien, on commence par faire un appel via curl en local :


/usr/bin/curl --silent https://mnt-tech.fr/opcache_status.php
43934560
90283168
0
251
451
16229
38696
251
4218680
12558536
0
0

C’est bon, on remonte bien nos valeurs on va pouvoir vérifier que les données remontent bien via snmp :


snmpwalk -v 2c 127.0.0.1 -c "macommunautesecrete" NET-SNMP-EXTEND-MIB::nsExtendOutLine.\"phpopcache\".10
NET-SNMP-EXTEND-MIB::nsExtendOutLine."phpopcache".10 = STRING: 12558536

On remonte bien la dixième ligne donc cela fonctionne bien. A noter que sous Debian il faut installer le paquet snmp-mibs-downloader pour avoir accès à cette MIB. On peut ensuite faire le même test depuis le serveur qui héberge Cacti pour être sur que tout fonctionne correctement.

Il faut ensuite importer le template dans Cacti. Il est disponible sur github également. Pour cela, il faut aller dans le menu Import Templates. Ensuite, il suffit d’ajouter les graphiques dans le menu Devices et pour simplifier la chose, un host template regroupe tous les graphiques concernant Opcache.

Pour avoir une idée de ce que vous allez obtenir, voici quelques screenshots du plugin en action sur deux serveurs différents avec un reload de php-fpm histoire de faire bouger un peu les graphiques :

Cacti graph ratio hits misses
Cacti graph keys
Cacti graph cached scripts
Cacti graph interned strings memory
Cacti graph memory

Installation sur Nagios

Si vous avez suivi l’installation sur Cacti, vous devriez déjà disposer du fichier opcache_status.php permettant de remonter les métriques d’Opcache. Si ce n’est pas le cas, je vous invite à aller lire le passage concerné dans la partie sur Cacti.

J’utilise NRPE de manière intensive sur mes serveurs et une fois de plus j’ai fait appel à lui afin de faire le check en local. On commence donc par ajouter le script de check sur notre serveur à superviser. Dans le cas d’une installation de NRPE via les paquets Debian ou Ubuntu, il faut placer le fichier dans le dossier /usr/lib/nagios/plugins/ avec les droits 755 en root:root


ls -al /usr/lib/nagios/plugins/check_opcache 
-rwxr-xr-x 1 root root 7219 Mar 22 23:11 /usr/lib/nagios/plugins/check_opcache

Comme d’hab, le fichier est disponible sur github. Il reste un peu de refactoring à faire, c’est écrit à la va vite mais ça fait bien le boulot, je n’ai pas eu de problème depuis que je l’utilise.

Pour vérifier que cela fonctionne bien on le lance avec l’utilisateur nrpe qui est bien souvent nagios :


sudo -u nagios /usr/lib/nagios/plugins/check_opcache --url https://mnt-tech.fr/opcache_status.php
OK: Memory 43%, Keys 3%, String Memory 12%, Hits/Misses 6%, Restarts 0

OK, ça fonctionne bien avec les valeurs par défaut mais si vous voulez allez plus loin, il y a quelques options afin de définir des seuils d’alerte.

--url ou -U : Cette option est obligatoire, c’est l’url vers le fichier opcache_status.php

--keys ou -K : C’est le pourcentage de clés utilisées par rapport à l’option max_accelerated_files. Il faut utiliser des pourcentages. Par défaut, cela applique un warning à 80 % et un critical à 90 %.

--memory ou -M : Mémoire utilisée en pourcentage. Il faut utiliser des pourcentages. Par défaut, cela applique un warning à 80 % et un critical à 90 %.

--string-memory ou -S : Mémoire utilisée par les chaînes internes. Il faut utiliser des pourcentages. Par défaut, cela applique un warning à 80 % et un critical à 90 %.

--ratio ou -R : Ratio de hits/misses. Il faut utiliser des pourcentages. Par défaut, cela applique un warning à 10 % et un critical à 20 %.

--restart ou -F : Nombre de restarts (oom_restarts and hash_restarts). Il faut utiliser des entiers pour fixer des seuils. Par défaut, le warning est à 2 et le critical à 5.

Voici donc un exemple en utilisant toutes les options :


check_opcache --url http://example.com/opcache_status.php --keys 70:80 --memory 70:80 --string-memory 70:80 --ratio 5:10 --restart 1:2

Il faut ensuite ajouter cela dans la conf de NRPE. Dans le cas d’une installation via le gestionnaire de paquet Debian ou Ubuntu, il s’agit du fichier /etc/nagios/nrpe_local.cfg :


command[check_opcache]=/usr/lib/nagios/plugins/check_opcache --url https://mnt-tech.fr/opcache_status.php

Il ne reste plus qu’à modifier la conf de notre serveur sur nagios :


define service {
	use					HNO-services
	host_name			web2.mnt-tech.fr
	service_description	OPCACHE
	check_command		check_nrpe!check_opcache
}

On relance NRPE sur le serveur web et Nagios sur le serveur de supervision et c’est tout bon. On va maintenant voir comment protéger l’accès à ce fichier pour qu’il soit seulement accessible en local.

Protection du fichier opcache_status.php

Sur Apache, il faut ajouter les directives suivantes dans la configuration de votre vhost :


<Files "opcache_status.php">
	Require local
</Files>

Sur Nginx il faut ajouter les directives suivantes dans la configuration de votre vhost :


location /opcache/ {
	allow 127.0.0.1;
	allow::1;
	allow ip.publique.de.votre.serveur;
	deny all;
}

Sur Nginx, je pose le fichier opcache_status.php dans un dossier opcache car sinon je ne peux plus à la fois utiliser un location sur les fichiers php pour les exécuter via php-fpm et protéger uniquement le fichier opcache_status.php

Voilà, vous devriez avoir de beaux graphiques et des alertes en plus pour vous réveiller la nuit :)

♥ Partage sur tes réseaux sociaux ♥
Kévin MET
Kévin MET

Auteur de ce blog et gérant de la société MNT-TECH, je publie sur ce blog lorsque le temps me le permet et lorsqu'un sujet qui me parait intéressant n'a pas encore été abordé en français. Toutes les informations techniques présentes sur cette page peuvent être réutilisées moyennant le fait de citer la source.