En todo servidor web es muy importante tener monitorizados todos los servicios (http, MySQL, POP, SMTP, ftp, sshd,..) , para ello hoy vamos a ver como se instala y se configura Monit un software muy completo para monitorizar servicios, ya sea de forma local como remota de cualquier sistema Unix.
¿Qué es Monit?
Monit es una utilidad gratuita y Open Source para administrar y monitorear procesos, archivos, directorios y filesystems en un sistema Unix. Realiza tareas automáticas de mantenimiento y reparación y puede ejecutar acciones significativas durante situaciones de error.
Para más información, se puede consultar el sitio oficial de Monit y su manual online (ambos en inglés).
Instalación
La instalación de Monit es muy sencilla.
cd /usr/src
wget http://mmonit.com/monit/dist/monit-5.1.1.tar.gz
tar zxvf monit-5.1.1.tar.gz
cd monit-5.1.1
./configure --prefix=/usr
make && make install
Si estamos instalando Monit en CentOS o algún Linux similar, vamos a querer copiar el archivo rc.
cp contrib/rc.monit /etc/init.d/monit
chown root:root /etc/init.d/monit
chmod 755 /etc/init.d/monit
chkconfig --add monit
chkconfig monit on
Configuración
Una vez instalado podemos pasar a la configuración, que será lo más importante del proceso. Para ello vamos a crear un archivo inicial /etc/monitrc que posee la configuración general del Monit, y luego dentro de una carpeta /etc/monit creo un archivo por cada servicio que quiero monitorear.
Les dejo aquí mi configuración.
Archivo: /etc/monitrc
set daemon 120
set logfile syslog facility log_daemon
set mailserver localhost
set alert administrator@domain.com # receive all alert
set alert anotheradmin@domain2.com
set httpd port 2812 and
use address localhost # only accept connection from localhost
allow localhost # allow localhost to connect to the server and
# allow admin:monit # require user 'admin' with password 'monit'
#
#
###################################################################
## Services
###################################################################
##
## Check general system resources such as load average, cpu and memory
## usage. Each test specifies a resource, conditions and the action to be
## performed should a test fail.
#
check system fqdn.domain.com
if loadavg (1min) > 5 then alert
if loadavg (5min) > 10 then alert
if loadavg (1min) > 20 then exec "/bin/bash /root/handle_high_load.sh"
if memory usage > 75% then alert
if cpu usage (user) > 70% for 3 cycles then alert
if cpu usage (system) > 30% for 3 cycles then alert
if cpu usage (wait) > 20% for 3 cycles then alert
include /etc/monit/*.monitrc
A continuación vamos a explicar el contenido de este fichero de configuración. El daemon va a revisar cada 120 segundos los servicios, va a loguear en Syslog y va enviar mails usando el mailserver local. Cuando haya alguna alerta, la enviará a administrador@domain.com y anotheradmin@domain2.com. Luego habilito el servicio web que ofrece monit para que escuche en la IP local (esto es para poder utilizar todas las opciones del comando `monit`). Por último defino las reglas para el chequeo del sistema, cuyo FQDN es fqdn.domain.com (hostname de su servidor). Las reglas son bastante sencillas. En algunos casos lo que hago es enviar una alerta y si el loadavg es más de 20 ejecuto un script para controlarlo.
La última línea incluye todos los archivos *.monit del directorio /etc/monit. Que es lo que vamos a ver ahora.
Archivo: /etc/monit/httpd.monitrc en el que vamos a monitorizar el servidor apache
#
# Monitor Apache (httpd)
#
check process httpd with pidfile /usr/local/apache/logs/httpd.pid
start program = "/etc/init.d/httpd start"
stop program = "/etc/init.d/httpd stop"
if cpu > 80% for 3 cycles then alert
if totalmem > 1500.0 MB for 5 cycles then alert
if children > 250 then alert
if children > 255 for 5 cycles then stop
if cpu usage > 95% for 3 cycles then restart
if failed port 80 protocol http then restart
check file httpd.conf with path /usr/local/apache/conf/httpd.conf
if changed checksum then alert
En este fichero defino un proceso de nombre “httpd” con un pidfile que en nuestro caso es /usr/local/apache/logs/httpd.pid , en algunos otros casos puede ser /var/run/httpd.pid. Luego defino los comandos para iniciar y detener el proceso. Y luego las acciones a realizar según el evento. En el caso “alert” (enviar aviso por mail), en otros “restart” (reinicar el proceso). Hay otras opciones que podrán ver en la documentación. Por último agrego una verificación del archivo httpd.conf. Si se modifica me notificará por mail.
Monitorizamos el servicio de correo, en nuestro caso exim, para ello creamos el fichero /etc/monit/exim.monitrc con la siguiente configuración:
check process exim with pidfile /var/spool/exim/exim-daemon.pid
start program = "/etc/init.d/exim start"
stop program = "/etc/init.d/exim stop"
if failed host 127.0.0.1 port 25 protocol smtp then alert
if 5 restarts within 5 cycles then timeout
Monitorizamos el servicio ftp, en nuestro caso pure-ftpd, para ello creamos el fichero /etc/monit/ftp.monitrc con la siguiente configuración:
check process ftp with pidfile /var/run/pure-ftpd.pid
start program = "/etc/init.d/pure-ftpd start"
stop program = "/etc/init.d/pure-ftpd stop"
if failed host 127.0.0.1 port 21 protocol ftp then alert
if 5 restarts within 5 cycles then timeout
Monitororizamos servicio Imap, en nuestro caso courier-imap, para ello creamos el siguiente fichero de configuración /etc/monit/imap.monitrc con las siguientes líneas:
check process imap with pidfile /var/run/imap.pid
start program = "/etc/init.d/courier-imap start"
stop program = "/etc/init.d/courier-imap stop"
if failed host 127.0.0.1 port 143 protocol imap then alert
if 5 restarts within 5 cycles then timeout
Monitorizamos servicio MySQL, para ello creamos el fichero de configuración /etc/monit/mysql.monitrc con las siguientes líneas:
check process mysql with pidfile /var/lib/mysql/javierandres.es.pid
group database
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 5 restarts within 5 cycles then timeout
Iniciando Monit
Una vez que tenemos la configuración, ya podemos probarlo. Para ello iniciaremos el servicio, veremos si se inicia correctamente en el log y veremos el status.
Iniciamos:
service monit start
Luego vemos en syslog:
monit[24820]: Starting monit daemon with http interface at [localhost:2812]
monit[24822]: Starting monit HTTP server at [localhost:2812]
monit[24822]: monit HTTP server started
monit[24822]: 'fqdn.domain.com' Monit started
Para observar la monitorización en el interfaz web tienes que insertar en el navegador la siguiente ruta:
http://localhost:2812