====== Nagios 3 avec Nginx sous Debian Squeeze ======
{{tag> nagios supervision debian nginx}}
**//For english readers, there is a more recent version of this article available in english. check it out: [[http://wiki.linuxwall.info/doku.php/en:ressources:dossiers:supervision:nagios3|Nagios with Nginx on Fedora (or Amazon Linux AMI)]]//**
# aptitude install nagios3
Oui, alors, on va me dire que c'est un peu rude pour une introduction, met en fin de compte ça parle de soit-même !
===== Initialisation =====
Le répertoire **/etc/nagios3/** contient les fichiers suivants:
ramiel:/etc/nagios3# ls -l
total 76
-rw-r--r-- 1 root root 1905 oct. 23 13:38 apache2.conf
-rw-r--r-- 1 root root 12218 oct. 23 13:39 cgi.cfg
-rw-r--r-- 1 root root 2441 oct. 23 13:39 commands.cfg
drwxr-xr-x 2 root root 4096 avril 1 11:09 conf.d
-rw-r--r-- 1 root root 43769 oct. 23 13:39 nagios.cfg
-rw-r----- 1 root nagios 1293 oct. 23 13:38 resource.cfg
drwxr-xr-x 2 root root 4096 avril 1 11:10 stylesheets
==== Créer un utilisateur ====
Nagios stocke ses users dans un fichier htpasswd.users, on peux donc créer un nouvel utilisateur et lui associer un mot de passe via la commande htpasswd de Apache.
ramiel:/etc/nagios3# htpasswd -c htpasswd.users nagiosadmin
New password:
Re-type new password:
Adding password for user nagiosadmin
Le fichier htpasswd.users contient alors la ligne suivante:
ramiel:/etc/nagios3# cat htpasswd.users
nagiosadmin:5sadZeasd23adt
===== Configurer NGINX =====
Nagios fournit une configuration pour Apache, mais pour Nginx, il faut la modifier quelque peux.
Tout d'abord, les scripts CGI de Nagios étant écris en C, il nous faut installer un wrapper fastcgi pour exécuter ces derniers. Ce wrapper bindera un socket et Nginx enverra les requêtes vers le socket, et récupérera la réponse sous forme de code HTML pour la renvoyer au client.
==== Installer FCGI Wrap ====
Récupérons le code source.
ramiel:~# wget http://github.com/gnosek/fcgiwrap/tarball/master
ramiel:~# tar -xzvf gnosek-fcgiwrap-ba8c8d9.tar.gz
gnosek-fcgiwrap-ba8c8d9/
gnosek-fcgiwrap-ba8c8d9/.gitignore
gnosek-fcgiwrap-ba8c8d9/Makefile.in
gnosek-fcgiwrap-ba8c8d9/README.rst
gnosek-fcgiwrap-ba8c8d9/configure.ac
gnosek-fcgiwrap-ba8c8d9/fcgiwrap.c
Et on compile, la présence du package **libfcgi-dev** est nécessaire:
ramiel:~/gnosek-fcgiwrap-ba8c8d9# autoconf
ramiel:~/gnosek-fcgiwrap-ba8c8d9# ./configure
[...]
ramiel:~/gnosek-fcgiwrap-ba8c8d9# make
gcc -std=gnu99 -Wall -Wextra -Werror -pedantic -O2 -g3 fcgiwrap.c -o fcgiwrap -lfcgi
Ce qui nous donne le binaire **fcgiwrap**.
On déplace ce binaire dans /usr/bin/ et on crée le script suivant dans **/etc/init.d** pour lancer **fcgiwrap** avec **spawn-fcgi** (paquet à installer).
#!/bin/bash
COMMAND=/usr/bin/spawn-fcgi
NAME=fcgiwrap
ADDRESS=127.0.0.1
PORT=9001
USER=www-data
GROUP=www-data
PHPCGI=/usr/bin/fcgiwrap
KILL=/bin/kill
case "$1" in
start)
start-stop-daemon --start \
--exec $COMMAND -- -a $ADDRESS -p $PORT \
-u $USER -g $GROUP -f $PHPCGI -P /var/run/$NAME.pid|| true
echo -n "$NAME started with pid "
cat /var/run/$NAME.pid
echo
;;
stop)
if [ -e /var/run/$NAME.pid ]
then
$KILL `cat /var/run/$NAME.pid`
rm /var/run/$NAME.pid
echo "$NAME stopped"
else
echo "$NAME is not running, no pid file in /var/run/"
fi
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac
exit $RETVAL
On lance ensuite ce script, qui va mettre fcgiwrap en écoute sur le port 9001.
ramiel:~/# /etc/init.d/spawnfcgiwrap start
spawn-fcgi: child spawned successfully: PID: 6947
fcgiwrap started with pid 6947
ramiel:~/# netstat -taupen |grep LISTEN |grep 9001
tcp 0 0 127.0.0.1:9001 0.0.0.0:* LISTEN 0 873400 6947/fcgiwrap
On termine par un lien dans /etc/rc2.d pour le lancement au démarrage.
ramiel:~/# ln -s /etc/init.d/spawnfcgiwrap /etc/rc2.d/S19spawnfcgiwrap
==== Configurer Nginx ====
Ceci étant fait, nous pouvons maintenant créer le virtual host de Nginx.
Je ne rentre pas dans le détail ici, il faut surtout faire attention à la section **cgi** pour bien envoyer les requêtes vers fcgiwrap.
je n'ai pas cherché à comprendre comment été structurées les pages de Nagios 3, mais il semblerait que la ré-écriture d'URL soit indispensable. En attente de mieux, la page Nagios est accessible depuis la racine du serveur "/"... si vous avez mieux je suis preneur !
ramiel:/etc/nginx/sites-available# grep -v "^$" ssl|grep -v "#"
server {
listen 443;
server_name nagios.toto.com;
ssl on;
ssl_certificate /etc/nginx/certs/nagioscert.pem;
ssl_certificate_key /etc/nginx/certs/nagioscert.key;
ssl_session_timeout 5m;
ssl_protocols SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:!LOW:!SSLv2:+EXP;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/nagios-ssl.access.log;
error_log /var/log/nginx/nagios-ssl.error.log;
location / {
root /usr/share/nagios3/htdocs;
index index.html index.htm;
rewrite ^/nagios3/(.*) /$1 break;
auth_basic "Restricted";
auth_basic_user_file /etc/nagios3/htpasswd.users;
}
location /cgi-bin/nagios3/ {
root /usr/lib/;
include /etc/nginx/fastcgi_params;
auth_basic "Restricted";
auth_basic_user_file /etc/nagios3/htpasswd.users;
fastcgi_param AUTH_USER $remote_user;
fastcgi_param REMOTE_USER $remote_user;
if ($uri ~ "\.cgi$"){
fastcgi_pass 127.0.0.1:9001;
}
}
}
On peut maintenant visiter la page d'accueil de nagios, après passage du login, et admirer la configuration par défaut. Cette dernière inclus automatiquement la machine locale et la passerelle réseau. On a donc deux machines déjà visualisables dans l'interface:
{{:fr:ressources:dossiers:supervision:nagios.png|}}
===== Configurer les Hosts dans Nagios =====
L'interface Web de Nagios ne permet pas de gérer la configuration. Pour cela, il faut se rendre dans **/etc/nagios3/conf.d/** et modifier les templates existants.
Par exemple, le fichier **localhost_nagios2.cfg** contient la configuration du host local, on peut renomer ce fichier du nom du serveur local et modifier son contenu pour remplacer, dans mon cas, tous les "localhost" par des "ramiel".
ramiel:/etc/nagios3/conf.d# mv localhost_nagios2.cfg ramiel.cfg
ramiel:/etc/nagios3/conf.d# vim ramiel.cfg
1 # A simple configuration file for monitoring the local host
2 # This can serve as an example for configuring other servers;
3 # Custom services specific to this host are added here, but services
4 # defined in nagios2-common_services.cfg may also apply.
5 #
6
7 define host{
8 use generic-host ; Name of host template to use
9 host_name ramiel
10 alias ramiel
11 address 127.0.0.1
12 }
[...]
Dans Vim, pour remplacer les occurences d'un mot par un autre, on peut utiliser la commande :g/localhost/s//ramiel/g
(en mode commande).
Ce fichier se base sur le template "generic-host" définit dans **generic-host_nagios2.cfg**. Le template détaille les méthodes utilisées sur ce type de host, et en particulier la méthode pour déterminer s'il est en vie. La méthode par défaut est le ping via la commande check-host-alive:
check_command check-host-alive
Ce qui signifie que pour savoir si les host de ce type sont vivant, on va les pinger non stop (toutes les minutes).
Dans le fichier **hostgroups_nagios2.cfg** se trouvent les groupes utilisés pour les tests. Notre "localhost" est présent dans tous les groupes, et l'on va le remplacer par "ramiel" afin de ne plus avoir de référence à localhost.
Puis on redémarre nagios, et de retour dans l'interface, localhost à bien été remplacé par ramiel.
{{:fr:ressources:dossiers:supervision:host.png|}}
===== Ajouter un serveur web =====
Voyons maintenant comment ajouter un hôte supplémentaire à Nagios.
Toutefois, cet hôte ne sera pas joignable par la méthode ping, on va donc créer un nouveau template, copie du template par défaut, ou la méthode //check command// est remplacée du ping à un check_http.
On crée ce template dans le fichier **web-host.cfg**:
ramiel:/etc/nagios3/conf.d# cat web-host.cfg
# Web Host (alive is done by http) definition template - This is NOT a real host, just a template!
define host{
name web-host ; The name of this host template
notifications_enabled 1 ; Host notifications are enabled
event_handler_enabled 1 ; Host event handler is enabled
flap_detection_enabled 1 ; Flap detection is enabled
failure_prediction_enabled 1 ; Failure prediction is enabled
process_perf_data 1 ; Process performance data
retain_status_information 1 ; Retain status information across program restarts
retain_nonstatus_information 1 ; Retain non-status information across program restarts
check_command check_http
max_check_attempts 10
notification_interval 0
notification_period 24x7
notification_options d,u,r
contact_groups admins
register 0 ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE!
}
On va ensuite créer un fichier "ptichoun.cfg" dans le répertoire **/etc/nagios3/conf.d/** et le remplir comme suis:
ramiel:/etc/nagios3/conf.d# vim ptichoun.cfg
define host{
use web-host
host_name ptichoun
alias ptichoun
address ptichoun.linuxwall.info
}
Et l'on va mettre ce nouvel Host dans le groupe "http-servers" du fichier **hostgroups_nagios2.cfg**.
ramiel:/etc/nagios3/conf.d# vim hostgroups_nagios2.cfg
[...]
define hostgroup {
hostgroup_name http-servers
alias HTTP servers
members ramiel, ptichoun
}
Il faut ensuite redémarrer nagios pour prendre ce nouvel host en compte.
si vous voulez jeter un coup d'oeil aux commandes qui sont lancés, c'est dans le répertoire **/etc/nagios-plugins/config** qu'il faut aller.
On y trouve, par exemple, le fichier **http.cfg** qui contient les commandes lancées pour les tests HTTP.
ramiel:/etc/nagios-plugins/config# head http.cfg
# 'check_http' command definition
define command{
command_name check_http
command_line /usr/lib/nagios/plugins/check_http -H '$HOSTADDRESS$' -I '$HOSTADDRESS$'
}
# 'check_http_hostname' command definition
define command{
command_name check_httpname
command_line /usr/lib/nagios/plugins/check_http -H '$HOSTNAME$' -I '$HOSTADDRESS$'
on peut ainsi lancer les commandes de check manuellement:
ramiel:/etc/nagios-plugins/config# /usr/lib/nagios/plugins/check_http
check_http: Impossible de dcomposer les arguments
Utilisation: check_http -H | -I [-u ] [-p ]
[-w ] [-c ] [-t ] [-L]
[-a auth] [-b proxy_auth] [-f ]
[-e ] [-s string] [-l] [-r | -R ]
[-P string] [-m :] [-4|-6] [-N] [-M ]
[-A string] [-k string] [-S] [-C ] [-T ] [-j method]
ramiel:/etc/nagios-plugins/config# /usr/lib/nagios/plugins/check_http -H ptichoun.linuxwall.info -I ptichoun.linuxwall.info
HTTP OK: HTTP/1.1 200 OK - 56647 bytes in 0,737 second response time |time=0,736849s;;;0,000000 size=56647B;;;0
===== Ajouter un check sur le service DNS =====
Admettons que nous souhaitons valider le fonctionnement d'un serveur DNS Bind. On peux, pour cela, créer une commande qui va lancer une requête DNS sur le serveur de destination.
Pour cela, il faut modifier le fichier de commandes DNS dans **/etc/nagios-plugin/config/dns.cf**. On va y ajouter une nouvelle commande "check_dns_srv" comme suis:
# vim /etc/nagios-plugins/config/dns.cfg
[...]
# 'check_dns_srv' command definition
define command{
command_name check_dns_srv
command_line /usr/lib/nagios/plugins/check_dns -H '$HOSTADDRESS$' -s '$HOSTADDRESS$'
}
Puis, dans le host voulu, on va rajouter ce contrôle sous la forme d'un "service":
ramiel:/etc/nagios3/conf.d# cat neuromatrice.cfg
define host{
use ssh-host
host_name maurice
alias maurice
address maurice.linuxwall.info
}
# Define a service to check the DNS Daemon
define service{
use generic-service ; Name of service template to use
host_name maurice
service_description DNS Daemon
check_command check_dns_srv
}