Estas son mis notejas para poder monitorizar una instalacion de nginx desde Nagios con el menor dolor posible.
Lo que vamos a monitorizar del nginx es la página de status. Esta página está disponible al compilar nginx con el módulo ngx_http_stub_status_module. Para comprobar si está disponible en tu instalación puedes verlo en la información de nginx:
nginx -V 2 | grep -o with-http_stub_status_moduleSi está disponible, lo primero es crear una Location nueva en nginx para que sirva dicha página de status. La ventaja del status page es que no solo compruebas que el servidor está levantado, sino que además te da las conexiones activas y otros valores de rendimiento, por lo que se puede usar para obtener estadísticas y sacar medidas del rendimiento... muy cuco. Para más info, la documentación oficial: http://nginx.org/en/docs/http/ngx_http_stub_status_module.html
La location quedaría más o menos así:
location /nginx_status {Comentarios:
stub_status on;
access_log off;
allow 172.16.0.0/24;
deny all;
}
- Deshabilitamos el access_log. No es necesario, pero se trata de un chequeo periódico, de modo que si no lo deshabilitamos vamos a meter en nuestro log de accesos una entrada cada X minutos. Nada de vida o muerte, pero tampoco aporta nada y es tan fácil quitarlo...
- Ponemos una regla de acceso. En nuestro caso permitimos únicamente el acceso a dicha location desde la subred 172.16.0.0/24. Se podría poner únicamente la IP del Nagios, pero no es nada recomendable dejarlo abierto. Cuanto menos información tenga un posible atacante: mejor.
Una vez configurado, se podría acceder a la página de status desde cualquier equipo de la red permitida en la url http://tuservidor.com/nginx_status y verás algo parecido (los valores,obviamente cambiarán) a lo indicado en la página de la documentación oficial:
Active connections: 291Vale... ya estamos en marcha. Ahora vamos con nagios.
server accepts handled requests
16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106
Vamos a usar un plugin muy majo llamado check_nginx_status, disponible en github por cortesía del usuario regilero:
https://github.com/regilero/check_nginx_status/
Está escrito en perl y bastante bien documentado.
Lo descargamos en el directorio de plugins, le cambiamos el propietario a root y los permisos:
chown root:root check_nginx_statusPodéis probarlo a las bravas aquí directamente, pero con un matiz que comentaré al final del post sobre el fichero de históricos
chmod 755 chown root:root check_nginx_status
Creamos un host, si no está ya creado, para este servidor que está en la IP 172.16.0.10, llamémosle nginx_server y vamos a usar el template linux-server para ir más rápidos:
define host{
use linux-server
host_name nginx_server
alias Servidor NGINX
address 172.16.0.10
}
El plugin tiene muchos parámetros y se puede personalizar un montón. Nosotros no nos vamos a complicar demasiado. Creamos el check command:
De modo que el primer parámetro será los valores para Warning, el segundo los valores para Critical y el tercero lo dejamos abierto por si queremos incluir algún parámetro adicional.
define command{
command_name check_nginx
command_line $USER1$/check_nginx_status -H $HOSTADDRESS$ -w $ARG1$ -c $ARG2$ $ARG3$
}
Con el command definido, definimos el service (usamos el template local-service para ir más rápidos):
define service{Aqui hemos puesto los umbrales en -1 de acuerdo con la documentación, porque de momento no queremos levantar alarmas, solo monitorizar. Si queremos poner valores se pueden especificar los umbrales para conexiones activas, request por segundo o conexiones por segundo separándolos por comas.
use local-service
host_name nginx_server
service_description NGINX
check_command check_nginx!-1!-1!
notifications_enabled 0
}
Por ejemplo, para lanzar un warning con 10000 conexiones activas, 100 request por segundo y 200 conexiones por segundo y un critical con 20000 conexiones activas, 200 request por segundo y 300 conexiones por segundo pondríamos:
check_command check_nginx!10000,100,200!20000,200,300!Ver la documentacion del plugin para más información
Pues ya está todo. Si reiniciamos nuestro nagios deberíamos ver los checks del servicio... o no. Porque puede haber varios problemas:
El status devuelve "Service check did not exit properly"
Esto se suele deber a que Nagios tiene un intérprete de perl propio y los scripts no son siempre compatibles con este intérprete, aunque sí funcionen perfectamente con perl. Si tienes habilitado el ePN (embedded Perl Nagios) es posible que tengas que deshabilitarlo para este script. Según reza la documentación de Nagios: http://nagios.sourceforge.net/docs/3_0/embeddedperl.html
To tell Nagios to NOT use the embedded Perl interpreter for a particular script, add this line to the Perl script:
# nagios: -epn
Either line must be located within the first 10 lines of a script for Nagios to detect it.
Es decir, editar el script check_nginx_status y añadir al principio del fichero
# nagios: -epn
El status da un error diciendo que no puede escribir en el fichero temporal (unable to write temporary data in bla bla bla)
La típica tontería que se te pasa y se soluciona en 2 segundos. Si estuviste jugando con el script desde linea de comandos antes de pelearte con la configuración, puede pasar que en esas ejecuciones se haya creado el fichero temporal con el histórico de valores. Y claro, se crea con los permisos del usuario que lanza el plugin. Es decir, que el fichero puede ya existir y el servicio, al intentar escribir en él, no tiene suficientes permisos y da un error.
Solución: o cambias el propietario y los permisos del fichero (que está ubicado en /tmp/ por defecto y su nombre es DIR_IP_DEL_HOST_check_nginx_statusMD5_DE_LA_URL) o bien simplemente lo borras y se acabó. Cuando el Nagios intente de nuevo crear el fichero, no habrá ninguno, de modo que lo creará con los permisos que él necesite.
Bonus!
El fichero que que crea el plugin con los datos históricos del servicio es compatible con PNP4Nagios (https://docs.pnp4nagios.org/) que es (citando su documentacion) un complemento para Nagios que analiza los datos de rendimiento obtenidos por los plugins y los almacena automáticamente en bases de datos RDD. O dicho de otro modo: saca gráficos de rendimiento muy cucos de los datos que vienen de los plugins.
Si en tu instalación dispones de PNP, el plugin check_nginx_status tiene un template para poder representar gráficamente los datos obtenidos de rendimiento. Este template está disponible en https://gist.github.com/maethor/8714514