Je continue sur ma lancé avec la supervision de NGINX avec zabbix. Plusieurs sites effectue cette opération via des scripts. Comme je l’ai dis dans mon précédent article, je préfèré une solution qui fonctionne « out of the box » (comme dirait les commerciaux).

Nginx dispose d’un module de status (a la apache) . Si vous voulez avoir plus d’informations sur ce qu’il monitore, je vous conseil de lire la documentation officiel.

Maintenant que l’on sais ce que l’on va monitorer, voici comment il faut faire :

Création d’un virtualhost spécifique accessible uniquement par l’agent zabbix :

Au niveau de votre serveur NGINX, il faut créer un virtualhost avec la configuration suivante :

server {
      listen 127.0.0.1:8080; # écoute en local sur un port différent
      location / {
          stub_status on; # on charge le module de status
          access_log off; # on ne logge pas inutilement les accès
          allow 127.0.0.1; # autorisation uniquement depuis le localhost
          deny all; # on refuse tout le reste
       }
 }

et bien sur faire un reload de NGINX a la fin de votre configuration

Modification du fichier zabbix_agentd.conf

Afin que le système prenne en compte les futurs checks contenu dans le template on ajoute ces paramètres utilisateurs à la configuration de l’agent zabbix (zabbix_agentd.conf):

UserParameter=nginx.active[*],wget -O- -q $1:$2 | awk ‘/^Active/ {print $NF}’
UserParameter=nginx.reading[*],wget -O- -q $1:$2 | awk ‘/Reading/ {print $$2}’
UserParameter=nginx.writing[*],wget -O- -q $1:$2 | awk ‘/Writing/ {print $$4}’
UserParameter=nginx.waiting[*],wget -O- -q $1:$2 | awk ‘/Waiting/ {print $$6}’
UserParameter=nginx.accepted[*],wget -O- -q $1:$2 | awk ‘/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $$1}’
UserParameter=nginx.handled[*],wget -O- -q $1:$2 | awk ‘/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $$2}’
UserParameter=nginx.requests[*],wget -O- -q $1:$2 | awk ‘/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $$3}’

Il ne reste plus qu’a importer et associer à vos hosts le template Zabbix qui suit : Template_nginx

J’ai enfin pris le temps de configurer un serveur de monitoring; pour diverses raisons j’ai choisi zabbix.Je vais détailler dans une suite d’article les différents check que j’ai mis en place afin de garder une trace et qui sait aider quelqu’un 🙂 Je ne traiterai pas de l’installation de Zabbix, de multiple tutoriaux étant disponible sur le web; cela serai une perte de temps.

Mysql & Zabbix
Par défaut Zabbix propose un template pour monitorer la base de données. Comme je n’ai pas de gros besoins en terme de supervision sur Mysql, j’ai décidé de partir sur quelque chose de simple plutôt que des check plus lourds qui font appel à des scripts externes.

Voici comment utiliser le template par défaut :
Dans un premier temps on va créer utilisateur dédié sur chaque serveur Mysql que l’on souhaite monitorer :

Linux#> Mysql -u root -p
Mysql#> GRANT USAGE ON *.* TO 'zabbix'@'%' IDENTIFIED BY 'super_password';

Une fois celui-ci créé on va paramétrer l’agent Zabbix pour qu’il prenne en compte les « Key » fourni par le serveur.

CentOS

On commence par copier le fichier d’exemple fourni par les repository EPEL :

cp /usr/share/doc/zabbix20-agent-2.0.5/userparameter_mysql.conf /var/lib/zabbixsrv/

Puis à la fin du fichier on ajoute les lignes suivantes :

UserParameter=mysql.ping,HOME=/var/lib/zabbix mysqladmin ping | grep -c alive
UserParameter=mysql.version,mysql -V
UserParameter=mysql.uptime,HOME=/var/lib/zabbix mysqladmin status | cut -f2 -d":" | cut -f1 -d"T"
UserParameter=mysql.threads,HOME=/var/lib/zabbix mysqladmin status | cut -f3 -d":" | cut -f1 -d"Q"
UserParameter=mysql.questions,HOME=/var/lib/zabbix mysqladmin status | cut -f4 -d":" | cut -f1 -d"S"
UserParameter=mysql.slowqueries,HOME=/var/lib/zabbix mysqladmin status | cut -f5 -d":" | cut -f1 -d"O"
UserParameter=mysql.qps,HOME=/var/lib/zabbix mysqladmin status | cut -f9 -d":"

Afin que le fichier soit pris en compte on l’inclus dans le fichier de configuration de l’agent :

Include=/var/lib/zabbix/userparameter_mysql.conf

A ce moment précis le check fonctionne, mais sans utilisateur; il faut donc stipuler à l’utilisateur zabbix quel utilisateur utiliser lors de la connexion à la base. Pour cela je vais reprendre ce qu’a fait Tiramiseb car à mon sens c’est la plus correcte et surtout la plus élégante !

On créer le fichier /var/lib/zabbix/dot.my.cnf  (home directory de votre user zabbix) puis on ajoute le contenu suivant :

[client]
user= »zabbix »
password= »super_password »

Ensuite, on fait un lien symbolique pour qu’il soit reconnu par MySQL :

cd /var/lib/zabbix
ln -s dot.my.cnf .my.cnf
chown zabbix.zabbix dot.my.cnf .my.cnf
chmod 600 dot.my.cnf

Et enfin on redémarre l’agent Zabbix

service zabbix-agent restart

Debian

Sur Debian on créer le fichier Mysql pour l’agent avec le contenu suivant :

UserParameter=mysql.status[*],echo "show global status where Variable_name='$1';" | HOME=/etc/zabbix mysql -N | awk '{print $$2}'
UserParameter=mysql.size[*],echo "select sum($(case "$3" in both|"") echo "data_length+index_length";; data|index) echo "$3_length";; free) echo "data_free";; esac)) from information_schema.tables$([[ "$1" = "all" || ! "$1" ]] || echo " where table_schema='$1'")$([[ "$2" = "all" || ! "$2" ]] || echo "and table_name='$2'");" | HOME=/etc/zabbix mysql -N
UserParameter=mysql.ping,HOME=/etc/zabbix mysqladmin ping | grep -c alive
UserParameter=mysql.version,mysql -V
UserParameter=mysql.uptime,HOME=/etc/zabbix mysqladmin status | cut -f2 -d":" | cut -f1 -d"T"
UserParameter=mysql.threads,HOME=/etc/zabbix mysqladmin status | cut -f3 -d":" | cut -f1 -d"Q"
UserParameter=mysql.questions,HOME=/etc/zabbix mysqladmin status | cut -f4 -d":" | cut -f1 -d"S"
UserParameter=mysql.slowqueries,HOME=/etc/zabbix mysqladmin status | cut -f5 -d":" | cut -f1 -d"O"
UserParameter=mysql.qps,HOME=/etc/zabbix mysqladmin status | cut -f9 -d":"

Et comme pour la configuration sous CentOS on l’inclus dans le fichier de configuration de l’agent:

Include=/etc/zabbix/userparameter_mysql.conf

Et enfin on reprend l’astuce de Tiramiseb :

Création du fichier /etc/zabbix/dot.my.cnf avec le contenu :

[client]
user="zabbix"
password="super_password"

Ensuite, on fait un lien symbolique pour qu’il soit reconnu par MySQL :

cd /var/lib/zabbix
ln -s dot.my.cnf .my.cnf
chown zabbix.zabbix dot.my.cnf .my.cnf
chmod 600 dot.my.cnf

Et enfin on redémarre l’agent Zabbix

/etc/init.d/zabbix-agent restart

Et maintenant il ne reste plus qu’a affecter le template Mysql dans l’interface web a notre serveur Mysql.