Tag Archives: Unix

Instalar Monit: monitoreo de servicios para servidores Unix

MonitHoy voy a explicar cómo instalar Monit, un software muy completo para monitoreo de servicios (locales y remotos) de cualquier sistema Unix. Con él podremos estar atentos ante posibles problemas en alguno de nuestros servidores y realizar algunas tareas automaticamente.

¿Qué es Monit?

De acuerdo con su propia definición, 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.

Está desarrollado en C (pueden ver el código fuente en Google Code) y su demonio corre de manera casi imperceptible para el sistema, en tanto consume muy pocos recursos.

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

Luego, si estamos instalando 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 yo suelo crear un archivo inicial /etc/monitrc que tiene 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

Algunas cosas para anotar de esta primera parte. 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 (acá iría el 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

#
# Monitor Apache (httpd)
#
check process httpd with pidfile /var/run/httpd.pid
    start program = "/sbin/service httpd start"
    stop program  = "/sbin/service 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 /etc/httpd/conf/httpd.conf
    if changed checksum then alert

Aquí defino un proceso de nombre “httpd” con un pidfile en /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 algunos casos será “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.

De la misma forma, en el directorio /etc/monit tengo archivos similares para MySQL, SMTP, POP3, IMAP, SSH, etc. Y además tengo archivos para controlar algunos servicios externos. Esto es por una cuestión básica: hasta ahora estamos haciendo todos chequeos locales, si el servidor se cae o por alguna razón no puede enviarme las alertas, podría nunca enterarme de qué pasa. Entonces voy a agregar este otro archivo para controlar un servidor externo que me diga si los servicios están accesibles.

Archivo: server1.monitrc

# server1.domain.com check
check host server1.domain.com with address 1.2.3.4
      if failed icmp type echo count 10 with timeout 15 seconds
         then alert
      if failed port 21 proto ftp then alert
      if failed port 25 proto smtp then alert
      if failed port 80 proto http then alert
      if failed port 110 proto pop then alert

Aquí estoy monitreando el servidor server1.domain.com con IP 1.2.3.4 (este archivo debería estar en otro servidor con Monit, por ejemplo, servidor2.domain.com). Lo primero que intento es hacer un Echo ICMP. Lamentablemente Monit no soporta hacer ping, pero un echo ICMP es lo más cercano que nos permite. Si falla 10 veces seguidas, le pido que me avise (la cantidad de veces tan alta es para asegurarme de no recibir una alerta por un paquete perdido y llenar mi mail de alertas inútiles que no me permitan ver las importantes). Luego agrego que testee los principales puertos a través de los protocolos correspondientes y que si falla me avise.

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:

Apr  4 11:35:23 fqdn monit[24820]: Starting monit daemon with http interface at [localhost:2812]
Apr  4 11:35:23 fqdn monit[24822]: Starting monit HTTP server at [localhost:2812]
Apr  4 11:35:23 fqdn monit[24822]: monit HTTP server started
Apr  4 11:35:23 fqdn monit[24822]: 'fqdn.domain.com' Monit started

Monit inició y tiene su servidor HTTP escuchando en localhost:2812. Ahora veamos el resumen del status de los servicios.

# monit status
The Monit daemon 5.0.3 uptime: 1m 

System 'fqdn.domain.com' running
Process 'sshd'                      running
File 'sshd_config'                  accessible
Process 'exim'                      running
File 'exim.conf'                    accessible
Process 'mysqld'                    running
File 'my.cnf'                       accessible
Process 'httpd'                     running
File 'httpd.conf'                   accessible
Remote Host 'fqdn.domain.com' online with all services

Para ver los comandos disponibles:

# monit -h

Al mismo tipo de información podremos acceder por vía web si accedemos a http://localhost:2812. También, si queremos acceder desde afuera, podemos configurar Monit para que escuche en otra IP (por ejemplo, 0.0.0.0) y definir un método de autenticación (para que no pueda acceder cualquiera).

El viernes será la fecha UNIX 1234567890

UNIX

UNIX

Como salió en Slashdot el día Viernes 13 de Febrero a las 23:31:30 UTC será  el momento en que el UNIX Time llegue al número 1234567890.

Como sabrán el UNIX Time (POSIX Time o UNIX epoch) es un sistema para describir fechas que utilizan todos los sistemas UNIX, sus derivados y otros, que consiste en representarlas a partir de la cantidad de segundos transcurridos desde el 1 de Enero de 1970 UTC sin contar los segundos intercalares. Una de las grandes ventajas que tiene este sistema, y que cualquiera que haya programado algo alguna vez en su vida seguramente conozca, es que permite comparar fechas sencillamente.

El problema que tiene es que en los sistemas UNIX de 32 bits la fecha del sistema se almacena en un entero con signo de 32 bits, lo cual implica que el límite superior correspondería a las 03:14:07 UTC del Martes 19 de Enero de 2038. En los sistemas de 64 bits la fecha ya se almacena en enteros de 64 bits, con lo cual según Alan Cox el reinicio del UNIX epoch llegará después de que se haya apagado el sol jeje.

Estándar de jerarquía del sistema de archivos en Unix (FHS)

GNU/Linux

GNU/Linux

Para cualquiera de nosotros que empezamos a aprender computación cuando Microsoft ya dominaba el mercado y que conocimos las maravillas de Unix de grandes, la jerarquía del sistema de archivos puede resultar bastante confusa al principio. Además, los usuarios de Linux sabemos que, por lo general, cada distribución (o por lo menos cada familia de distribuciones), mete las cosas donde más le gusta.

Es interesante darle una mirada al FHS (Filesystem Hierarchy Standard), un estándar desarrollado por iniciativa de Linux, el cual otros SOs Unix suelen ignorar, pero que intenta una definición de los distintos directorios principales de un filesystem. Dejo el siguiente cuadro tomado de la versión en español del mismo artículo.

Directorio Descripción Simple
/ Jerarquía primaria, la raíz o root, y directorio raíz del sistema de jerarquía completo.
/bin/ Comandos y programas binarios esenciales necesarios para que estén disponibles para una sesión de usuario único, o para todos los usuarios (multiusuario), por ejemplo, cat, ls, cp, rm, mk, etc.).
/boot/ Archivos cargadores de arranque (por ejemplo, los núcleos, el initrd). A menudo en una partición separada.
/dev/ Contiene los Dispositivos esenciales (por ejemplo, /dev/null), incluso los que no se les ha asignado (montado) un directorio. Contiene también dispositivos que no sirven de almacenamiento (p.e. terminales de sonido y vídeo, micrófonos, impresoras, etc).
/etc/ Contiene archivos de configuración del sistema específicos del Host de todo el sistema. El nombre proviene de “etcétera”).
/etc/opt/
Archivos de configuración para los programas alojados dentro del directorio /opt.
/etc/X11/
Archivos de configuración para el X Window System, versión 11.
/etc/sgml/
Archivos de configuración para SGML.
/etc/xml/
Archivos de configuración para XML.
/home/ Contiene los directorios de los usuarios, home de los usuarios, excepto del superusuario administrador (root); contiene archivos guardados, ajustes personales, etc. Ofrece. A menudo en una partición separada.Si existe más de un usuario de un computador/ordenador o servidor, por ejemplo los usuarios usuario1 y usuario2, estos poseerían los directorios /home/usuario1 y /home/usuario2, respectivamente.
/lib/ Contiene todas las bibliotecas (mal traducidas como librerías) esenciales compartidas de los programas alojados, es decir, para los binarios en /bin/ y /sbin/. Contiene también las bibliotecas para el núcleo.
/media/ Contiene los puntos de montaje de los medio removibles de almacenamiento, tales como lectores de CD-ROM (aparecido en la versión 2.3 de FHS), Pendrives (memoria USB), e incluso sirve para montar otras particiones del mismo disco duro, por ejemplo alguna partición desde otro sistema operativo.
/mnt/ Sistema de archivos montados temporalmente. Es una directorio semejante a /media, pero es usada mayormente por los usuarios. Sirve para montar discos duros y particiones de forma temporal en el sistema.
/opt/ Contiene Paquetes de programas opcionales de aplicaciones estáticas, es decir, que pueden ser compartidas por los usuarios. Estas aplicaciones, utilizan el directorio de usuario para guardas sus configuraciones, y de esta forma, cada usuario puede tener una configuración diferente, de la misma aplicación.
/proc/ Contiene principalmente archivos de texto, sistema de archivos virtuales que documentan al núcleo y el estado de los procesos como archivos de texto (por ejemplo, uptime, network).
/root/ Directorio raíz del usuario root.
/sbin/ Sistema de binarios esencial, comandos y programas exclusivos del superusuario (root), por ejemplo, init, route, ifup).
/srv/ Lugar específico de datos, los cuales son servidos por el sistema.
/tmp/ Archivos temporales (véase también /var/tmp).
/usr/ jerarquía secundaria de los datos de usuario; contiene la mayoría de las utilidades y aplicaciones multiusuario. En otras palabras, contiene los archivos compartidos de solo lectura. Este directorio puede incluso se compartido con otras computadoras.
/usr/bin/
Comandos binarios no esenciales (no necesarios en el modo de usuario único); para todos los usuarios.
/usr/include/
Archivos de cabecera (Header files o Include files), es decir, archivos de inclusión estándar
/usr/lib/
bibliotecas compartidas de los binarios en /usr/bin/ y /usr/sbin/.
/usr/sbin/
Sistema de binarios no esencial (por ejemplo demonios para varios servicios de red.
/usr/share/
Arquitectura independiende, compartida de datos. En otras palabras, contiene los datos compartidos que no dependen de la arquitectura del sistema. Esto puede incluir imágenes, sonidos, etc., para la disponibilidad en el sistema.
/usr/src/
Códigos fuente, por ejemplo, el código fuente (es decir, programas y bibliotecas sin compilar) del núcleo con sus archivos de cabecera, (Header files o Include files).
/usr/X11R6/
Sistema X Window System, Versión 11, Release 6.
/usr/local/
Jerarquía terciaria para los datos locales, específicos a este host. Usualmente tiene subdirectorios, por ejemplo bin/, lib/, share/, de datos compartidos de sólo lectura específicos del ordenador o servidor que los comparte.
/var/ Archivos variables, tales como logs, archivos spool, bases de datos, archivos de e-mail temporales, y archivos temporales en general.
/var/cache/
Cache de las aplicaciones.
/var/crash/
Se depositan datos e información, referentes a las caídas o errores del sistema operativo.
/var/games/
Datos variables de los juegos del sistema. Este directorio no es imprescindible.
/var/lock/
Archivos Lock. Archivos que hacen el seguimiento de los recursos que se utilizan actualmente.
/var/log/
Archivos de registro, Log. Varios registros, logs.
/var/mail/
Buzón correos o mensajes de los usuarios.
/var/opt/
Posee los datos variables de /opt.
/var/run/
Información acerca del funcionamiento del sistema desde el último arranque. Por ejemplo, los usuarios actualmente registrados o logueados, que han ingresado; y los demonios que están corriendo.
/var/spool/
Bobinas o carretes (Spool), de tareas a la espera de ser procesados (por ejemplo, colas de impresión y correo no leído).
/var/spool/mail/
Ubicación de los correos de usuario desaprobados.
/var/tmp/
Archivos temporales que, a diferencia de /tmp, no se borran entre sesiones o reinicios del sistema.