Monitoreo Servidores · 12 min read · Oct 15, 2025

Monitoreo de Servidores con Munin y Monit en Debian 10

En este artículo, describo cómo puedes monitorear tu servidor Debian 10 (Buster) con Munin y Monit. Munin genera gráficos interesantes sobre casi todos los aspectos de tu servidor (promedio de carga, uso de memoria, uso de CPU, rendimiento de MySQL, tráfico de red, etc.) sin mucha configuración, mientras que Monit verifica la disponibilidad de servicios como Apache, MySQL, Postfix y toma la acción apropiada como un reinicio si encuentra que un servicio no se comporta como se esperaba. Combinar los dos te brinda un monitoreo completo: gráficos que te permiten ver problemas actuales o inminentes (por ejemplo, “Necesitamos un servidor más grande pronto, nuestro promedio de carga está aumentando rápidamente.”), y un watchdog que asegura la disponibilidad de los servicios monitoreados.

Aunque puedes monitorear más de un servidor con Munin, solo discutiremos el monitoreo del sistema en el que está instalado aquí.

Esta guía fue escrita para Debian 10 (Buster), pero la configuración también debería aplicarse a otras distribuciones como Ubuntu con cambios menores.

1 Nota Preliminar

Todos los comandos en este tutorial se ejecutan como usuario root. Inicia sesión en tu servidor como root por SSH o abre una ventana de terminal. Si inicias sesión como un usuario diferente a root, usa el comando

su -

para convertirte en el usuario root, antes de continuar.

El nombre de host de nuestro sistema es server1.example.com, y tenemos un sitio web www.example.com en él con la raíz del documento /var/www/www.example.com/web.

Asegúrate de que el sistema esté actualizado antes de comenzar a instalar Munin, ejecuta:

apt update  
apt upgrade

Apache se utiliza para mostrar las páginas de Munin, el módulo fcgid de apache es necesario para la función de zoom del gráfico de Munin. Instala apache y el módulo fcgid con apt.

apt install apache2 libcgi-fast-perl libapache2-mod-fcgid

Habilita el módulo fcgid en apache.

a2enmod fcgid

2 Instalar y Configurar Munin

Para instalar Munin en Debian, hacemos esto:

apt install munin munin-node munin-plugins-extra

Cuando el servidor está ejecutando MySQL o MariaDB, entonces habilita algunos plugins adicionales de Munin para monitorear MySQL:

cd /etc/munin/plugins  
ln -s /usr/share/munin/plugins/mysql_ mysql_  
ln -s /usr/share/munin/plugins/mysql_bytes mysql_bytes  
ln -s /usr/share/munin/plugins/mysql_innodb mysql_innodb  
ln -s /usr/share/munin/plugins/mysql_isam_space_ mysql_isam_space_  
ln -s /usr/share/munin/plugins/mysql_queries mysql_queries  
ln -s /usr/share/munin/plugins/mysql_slowqueries mysql_slowqueries  
ln -s /usr/share/munin/plugins/mysql_threads mysql_threads

A continuación, debemos editar el archivo de configuración de Munin /etc/munin/munin.conf. Descomenta las líneas dbdir, htmldir, logdir, rundir y tmpldir (los valores predeterminados están bien). Queremos que Munin use el nombre server1.example.com en lugar de localhost.localdomain en la salida HTML, por lo tanto, reemplazamos localhost.localdomain con server1.example.com en la sección del árbol de hosts simple. Sin los comentarios, el archivo cambiado se ve así:

nano /etc/munin/munin.conf
# Archivo de configuración de ejemplo para Munin, generado por 'make build'
  
# Las siguientes tres variables especifican dónde se encuentra la ubicación de las RRD
# bases de datos, la salida HTML, los registros y los archivos de bloqueo/pid. Todos ellos
# deben ser escribibles por el usuario que ejecuta munin-cron. Todos ellos
# están predeterminados a los valores que ves aquí.  
#  
dbdir /var/lib/munin  
htmldir /var/cache/munin/www  
logdir /var/log/munin  
rundir /var/run/munin  
  
# Dónde buscar las plantillas HTML  
#  
tmpldir /etc/munin/templates  
  
# Dónde buscar los archivos www estáticos  
#  
#staticdir /etc/munin/static  
  
# los archivos cgi temporales están aquí. nota que debe ser escribible por  
# el usuario cgi (generalmente nadie o httpd).  
#  
# cgitmpdir /var/lib/munin/cgi-tmp

# (Exactamente un) directorio para incluir todos los archivos.
includedir /etc/munin/munin-conf.d
[...]
# un árbol de hosts simple  
[server1.example.com]  
 address 127.0.0.1  
 use_node_name yes
[...]

