Table of Contents

Nagios 3 avec Nginx sous Debian Squeeze

nagios supervision debian nginx

For english readers, there is a more recent version of this article available in english. check it out: 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.

<note important>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 !</note>

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:

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         }
 
[...]

<note tip>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).</note>

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.

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 <vhost> | -I <IP-address> [-u <uri>] [-p <port>]
       [-w <warn time>] [-c <critical time>] [-t <timeout>] [-L]
       [-a auth] [-b proxy_auth] [-f <ok | warn | critcal | follow | sticky | stickyport>]
       [-e <expect>] [-s string] [-l] [-r <regex> | -R <case-insensitive regex>]
       [-P string] [-m <min_pg_size>:<max_pg_size>] [-4|-6] [-N] [-M <age>]
       [-A string] [-k string] [-S] [-C <age>] [-T <content-type>] [-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
        }