Monit es una gran herramienta de Código Abierto para administrar y monitorear sistemas Unix. Monit lleva a cabo el mantenimiento y la reparación automáticos y puede ejecutar acciones causales significativas en situaciones de error.

Aprovechando que quiero instalarlo en este servidor, donde está alojado este blog, he pensado que sería interesante aprovechar también para escribir este artículo.

En mi servidor únicamente tengo instalado un LAMP, por lo que en este caso no vamos a monitorear otro servicio que no sea un Apache, MySQL y alguna otra cosa más -SSH, disco, etc-.

Instalación de Monit en GNU/Linux

Desde la gran mayoría de distribuciones de GNU/Linux se puede instalar Monit desde los mismos repositorios utilizando el gestor de paquetes preferido:

Para distribuciones basadas en Debian GNU/Linux:

apt install monit

Para distribuciones basadas en Red Hat:

rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install monit

Configuración de Monit

Monit consta de un fichero de configuración que se encuentra en /etc/monit/monitrc y de un directorio donde añadir las diferentes configuraciones de los servicios en /etc/monit/conf.d.

Vamos a editar primero /etc/monit/monitrc y vamos a cambiar algunas cosas interesantes.

Activamos la Interfaz Web de Monit:

set httpd port 2812 and
     use address [IP_SERVIDOR]
     allow 0.0.0.0/0.0.0.0
     allow admin:monit

Configuramos el servidor de SMTP que enviará las alertas:

set mailserver mail.midominio.com port 587
     username email@midominio.com  password "Contraseña"
     using TLSV1 with timeout 30 seconds
     #email que recibirá alertas
     set alert monit@midominio.com 

Configuramos el formato del e-mail

set mail-format {
     # Indica remitente válido para evitar SPAM
     from: monit@midominio
     subject: Monit Alert -- $EVENT $SERVICE
     message: $EVENT Service $SERVICE
     Date: $DATE
     Action: $ACTION
     Host: $HOST
     Description: $DESCRIPTION
     Monit VoidNull
}

Ahora ya tenemos configurado Monit para que funcione correctamente. También podemos ejecutar monit -t para comprobar el estado de la sintaxis del fichero y ver que todo es correcto.

Configuración de los servicios

En este caso vamos a configurar diferentes servicios que tengo en mi servidor. Crearemos un fichero por configuración que meteremos dentro de /etc/monit/conf-enabled. Si nos fijamos en /etc/monit/conf-available podremos ver que tenemos un montón de ficheros preparados para ser usados, son ejemplos de configuraciones que nos pueden ser útiles.

Listado de servicios para monitorear:

  • Espacio en disco duro
  • Servidor Apache
  • Servicio de SSH
  • Servidor de MariaDB

Espacio en disco duro

Creamos el fichero de configuración /etc/monit/conf-enabled/disc donde añadiremos lo siguiente:

check filesystem "root" with path /dev/sda1
if space usage > 90% for 8 cycles then alert
if space usage > 95% then exec "/root/free-disk.sh"
if inode usage > 90% for 8 cycles then alert
if inode usage > 99% then exec "/root/free-disk.sh"

Lo que hacemos aquí es comprobar nuestro disco /dev/sda1 y lo hacemos tanto en espacio como inodos que tenga el disco. Cuando el disco llegue al 90% del uso, se enviará una notificación por e-mail. Si el disco duro llega al 95% la acción que he puesto es que se ejecute un script para vaciar contenido del servidor.

El script tiene el siguiente contenido:

#!/bin/bash