Debemos encontrar el archivo de configuración de Apache 2.4 para Munin /etc/munin/apache24.conf - define un alias llamado munin para el directorio de salida HTML de Munin /var/cache/munin/www lo que significa que podemos acceder a munin desde todos los sitios web en este servidor utilizando la ruta relativa /munin (por ejemplo, http://www.example.com/munin).

La configuración de apache Munin no está habilitada por defecto, esto ha cambiado de DebianWheezy a Jessie. El nuevo directorio de configuración es /etc/apache2/conf-enabled en lugar de /etc/apache2/conf.d que se usaba en versiones anteriores como Wheezy y Squeeze.

Ejecuta estos comandos para habilitar y cargar la configuración en apache.

cd /etc/apache2/conf-enabled/  
ln -s /etc/munin/apache24.conf munin.conf  
service apache2 restart

Asegúrate de comentar la línea Require local y agregar Require all granted y Options FollowSymLinks SymLinksIfOwnerMatch en su lugar (de lo contrario, solo podrás acceder a la salida de Munin desde localhost):

nano /etc/munin/apache24.conf
Alias /munin /var/cache/munin/www  
  
 # Require local  
 Require all granted  
 Options FollowSymLinks SymLinksIfOwnerMatch  
  
  
ScriptAlias /munin-cgi/munin-cgi-graph /usr/lib/munin/cgi/munin-cgi-graph  
  
 # Require local  
 Require all granted  
 Options FollowSymLinks SymLinksIfOwnerMatch  
   
 SetHandler fcgid-script  
   
   
 SetHandler cgi-script  
   

Reinicia Apache:

systemctl restart apache2.service

Luego reinicia Munin:

systemctl restart munin-node.service

Ahora espera unos minutos para que Munin pueda producir su primera salida, y luego ve a http://www.example.com/munin/ en tu navegador, y verás las primeras estadísticas:

Monitor de procesos de Munin

(Esto es solo un pequeño extracto de los muchos gráficos que munin produce…)

3 Proteger con Contraseña el Directorio de Salida de Munin (Opcional pero muy recomendado)

Ahora es una buena idea proteger con contraseña el directorio de salida de munin a menos que quieras que todos puedan ver cada pequeña estadística sobre tu servidor.

Para hacer esto, debemos crear el archivo de contraseña /etc/munin/munin-htpasswd. Queremos iniciar sesión con el nombre de usuario admin, así que hacemos esto:

htpasswd -c /etc/munin/munin-htpasswd admin

Ingresa una contraseña para admin. Luego abre /etc/munin/apache24.conf nuevamente…

nano /etc/munin/apache24.conf

… comenta “Require all granted” y agrega las líneas que marqué en rojo:

Alias /munin /var/cache/munin/www  
  
 # Require local  
 # Require all granted  
 AuthUserFile /etc/munin/munin-htpasswd  
 AuthName "Munin"  
 AuthType Basic  
 Require valid-user  
 Options None  
  
  
ScriptAlias /munin-cgi/munin-cgi-graph /usr/lib/munin/cgi/munin-cgi-graph  
  
 # Require local  
 # Require all granted  
 AuthUserFile /etc/munin/munin-htpasswd  
 AuthName "Munin"  
 AuthType Basic  
 Require valid-user  
   
 SetHandler fcgid-script  
   
   
 SetHandler cgi-script  
   

Luego reinicia Apache:

systemctl restart apache2.service

4 Habilitar módulos adicionales en Munin

El comando de Munin “munin-node-configure –suggest” se puede usar para obtener recomendaciones para módulos adicionales de Munin que se pueden habilitar en el servidor. Ejecuta:

munin-node-configure --suggest

La salida debería ser similar a esto:

Sugerencias de módulos adicionales de Munin

La columna “used” muestra si un módulo está habilitado, la columna “Suggestions” muestra si el servidor ejecuta un servicio que puede ser monitoreado por este módulo. Crea un enlace simbólico para el módulo en /etc/munin/plugins para habilitarlo.

Aquí habilitaré los módulos apache_* por ejemplo:

cd /etc/munin/plugins  
ln -s /usr/share/munin/plugins/apache_accesses  
ln -s /usr/share/munin/plugins/apache_processes  
ln -s /usr/share/munin/plugins/apache_volume

Reinicia Munin para cargar la nueva configuración.

systemctl restart munin-node.service

5 Instalar y Configurar Monit

Monit está disponible en el repositorio de backports de Debian Buster. Este repositorio no está habilitado por defecto, así que primero debemos agregarlo. Ejecuta este comando:

echo 'deb http://ftp.de.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/buster-backports.list

y luego actualiza las listas de paquetes con:

apt update

Para instalar Monit, hacemos esto:

apt install monit

Ahora debemos editar /etc/monit/monitrc. El /etc/monit/monitrc predeterminado tiene muchos ejemplos, y puedes encontrar más ejemplos de configuración en http://mmonit.com/monit/documentation/. Sin embargo, en mi caso quiero monitorear proftpd, sshd, mysql, apache y postfix, quiero habilitar la interfaz web de Monit en el puerto 2812, quiero una interfaz web https, quiero iniciar sesión en la interfaz web con el nombre de usuario admin y la contraseña howtoforge, y quiero que Monit envíe alertas por correo electrónico a root@localhost, así que mi archivo se ve así (he agregado ejemplos para otros demonios a la configuración para que puedas ajustar el archivo a tus necesidades):

cp /etc/monit/monitrc /etc/monit/monitrc_orig  
cat /dev/null > /etc/monit/monitrc  
nano /etc/monit/monitrc
set daemon 60  
set logfile syslog facility log_daemon  
set mailserver localhost  
set mail-format { from: [email protected] }  
set alert root@localhost  
set httpd port 2812 and  
 SSL ENABLE  
 PEMFILE /var/certs/monit.pem  
 allow admin:howtoforge  
  
check process sshd with pidfile /var/run/sshd.pid  
 start program "/usr/sbin/service ssh start"  
 stop program "/usr/sbin/service ssh stop"  
 if failed port 22 protocol ssh then restart  
 if 5 restarts within 5 cycles then timeout  
  
check process apache with pidfile /var/run/apache2/apache2.pid  
 group www  
 start program = "/usr/sbin/service apache2 start"  
 stop program = "/usr/sbin/service apache2 stop"  
 if failed host localhost port 80 protocol http  
 and request "/monit/token" then restart  
 if cpu is greater than 60% for 2 cycles then alert  
 if cpu > 80% for 5 cycles then restart  
 if totalmem > 500 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: Reemplaza example.pid con el nombre pid de tu servidor, el nombre depende del nombre de host  
# ---------------------------------------------------------------------------------------------  
#check process mysql with pidfile /var/lib/mysql/example.pid  
# group database  
# start program = "/usr/sbin/service mysql start"  
# stop program = "/usr/sbin/service mysql stop"  
# if failed host 127.0.0.1 port 3306 then restart  
# if 5 restarts within 5 cycles then timeout  
  
#check process proftpd with pidfile /var/run/proftpd.pid  
# start program = "/usr/sbin/service proftpd start"  
# stop program = "/usr/sbin/service proftpd stop"  
# if failed port 21 protocol ftp then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process postfix with pidfile /var/spool/postfix/pid/master.pid  
# group mail  
# start program = "/usr/sbin/service postfix start"  
# stop program = "/usr/sbin/service postfix stop"  
# if failed port 25 protocol smtp then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process nginx with pidfile /var/run/nginx.pid  
# start program = "/usr/sbin/service nginx start"  
# stop program = "/usr/sbin/service nginx stop"  
# if failed host 127.0.0.1 port 80 then restart  
#  
#check process memcached with pidfile /var/run/memcached.pid  
# start program = "/usr/sbin/service memcached start"  
# stop program = "/usr/sbin/service memcached stop"  
# if failed host 127.0.0.1 port 11211 then restart  
#  
#check process pureftpd with pidfile /var/run/pure-ftpd/pure-ftpd.pid  
# start program = "/usr/sbin/service pure-ftpd-mysql start"  
# stop program = "/usr/sbin/service pure-ftpd-mysql stop"  
# if failed port 21 protocol ftp then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process named with pidfile /var/run/named/named.pid  
# start program = "/usr/sbin/service bind9 start"  
# stop program = "/usr/sbin/service bind9 stop"  
# if failed host 127.0.0.1 port 53 type tcp protocol dns then restart  
# if failed host 127.0.0.1 port 53 type udp protocol dns then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process ntpd with pidfile /var/run/ntpd.pid  
# start program = "/usr/sbin/service ntp start"  
# stop program = "/usr/sbin/service ntp stop"  
# if failed host 127.0.0.1 port 123 type udp then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process mailman with pidfile /var/run/mailman/mailman.pid  
# group mail  
# start program = "/usr/sbin/service mailman start"  
# stop program = "/usr/sbin/service mailman stop"  
#  
#check process amavisd with pidfile /var/run/amavis/amavisd.pid  
# group mail  
# start program = "/usr/sbin/service amavis start"  
# stop program = "/usr/sbin/service amavis stop"  
# if failed port 10024 protocol smtp then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process courier-imap with pidfile /var/run/courier/imapd.pid  
# group mail  
# start program = "/usr/sbin/service courier-imap start"  
# stop program = "/usr/sbin/service courier-imap stop"  
# if failed localhost port 143 type tcp protocol imap then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process courier-imap-ssl with pidfile /var/run/courier/imapd-ssl.pid  
# group mail  
# start program = "/usr/sbin/service courier-imap-ssl start"  
# stop program = "/usr/sbin/service courier-imap-ssl stop"  
# if failed localhost port 993 type tcpssl sslauto protocol imap then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process courier-pop3 with pidfile /var/run/courier/pop3d.pid  
# group mail  
# start program = "/usr/sbin/service courier-pop start"  
# stop program = "/usr/sbin/service courier-pop stop"  
# if failed localhost port 110 type tcp protocol pop then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process courier-pop3-ssl with pidfile /var/run/courier/pop3d-ssl.pid  
# group mail  
# start program = "/usr/sbin/service courier-pop-ssl start"  
# stop program = "/usr/sbin/service courier-pop-ssl stop"  
# if failed localhost port 995 type tcpssl sslauto protocol pop then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process dovecot with pidfile /var/run/dovecot/master.pid  
# group mail  
# start program = "/usr/sbin/service dovecot start"  
# stop program = "/usr/sbin/service dovecot stop"  
# if failed localhost port 993 type tcpssl sslauto protocol imap then restart  
# if 5 restarts within 5 cycles then timeout

El archivo de configuración es bastante autoexplicativo; si no estás seguro sobre una opción, echa un vistazo a la documentación de Monit: http://mmonit.com/monit/documentation/monit.html

En la parte de apache de la configuración de Monit encuentras esto:

   if failed host localhost port 80 protocol http
      and request "/monit/token" then restart

lo que significa que Monit intenta conectarse a localhost en el puerto 80 y trata de acceder al archivo /monit/token que es /var/www/html/monit/token porque la raíz del documento de nuestro sitio web es /var/www/html. Si Monit no tiene éxito, significa que Apache no está en funcionamiento, y Monit va a reiniciarlo. Ahora debemos crear el archivo /var/www/html/monit/token y escribir alguna cadena aleatoria en él:

mkdir /var/www/html/monit  
echo "hello" > /var/www/html/monit/token

A continuación, creamos el certificado pem (/var/certs/monit.pem) que necesitamos para la interfaz web de Monit cifrada con SSL:

mkdir /var/certs  
cd /var/certs

Necesitamos un archivo de configuración de OpenSSL para crear nuestro certificado. Puede verse así:

nano /var/certs/monit.cnf
# crear certificados RSA - Servidor

[ req ]
default_bits = 2048
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type

[ req_dn ]
countryName = Nombre del País (código de 2 letras)
countryName_default = MO

stateOrProvinceName             = Nombre del Estado o Provincia (nombre completo)
stateOrProvinceName_default     = Monitoria

localityName                    = Nombre de la Localidad (por ejemplo, ciudad)
localityName_default            = Monittown

organizationName                = Nombre de la Organización (por ejemplo, empresa)
organizationName_default        = Monit Inc.

organizationalUnitName          = Nombre de la Unidad Organizacional (por ejemplo, sección)
organizationalUnitName_default  = Dept. de Tecnologías de Monitoreo

commonName                      = Nombre Común (FQDN de tu servidor)
commonName_default              = server.monit.mo

emailAddress                    = Dirección de Correo Electrónico
emailAddress_default            = [email protected]

[ cert_type ]
nsCertType = server

Ahora creamos el certificado de esta manera:

openssl req -new -x509 -days 365 -nodes -config ./monit.cnf -out /var/certs/monit.pem -keyout /var/certs/monit.pem
openssl dhparam 2048 >> /var/certs/monit.pem
openssl x509 -subject -dates -fingerprint -noout -in /var/certs/monit.pem
chmod 600 /var/certs/monit.pem

Finalmente, podemos iniciar Monit:

service monit restart

Ahora apunta tu navegador a https://www.example.com:2812/ (asegúrate de que el puerto 2812 no esté bloqueado por tu firewall), inicia sesión con admin y howtoforge, y deberías ver la interfaz web de Monit. Debería verse así:

Administrador de Servicios Monit en Debian

(Pantalla Principal)

Estado del proceso SSH

Estado del proceso Apache

(Página de Estado de SSHd)

Dependiendo de tu configuración en /etc/monit/monitrc, monit reiniciará tus servicios si fallan y enviará correos electrónicos de notificación si los IDs de proceso de los servicios cambian, etc.

Para obtener el estado de Monit en la shell, ejecuta el comando “monit status”:

monit status

El comando mostrará el estado de todos los servicios monitoreados.

Estado de Monit en la línea de comandos

6 Enlaces

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.