Monitorear servicios con Monit
Dedicados & VPS
22

Monitorear servicios con Monit

Hay un problema muy común en servidores de producción: MySQL se cae a las 3 de la madrugada, nadie se entera, y recién por la mañana los clientes empiezan a reportar errores. Monit nace justo para evitar eso. Es una herramienta pequeña, liviana y sin dependencias pesadas, que vigila procesos, archivos, filesystems y más, y los reinicia automáticamente cuando algo falla.

¿Qué es Monit?

Monit es un demonio de monitoreo y supervisión para sistemas Unix/Linux. A diferencia de Prometheus o Netdata, que se enfocan en recolectar métricas, Monit se enfoca en actuar: si un proceso no responde, lo reinicia; si un filesystem está al 95 por ciento, dispara una alerta; si un archivo de configuración cambió, te avisa. Es un pequeño guardián silencioso del servidor.

Instalación

En la mayoría de distribuciones está en los repos oficiales:

# Debian/Ubuntu
apt install monit

# Rocky/AlmaLinux/CentOS
dnf install monit

systemctl enable --now monit

El archivo /etc/monit/monitrc

Toda la configuración vive en /etc/monit/monitrc (en algunas distros /etc/monitrc). La sintaxis es muy legible, casi parece inglés. Las primeras líneas definen el intervalo de chequeo, el servidor SMTP para alertas y la interfaz web interna:

set daemon 60
set mailserver smtp.tudominio.com port 587
  username "alertas@tudominio.com" password "secreto"
  using tls
set alert admin@tudominio.com
set httpd port 2812 and
  use address localhost
  allow localhost
  allow admin:TuPasswordFuerte

Bloques para servicios típicos

Después de la parte global, agregás un bloque por cada servicio que querés vigilar. Por ejemplo, para Apache:

check process apache with pidfile /var/run/apache2/apache2.pid
  start program = "/bin/systemctl start apache2"
  stop program  = "/bin/systemctl stop apache2"
  if failed host 127.0.0.1 port 80 protocol http then restart
  if 5 restarts within 5 cycles then alert

Para Nginx la idea es idéntica, solo cambiás el pidfile y el comando. Para MySQL:

check process mysqld with pidfile /var/run/mysqld/mysqld.pid
  start program = "/bin/systemctl start mysql"
  stop program  = "/bin/systemctl stop mysql"
  if failed unixsocket /var/run/mysqld/mysqld.sock then restart
  if 3 restarts within 5 cycles then alert

Para PHP-FPM usás el puerto TCP o el socket correspondiente según tu configuración, el patrón es siempre el mismo: verificás que el proceso esté vivo, que responda en su puerto o socket y si falla lo reiniciás.

Vigilancia del sistema

Además de procesos, Monit puede vigilar recursos globales del host:

check system $HOST
  if loadavg (5min) > 4 then alert
  if memory usage > 85% then alert
  if swap usage > 50% then alert
  if cpu usage (user) > 80% then alert

check filesystem rootfs with path /
  if space usage > 90% then alert
  if inode usage > 90% then alert

Alertas por correo

Gracias a la configuración SMTP que pusiste al principio, cada vez que Monit decide que algo está mal recibís un correo con el host, el servicio, la razón y qué acción se tomó. Podés afinar qué eventos generan correo con la directiva set mail-format y alert por servicio.

Panel web

En el puerto 2812 tenés una mini interfaz web bastante cruda donde ves el estado actual de todo: verde si todo OK, rojo si algo falló. Desde ahí podés parar, arrancar o reiniciar cualquier servicio supervisado. Es útil para diagnósticos rápidos cuando entrás por SSH desde el celular y no querés tipear comandos largos.

¿Por qué sigue siendo relevante?

Hoy hay sistemas más sofisticados, pero Monit brilla por su simplicidad: no necesita base de datos, no tiene interfaces pesadas, consume poquísima RAM, su configuración cabe en un solo archivo y entiende perfectamente cómo reiniciar cosas cuando hace falta. Para un VPS o un servidor dedicado donde quieras "que se cuide solo" es una herramienta difícil de superar.