apt-get clean
apt-get autoclean
rm -rf /tmp/*

Básicamente borro caché de APT y luego libero espacio borrando ficheros de la carpeta temporal de sistema. Seguramente se puedan borrar también logs, pero a veces con un poco de espacio es suficiente para luego redimensionar el servidor o darse cuenta -que al fin de cuentas es lo importante-.

Pondremos permisos al script:

chmod 755 /root/free-disk.sh

Servidor Apache

Creamos el fichero de configuración /etc/monit/`conf-enabled`/apache2 donde añadiremos lo siguiente:

check process apache with pidfile /run/apache2/apache2.pid
start program = "/etc/init.d/apache2 start" with timeout 60 seconds
stop program = "/etc/init.d/apache2 stop"
if cpu > 60% for 2 cycles then alert
if cpu > 80% for 5 cycles then restart
if totalmem > 200.0 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 unmonitor

Aquí haremos que si la CPU está al 60% durante dos ciclos envíe una alerta, si la CPU está al 80% durante cinco ciclos haremos un reinicio del servicio Apache. Con la RAM haremos algo parecido, cuando quede poca RAM también haremos reinicio del servicio.

Servicio de SSH

Creamos el fichero de configuración /etc/monit/`conf-enabled`/ssh donde añadiremos lo siguiente:

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 3 restarts within 5 cycles then unmonitor

Para SSH, lo que haremos es que si el puerto 22 falla, entonces haremos un reinicio del servicio SSH.

Servidor de MariaDB

Creamos el fichero de configuración /etc/monit/`conf-enabled`/mariadb donde añadiremos lo siguiente:

check process mysqld with pidfile /run/mysqld/mysqld.pid
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 3 restarts within 5 cycles then unmonitor

Con MariaDB haremos parecido al servicio SSH, si el puerto 3306 deja de estar operativo en localhost, lo que haremos será reiniciar el servicio de MariaDB.

Comprobando que Monit funciona correctamente

Ahora que tenemos los ficheros de configuración creados y hemos seleccionado una serie de ordenes que queremos que haga Monit con nuestros servicios, vamos a probar que funciona correctamente.

Podremos acceder a un entorno web que hemos activado antes utilizando el puerto 2812, así que accedemos ahora, pero antes reiniciamos el servicio de Monit:

systemctl restart monit
Interfaz web de Monit

Esto que voy hacer yo, no lo hagáis nunca, pero si paramos un servicio y volvemos a acceder a la web:

Monit con un servicio parado

He parado el servicio de Apache un momento para hacer la captura -en serio, esto en un servidor de producción no lo hagáis xD-

De acuerdo, tras hacer esta locura en mi servidor -en este servidor- hemos observador que en la interfaz web queda un mensaje en rojo, pero antes hemos configurado el correo para que Monit nos envíe correos cuando algo no esté funcionando correctamente.

Si consultamos el correo vemos que deberíamos de tener varios:

Does not exist Service apache
    Date: Sat, 18 Aug 2018 15:14:08
    Action: restart
    Host: Freya
    Description: process is not running
    Monit VoidNull

Monit ha detectado que el servicio de Apache ha fallado, y ha procedido a reiniciar el servicio. Yo únicamente hice un stop del servicio, y Monit, lo levantó. Aún así, este correo es para informar de que el servicio no está ejecutándose.

Pero habremos recibido un correo más:

Exists Service apache
    Date: Sat, 18 Aug 2018 15:16:08
    Action: alert
    Host: Freya
    Description: process is running with pid 18683
    Monit VoidNull

Aquí la vemos que el proceso de Apache se ha levantado y está funcionando de nuevo.

Conclusiones

Aquí hemos visto algunos ejemplos interesantes para monitorizar un servidor web sencillo. Pero con Monit puedes hacer mil y una cosas para controlar todo tipo de servicios, PIDs, ficheros, lo que se te ocurra.

Como siempre, si quieres aprender más y saber como hacer otras cosas es importante leerse la documentación de este maravilloso servicio.

Y una vez configures todo a tu gusto, solo tienes que esperar a que te envíen un correo para saber que algo anda mal.

Haz que cada palabra cuente: tu donación nos inspira a seguir creando contenido. Accede al apartado de Donación para hacer tu aportación