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

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

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.
Comentarios