Supervisión de servidores con Munin y Monit en Debian

Monitor de proceso Munin

En este artículo, describo cómo puede monitorear su servidor Debian 10 (Buster) con Munin y Monit. Munin genera pequeños gráficos ingeniosos sobre casi todos los aspectos de su 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 está comportando como se esperaba. La combinación de los dos le brinda un monitoreo completo: gráficos que le permiten ver los problemas actuales o inminentes (por ejemplo, «Necesitamos un servidor más grande pronto, nuestro promedio de carga está aumentando rápidamente») y un perro guardián que garantiza la disponibilidad de los servicios monitoreados.

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

Esta guía se escribió 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 de este tutorial se ejecutan como usuario root. Inicie sesión en su servidor como root por SSH o abra una ventana de terminal. Si inicia sesión como un usuario diferente al root, use el comando

su -

para convertirse en el usuario raíz, antes de continuar.

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

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

apt update
apt upgrade

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

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

Habilite 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 ejecuta MySQL o MariaDB, habilite algunos complementos 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. Quite los comentarios de 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 host simple. Sin los comentarios, el archivo modificado se ve así:

nano /etc/munin/munin.conf
# Example configuration file for Munin, generated by 'make build'

# The next three variables specifies where the location of the RRD
# databases, the HTML output, logs and the lock/pid files. They all
# must be writable by the user running munin-cron. They are all
# defaulted to the values you see here.
#
dbdir /var/lib/munin
htmldir /var/cache/munin/www
logdir /var/log/munin
rundir /var/run/munin

# Where to look for the HTML templates
#
tmpldir /etc/munin/templates

# Where to look for the static www files
#
#staticdir /etc/munin/static

# temporary cgi files are here. note that it has to be writable by
# the cgi user (usually nobody or httpd).
#
# cgitmpdir /var/lib/munin/cgi-tmp # (Exactly one) directory to include all files from. includedir /etc/munin/munin-conf.d […] # a simple host tree
[server1.example.com]
address 127.0.0.1
use_node_name yes […]


Deberíamos 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 de forma predeterminada, se 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.

Ejecute 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úrese de comentar la línea Requerir local y agregar Requerir todo otorgado y Opciones SeguirSymLinks SymLinksIfOwnerMatch en su lugar (de lo contrario, solo podrá acceder a la salida de Munin desde localhost):

nano /etc/munin/apache24.conf
Alias /munin /var/cache/munin/www
<Directory /var/cache/munin/www>
# Require local
Require all granted
 Options FollowSymLinks SymLinksIfOwnerMatch
</Directory>

ScriptAlias /munin-cgi/munin-cgi-graph /usr/lib/munin/cgi/munin-cgi-graph
<Location /munin-cgi/munin-cgi-graph>
# Require local
Require all granted
Options FollowSymLinks SymLinksIfOwnerMatch
<IfModule mod_fcgid.c>
SetHandler fcgid-script
</IfModule>
<IfModule !mod_fcgid.c>
SetHandler cgi-script
</IfModule>
</Location>


Reinicie Apache:

systemctl restart apache2.service

Luego reinicie Munin:

systemctl restart munin-node.service

Ahora espere unos minutos para que Munin pueda generar su primera salida y luego vaya a http://www.example.com/munin/ en su navegador y verá las primeras estadísticas:

Monitor de proceso Munin

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

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

Para ello, debemos crear el archivo de contraseñas /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

Ingrese una contraseña para el administrador. Luego abra /etc/munin/apache24.conf nuevamente…

nano /etc/munin/apache24.conf

… comentar «Requerir todo concedido y agregar las líneas que marqué en rojo:

Alias /munin /var/cache/munin/www
<Directory /var/cache/munin/www>
# Require local
# Require all granted
 AuthUserFile /etc/munin/munin-htpasswd
AuthName "Munin"
AuthType Basic
Require valid-user
Options None
</Directory>

ScriptAlias /munin-cgi/munin-cgi-graph /usr/lib/munin/cgi/munin-cgi-graph
<Location /munin-cgi/munin-cgi-graph>
# Require local
# Require all granted
AuthUserFile /etc/munin/munin-htpasswd
AuthName «Munin»
AuthType Basic
Require valid-user
<IfModule mod_fcgid.c>
SetHandler fcgid-script
</IfModule>
<IfModule !mod_fcgid.c>
SetHandler cgi-script
</IfModule>
</Location>


Luego reinicie Apache:

systemctl restart apache2.service

4 Habilitar módulos adicionales en Munin

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

munin-node-configure --suggest

La salida debe ser similar a esto:

Sugerencias de módulos adicionales de Munin

La columna «usado» muestra si un módulo está habilitado, la columna «Sugerencias» muestra si el servidor ejecuta un servicio que puede ser monitoreado por este módulo. Cree 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

Reinicie 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 de forma predeterminada, por lo que debemos agregarlo primero. Ejecute este comando:

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

y luego actualice 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 puede encontrar más ejemplos de configuración en http://mmonit.com/monit/documentación/. 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 [email protected]por lo que mi archivo se ve así (he agregado ejemplos de otros demonios a la configuración para que pueda ajustar el archivo a sus 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 [email protected]
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

# ———————————————————————————————
# NOTE: Replace example.pid with the pid name of your server, the name depends on the hostname
# ———————————————————————————————
#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 host 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 host 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 host 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 host 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 host 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á seguro acerca de una opción, eche 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 e intenta 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 se está ejecutando y Monit lo reiniciará. Ahora debemos crear el archivo /var/www/html/monit/token y escribir una 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 con cifrado 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
# create RSA certs - Server

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

[ req_dn ]
countryName = Country Name (2 letter code)
countryName_default = MO

stateOrProvinceName             = State or Province Name (full name)
stateOrProvinceName_default     = Monitoria

localityName                    = Locality Name (eg, city)
localityName_default            = Monittown

organizationName                = Organization Name (eg, company)
organizationName_default        = Monit Inc.

organizationalUnitName          = Organizational Unit Name (eg, section)
organizationalUnitName_default  = Dept. of Monitoring Technologies

commonName                      = Common Name (FQDN of your server)
commonName_default              = server.monit.mo

emailAddress                    = Email Address
emailAddress_default            = [email protected]

[ cert_type ]
nsCertType = server

Ahora creamos el certificado así:

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 apunte su navegador a https://www.example.com:2812/ (asegúrese de que su firewall no bloquee el puerto 2812), inicie sesión con admin y howtoforge, y debería ver la interfaz web de Monit. Debe tener un aspecto como este:

Administrador de servicios de Monit en Debian

(Pantalla principal)

Estado del proceso SSH

Estado del proceso Apache

(Página de estado de SSHd)

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

Para obtener el estado de Monit en el shell, ejecute el comando «monit status»:

monit status

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

Supervisar el estado en la línea de comando

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *