Ya he mencionado que mi servidor es un VPS contratado con time4vps. Llevo utilizando VPS desde hace ya casi 3 años. Antes nunca me había planteado gestionar mi propio servidor, dada la comodidad relativa de un hosting compartido. Eso fue hasta que comencé a utilizar mi servidor para el trabajo, desarrollando proyectos para terceros, lo cual me ha llevado a tener que lidiar con los soportes técnicos.
En un hosting compartido, es a veces muy complicado conseguir que te instalen una extensión de PHP (ImageMagick, intl, etc), modifiquen alguna configuración de apache o mucho menos actualizar la versión de PHP. Por no hablar, de su política en caso de detección de virus en tu servidor que es cerrar todo y dejarte el marrón a ti. Banear tu ip cuando subes un archivo que ellos consideran malicioso cuando es un simple plugin de WordPress o estás desarrollando y has tenido demasiados errores 404 o 500 en un breve lapso de tiempo (¡Hola RedCoruna!). En otros casos es sencillamente imposible subir una web por ftp o descargártela porque no soporta más de una conexión al mismo tiempo, por sus continuas caídas y cortes de conexión (¡Hola 1&1, Dinahosting, …!). La lista de problemas en un hosting compartido normal es larga cuando te pones a desarrollar más o menos en serio.
Un hosting compartido puede ser suficiente para la mayoría de las personas pero para desarrollar suele dar demasiados quebraderos de cabeza. Decidí finalmente hacerme con un VPS en OVH primero y finalmente en time4vps.
Lo primero que eché de menos fue lo fácil que era crear cuentas de correo en un hosting compartido. Configuras el dominio, creas una cuenta de correo en cpanel o el panel de control instalado y a trabajar. En un VPS, no tenía ni idea de cómo configurar postfix, amavis, … Estos nombres me sonaban pero nunca había trabajado con ellos. Sin duda, es lo que me pareció más complicado de configurar el VPS. Aún, a día de hoy, creo que no tengo del todo claro como está funcionando. ISPConfig 3 me facilitó mucho la vida y es un buen panel de control.
Problemas con el correo
El problema recurrente que me he encontrado en OVH es que más o menos una vez a la semana me dejaban de llegar los correos. La verdad es que todavía no sé porque ocurría y en ese momento, no tenía mucho tiempo que dedicar a indagar sobre estos problemas, así que cada vez que ocurría lo único que hacía era volver a arrancar el servicio amavis. La culpa solía ser siempre del proceso amavis que se había parado y los correos quedaban indefinidamente en la cola.
Cansado de OVH por este tema y algunos problemas con el soporte técnico, decidí mudarme a time4vps. El VPS era muy económico así que decidí probar suerte. Ya llevo más de un año en este hosting, estoy muy satisfecho con su rendimiento en general pero tengo que reconocer que sigo teniendo problemas con el correo ocasionalmente.
El problema no es tener que arrancar el servicio cada x semanas. El problema es que cuando me doy cuenta de que no me llegan los correos, el servicio lleva parado 2 o 3 días y tengo casi 30 emails en la cola. Es la desventaja de trabajar con dos emails diferentes al mismo tiempo.
Necesitaba una herramienta de monitorización que no sólo me enviara un aviso cuando el servicio fallara sino también que reiniciara el servicio si es posible. Además, necesitaba que esta herramienta fuera gratis o al menos de bajo coste. Mi bolsillo no está todavía para muchas alegrías.
Monit
Descubrí Monit hace ya meses cuando me puse a buscar esa herramienta de monitorización, pero al principio me echó para atrás. La verdad es que al ver la documentación y el archivo de configuración de ejemplo, me di cuenta que parecía como si estuviera programando. En ese momento, buscaba algo con una interfaz gráfica… siendo sincero, me daba mucha pereza ponerme con ello y lo he dejado de lado.
Volviendo unos meses después, y siguiendo este tutorial, acabé instalando y configurando Monit.
Instalar Monit
1 |
apt-get install monit |
El archivo de configuración está en la ruta «/etc/monit/monitrc». Te recomiendo su lectura, este archivo viene con muchos comentarios e información.
Configurar Monit
Os dejo como muestra mi archivo de configuración con comentarios:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
set daemon 180 # Ejecutar cada 180 segundos, 3 minutos. with start delay 240 # Primera ejecución después de 4 minutos. set logfile syslog facility log_daemon # Configurar el log de Monit. set mailserver smtp.server.com, # Servidor de correo primario. localhost # Servidor de correo secundario por si falla el primario. set mail-format { from: monit@$HOST } # Cambio en la configuración de la alerta por email. # Cambio el from. set alert root@localhost not on { instance, action } # Enviar alertas cuando no son acciones ejecutadas # por el usuario o de arranque y parada. set httpd port 2222 admin # Configurar acceso web. SSL ENABLE # Por https PEMFILE /var/certs/monit.pem # Localización del certificado. allow admin:password # Usuario y contraseña. # Monitorizar máquina. check system server.com if loadavg (1min) > 4 for 2 cycles then alert # Carga del sistema. if loadavg (5min) > 2 for 2 cycles then alert # Carga del sistema. if memory usage > 75% for 2 cycles then alert # Utilización de memoria. if swap usage > 25% for 2 cycles then alert # Utilización de swap. if cpu usage (user) > 70% for 2 cycles then alert # Utilización CPU por el usuario. if cpu usage (system) > 50% for 2 cycles then alert # Utilización de CPU por el sistema. if cpu usage (wait) > 20% for 2 cycles then alert # Utilización de CPU en espera. check filesystem rootfs with path / # Monitoriza espacio libre en disco. if space usage > 90% then alert include /etc/monit/conf.d/* # Archivos incluidos. |
A continuación, os pongo el contenido de cada archivo que existe en la carpeta conf.d:
amavis.conf
1 2 3 4 5 6 7 8 9 10 11 12 |
check process amavisd with pidfile /var/run/amavis/amavisd.pid group mail group amavis start program = "/etc/init.d/amavis start" with timeout 60 seconds stop program = "/etc/init.d/amavis stop" if failed port 10024 protocol smtp then restart depends on amavis_rc check file amavis_rc with path /etc/init.d/amavis group mail group amavis include /etc/templates/rootbin |
Aquí indico a monit que revise si el proceso «amavisd» está ejecutándose, si el protocolo smtp no está en el puerto 10024, le indico que intente reiniciar el proceso.
apache2.conf
1 2 3 4 5 6 7 8 9 10 11 |
check process apache with pidfile /var/run/apache2/apache2.pid group apache start program = "/etc/init.d/apache2 start" with timeout 60 seconds stop program = "/etc/init.d/apache2 stop" if failed port 80 protocol http and request "/monit/token" for 2 cycles then restart if 3 restarts within 5 cycles then timeout depends on apache_rc check file apache_rc with path /etc/init.d/apache2 group apache include /etc/monit/templates/rootbin |
En este archivo, compruebo que el puerto 80 response al protocolo http y que /monit/token es accesible. Si falla durante 2 ciclos consecutivos, reinicio apache. Si de los últimos 5 ciclos, hay 3 reinicios entonces dejo de monitorizar este proceso.
clamav.conf
1 2 3 4 5 6 7 8 9 10 11 |
check process clamavd with pidfile /var/run/clamav/clamd.pid group virus start program = "/etc/init.d/clamav-daemon start" with timeout 60 seconds stop program = "/etc/init.d/clamav-daemon stop" if failed unixsocket /var/run/clamav/clamd.ctl then restart if 5 restarts within 5 cycles then timeout depends on clamav_rc check file clamav_rc with path /etc/init.d/clamav-daemon group virus include /etc/monit/templates/rootbin |
Muy parecido a lo que hago con amavis, pero para clamav.
mysql.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
check process mysql with pidfile /var/run/mysqld/mysqld.pid group mysql start program = "/etc/init.d/mysql start" with timeout 60 seconds stop program = "/etc/init.d/mysql stop" if failed host localhost port 3306 protocol mysql for 2 cycles then restart depends on mysqld_safe depends on mysql_rc check file mysqld_safe with path /usr/bin/mysqld_safe group database include /etc/monit/templates/rootbin check file mysql_rc with path /etc/init.d/mysql group database include /etc/monit/templates/rootbin |
Para mysql hago algo parecido a lo que hago con apache.
php5-fpm.conf
1 2 3 4 5 6 7 8 9 10 11 |
check process php5-fpm with pidfile /var/run/php5-fpm.pid group php start program = "/etc/init.d/php5-fpm start" with timeout 60 seconds stop program = "/etc/init.d/php5-fpm stop" if failed host localhost port 80 protocol http for 2 cycles then restart if 5 restarts within 5 cycles then timeout depends on php5-fpm_rc check file php5-fpm_rc with path /etc/init.d/php5-fpm group php include /etc/monit/templates/rootbin |
Apache, MySQL y PHP… prácticamente la misma configuración.
postfix.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
check process postfix with pidfile /var/spool/postfix/pid/master.pid group mail group postfix start program = "/etc/init.d/postfix start" with timeout 60 seconds stop program = "/etc/init.d/postfix stop" if failed host localhost port 25 with protocol smtp for 2 times within 3 cycles then restart if 5 restarts with 5 cycles then timeout depend master_bin depend postfix_rc depend postdrop_bin depend postqueue_bin depend master_cf depend main_cf check file master_bin with path /usr/lib/postfix/master group mail group postfix include /etc/monit/templates/rootbin check file postdrop_bin with path /usr/sbin/postdrop group mail group postfix if failed checksum then unmonitor if failed permission 2555 then unmonitor if failed uid root then unmonitor if failed gid postdrop then unmonitor check file postqueue_bin with path /usr/sbin/postqueue group mail group postfix if failed checksum then unmonitor if failed permission 2555 then unmonitor if failed uid root then unmonitor if failed gid postdrop then unmonitor check file master_cf with path /etc/postfix/master.cf group mail group postfix include /etc/monit/templates/rootrc check file main_cf with path /etc/postfix/main.cf group mail group postfix include /etc/monit/templates/rootrc check file postfix_rc with path /etc/init.d/postfix group mail group postfix include /etc/monit/templates/rootbin |
El de postfix es el más complicado sin duda.
spamassassin.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 |
check process spamd with pidfile /var/run/spamd.pid group mail group spamassassin start program = "/etc/init.d/spamassassin start" with timeout 60 seconds stop program = "/etc/init.d/spamassassin stop" if cpu usage > 99% for 5 cycles then alert if mem usage > 99% for 5 cycles then alert depends spamd_rc check file spamd_rc with path /etc/init.d/spamassassin group mail group spamassassin include /etc/monit/templates/rootbin |
Spamassassin necesario para el buen funcionamiento del correo.
ssh.conf
1 2 3 4 5 6 7 8 9 10 |
check process sshd with pidfile /var/run/sshd.pid group ssh start program = "/etc/init.d/ssh start" with timeout 60 seconds stop program = "/etc/init.d/ssh stop" if failed port 22 protocol ssh for 2 cycles then restart depends on ssh_rc check file ssh_rc with path /etc/init.d/ssh group ssh include /etc/monit/templates/rootbin |
Importante configurar esto para evitar quedarme sin acceso ssh… que ya me ha pasado.
Una vez configurado vuestro archivo de monit:
1 |
service monit start |
Para ver el estado actual de vuestros monitores:
1 |
monit status |
Si cambiáis algo del archivo o los archivos de configuración de Monit, podéis reiniciar los monitores con:
1 |
monit reload |
Configurar ISPConfig para utilizar Monit
Si has configurado como en mi archivo de configuración el acceso web, es muy sencillo. Debes ir a la configuración de vuestro servidor System > Server Config. Verás que existen 3 campos: Monit URL, Monit User, Monit password. Configura tu acceso y ya está.
Desde Monitor > Server State > Show Monit podrás ver el acceso web al estado de Monit.
Desde que instalé Monit, mi servidor es mucho más estable ya que no depende de mi acción para reiniciar servicios o comprobar que hay problemas. Ya se encarga Monit de ello y cuando hay un problema que no puede resolver, me avisa para que yo me encargue de ello. Un pequeño truco que aprendí después de configurar por primera vez Monit, si recibes muchos emails de alerta, utiliza «for x cycles» para que te avisa si la condición que compruebas ocurre más de 1 vez. Por ejemplo, puede ser que el servidor supere tus valores límites durante un lapso de tiempo breve, pero se recupere enseguida. Yo no paraba de recibir emails al principio porque había configurado monit para ejecutarse cada 60 segundos y que me avisara siempre. Con esta configuración el ratio de emails ha disminuido mucho, pero la monitorización sigue siendo suficiente.
Enlaces interesantes
- Tutorial original para instalar Monit y también Munin en Ubuntu 14 con ISP Config 3
- La presentación de slide de Monit es muy interesante
- Manual de Monit
- Ejemplos de configuración de Monit
- Tutorial de Digital Ocean sobre Monit
* Nota: Algunos de estos enlaces son referidos. Los enlaces referidos son enlaces por los que yo obtengo algún tipo de beneficio si tú pinchas en ellos y acabas registrándote o comprando algo. Estos beneficios pueden ser descuentos sobre productos o meses gratis de servicio premium en aplicaciones. Eres libre de utilizarlos o no, aunque te agradecería que lo hicieras :).