Instalar Monit para monitorizar un servidor Apache, MySQL y OpenSSH

Monit LogoPara los que no esteis al caso, según su propia web, Monit es una utilidad gratuita de código abierto para la gestión y vigilancia de procesos, archivos, directorios y sistemas de ficheros en un sistema UNIX.

Configurado correctamente, Monit es capaz de realizar el mantenimiento y la reparación de los servicios, procesos… incluso ejecutar acciones programadas para situaciones de error.

Por poner un ejemplo, un uso común que se le suele dar es que vaya controlando si apache está funcionando correctamente, en caso de estar caido o saturado, Monit lo levantará automáticamente y nos enviará un mail informando del problema solventado.

Instalación de Monit

1) Descargamos la última versión estable de Monit (en mi caso la 5.0.1) de la página oficial, como lo instalaré en una debian, voy a la distribución en concreto, y me descargo el paquete deb para la arquitectura de mi máquina i386:

wget http://ftp.uk.debian.org/debian/pool/main/m/monit/monit_4.10.1-4_i386.deb

2) Y lo instalamos con el comando dpkg:

sudo dpkg -i monit_4.10.1-4_i386.deb

Si todo ha ido bien, obtendremos un resultado como este:

Selecting previously deselected package monit.
(Reading database ... 195390 files and directories currently installed.)
Unpacking monit (from monit_4.10.1-4_i386.deb) ...
Setting up monit (1:4.10.1-4) ...
Starting daemon monitor: monit won't be started/stopped
	unless it it's configured
	please configure monit and then edit /etc/default/monit
	and set the "startup" variable to 1 in order to allow
	monit to start

Llegados a este punto, ya tenemos instalado Monit en nuestro servidor Debian, ¿sencillo no?

Un último paso en la instalación antes de pasar a la configuración (sólo aplica si tienes apache instalado y deseas monitorizarlo con monit):

Localiza el directorio root document del servidor Apache que queramos monitorizar y dentro de él crear una carpeta llamada monit que contenga un archivo llamado token (el contenido de este archivo es irrelevante)

mkdir -p /PATH_TO_ROOT_FOLDER/monit/
touch /PATH_TO_ROOT_FOLDER/monit/token

Comprobaremos que todo ha ido bien visitando http://[IP_SERVER]/monit/token. Si no hay un error, es que apache ha podido leer correctamente el archivo /monit/token, en caso de error asegúrate de que has creado el archivo en la ubicación correcta y que apache puede leerlo.

Configuración de Alertas Monit

El fichero de configuración de Monit se encuentra en la ruta /etc/monit/monitrc, por defecto trae una serie de configuraciones definidas y comentadas que podremos utilizar para tener lista una configuración básica, con un poco de tiempo y paciencia, podeis ir añadiendo diferentes chequeos.

sudo vi /etc/monit/monitrc

Primero modificaremos la información de las alertas vía mail (recordad que debeis tener configurado en vuestro servidor un servidor de correo).

Añadimos la siguiente información en la sección Global Sectio modificando miMail@hotmail.com por el mail en el que queremos recibir las visitas y monit@myServer.com por el mail del que queremos que provenga, por ejemplo, monit@mi-dominio.com:

set alert miMail@hotmail.com

set mail-format {
   from: monit@myServer.com
   subject: $SERVICE $EVENT at $DATE
   message: 

            Monit $ACTION $SERVICE at $DATE on $HOST: $DESCRIPTION.
            Yours sincerely,
            monit
}

Configuración de control de Apache

Añadimos la siguiente información al final de la sección Services

check process apache with pidfile /var/run/apache2.pid
   group www
   start program = "/etc/init.d/apache2 start"
   stop program  = "/etc/init.d/apache2 stop"
   if failed host [IP_SERVER] port 80
        protocol http request /monit/token then restart
   if cpu is greater than 60% for 3 cycles then alert
   if cpu > 80% for 5 cycles then restart
   if totalmem > 400 MB for 5 cycles then restart
   if children > 250 then restart
   if loadavg(5min) greater than 10 for 8 cycles then stop
   if 3 restarts within 5 cycles then timeout

NOTA!! Debemos modificar la ruta del fichero pid de apache a donde lo tengamos alojado. En Debian suele ser /var/run/apache2.pid y los valores que he colocado entre [] por los de nuestro servidor.

Explicado de un modo rápido, le estamos indicando que reinicie el servidor Apache si el servidor presenta uno de los siguientes sintomas:

  • No responde al visitar la url http://[IP_SERVER]/monit/token
  • Apache ocupa más del 80% de la CPU durante 5 ciclos de Monit
  • La memoria utilizada por Apache es superior a 400MB durante 5 ciclos de Monit
  • El proceso tiene más de 250 hijos

Que nos envíe un mail (siempre que tengamos configurado un servidor de correo) en caso de que:

  • Haya detectado uno de los problemas mencionados anteriormente
  • Apache ocupa más del 60% de la CPU durante 3 ciclos de Monit

Y parará el servidor en caso de error crítico avisandonos vía email.

Configuración de control de MySQL

Para configurar un chequeo del servidor MySQL, añadimos la siguiente información después del bloque configurado anteriormente:

check process mysql with pidfile /var/run/mysqld/mysqld.pid
   group database
   start program = "/etc/init.d/mysql start"
   stop program = "/etc/init.d/mysql stop"
   if failed host 127.0.0.1 port 3306 then restart
   if 5 restarts within 5 cycles then timeout

NOTA!! Debemos modificar la ruta del fichero pid de mysql a donde lo tengamos alojado. En Debian suele ser /var/run/mysqld/mysqld.pid.

Configuración de control de OpenSsh

Para acabar este tutorial, configuraremos un control del servidor SSH, punto importante, pues si no podemos acceder físicamente a nuestro servidor y no podemos acceder mediante SSH porque este servicio ha caido, tenemos un pequeño problema :D.

Añadiremos el siguiente trozo de código acordandonos de cambiar la ruta al fichero sshd.pid a la correspondiente en nuestro servidor:

check process sshd with pidfile /var/run/sshd.pid
   start program  "/etc/init.d/ssh start"
   stop program  "/etc/init.d/ssh stop"
   if failed port 22 protocol ssh then restart
   if 5 restarts within 5 cycles then timeout

Cabe remarcar la importancia de tener monitorizaciones cruzadas desde diferentes servidores, pues si, por poner un ejemplo, se corta la conexión en nuestro servidor de producción monitorizado desde la mísma máquina, a pesar de que monit lo detectará, intentará enviar emails que no llegarán (pues no tiene conexión). Para evitar esto y tenemos la suerte de disponer de varios servidores, podemos indicar al server1 que monitorice los servicios de server2 y en caso de fallar, que nos alerte vía mail para poder actuar en consecuencia.