Clúster Web · 6 min read · Oct 08, 2025
El Clúster Web Perfecto Balanceado y de Alta Disponibilidad Con 2 Servidores Ejecutando Xen En Ubuntu 8.04 Hardy Heron - Página 8
14. Espejando archivos web y de correo con rsync (web1, web2)
Esta es la parte complicada. Dependiendo del tipo de sitio web(s) que pondrás en el clúster, la técnica utilizada para espejar archivos web puede ser diferente.
Consideraremos web1.example.com como el maestro, web2.example.com se sincronizará con web1.example.com.
Esto puede crear problemas en algunos casos. Si tienes un sitio web donde los usuarios pueden subir archivos, no querrás que se suban a web2.example.com porque los dos servidores no estarán sincronizados.
En mi caso, redirijo todas las páginas donde los usuarios pueden subir datos al puerto HTTP 81, que solo se reenvía a un servidor, web1.example.com. Si el servidor maestro falla, entonces todo el tráfico del puerto 81 se reenvía al servidor de respaldo, web2.example.com y el espejado se detiene temporalmente.
La redirección se puede hacer en apache vhost.conf :
[...]
Redirect /admin http://www.example.com:81/webmail
[...]Si tienes muchas cargas de archivos realizadas por usuarios, podrías considerar usar un NFS balanceado:
https://www.howtoforge.com/high_availability_nfs_drbd_heartbeat
14.1 Instalar rsync
apt-get install rsync
14.2 Crear las Claves En web2.example.com
Ahora creamos el par de claves privada/pública en web2.example.com:
mkdir /root/rsync
ssh-keygen -t dsa -b 1024 -f /root/rsync/mirror-rsync-key
Verás algo como esto:
Generando par de claves dsa pública/privada.
Introduce la frase de paso (vacío para no usar frase de paso): [presiona enter aquí]
Introduce la misma frase de paso de nuevo: [presiona enter aquí]
Tu identificación ha sido guardada en /root/rsync/mirror-rsync-key.
Tu clave pública ha sido guardada en /root/rsync/mirror-rsync-key.pub.
La huella digital de la clave es:
68:95:35:44:91:f1:45:a4:af:3f:69:2a:ea:c5:4e:d7 root@web2Es importante que no ingreses una frase de paso, de lo contrario el espejado no funcionará sin interacción humana, ¡así que simplemente presiona enter!
A continuación, copiamos nuestra clave pública a web1.example.com:
scp /root/rsync/mirror-rsync-key.pub [email protected]:/home/vmail/
La clave pública mirror-rsync-key.pub debería estar ahora disponible en /home/vmail en web1.example.com.
14.3 Configurar web1.example.com
web1.example.com
Ahora inicia sesión a través de SSH como vmail (¡no como root!) y haz esto:
login vmail
mkdir ~/.ssh
chmod 700 ~/.ssh
mv ~/mirror-rsync-key.pub ~/.ssh/
cd ~/.ssh
touch authorized_keys
chmod 600 authorized_keys
cat mirror-rsync-key.pub >> authorized_keys
Al hacer esto, hemos agregado el contenido de mirror-rsync-key.pub al archivo /home/vmail/.ssh/authorized_keys. /home/vmail/.ssh/authorized_keys debería verse similar a esto:
(Aún como webmaster! en web1.example.com)
vi ~/.ssh/authorized_keys
ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@web2Ahora queremos permitir conexiones solo desde web2.example.com, y el usuario que se conecta solo debería poder usar rsync, así que agregamos
command="/home/vmail/rsync/checkrsync",from="192.168.0.105",no-port-forwarding,no-X11-forwarding,no-ptyjusto al principio de /home/vmail/.ssh/authorized_keys:
command="/home/vmail/rsync/checkrsync",from="192.168.0.105",no-port-forwarding,no-X11-forwarding,no-pty ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@
web2Ahora creamos el script /home/vmail/rsync/checkrsync que rechaza todos los comandos excepto rsync en web1.example.com.
(¡Todavía hacemos esto como vmail!)
mkdir ~/rsync
vi ~/rsync/checkrsync
#!/bin/sh
case "$SSH_ORIGINAL_COMMAND" in
*\&*)
echo "Rechazado"
;;
*\(*)
echo "Rechazado"
;;
*\{*)
echo "Rechazado"
;;
*\;*)
echo "Rechazado"
;;
*\<*)
echo "Rechazado"
;;
*\`*)
echo "Rechazado"
;;
rsync\ --server*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo "Rechazado"
;;
esacchmod 700 ~/rsync/checkrsync
14.4 Probar rsync automatizado
web2.example.com
Primero tenemos que decirle a rsync qué archivos no queremos sincronizar (como el gráfico de munit!)
vi /root/exclude_www.txt
y hacerlo lucir así :
/example/web/monit/
/example/web/monitoring/
/example/ssl/
/yoursite/ssl/ y ahora para el correo :
vi /root/exclude_mail.txt
/rsync/
/.ssh/
#if you use my monitoring script, see next page
server1_was_down/
.bash_history/
.bash_logout/
.bashrc/
.mysql_history/
.profile/
.viminfo/Ahora debemos probar en web2.example.com si podemos espejar web1.example.com sin que se nos pida la contraseña de vmail. Hacemos esto:
(¡Hacemos esto como root!)
web2.example.com
rsync -avz –delete –ignore-errors –exclude-from ‘/root/exclude_www.txt’ -e “ssh -i /root/rsync/mirror-rsync-key” [email protected]:/var/www/ /var/www/
seguido de :
rsync -avz –delete –ignore-errors –exclude-from ‘/root/exclude_mail.txt’ -e “ssh -i /root/rsync/mirror-rsync-key” [email protected]:/home/vmail/ /home/vmail/
Ahora deberías ver que el espejado ocurre sin que se te pida una contraseña :
recibiendo lista de archivos ... hecho
enviado 71 bytes recibido 643 bytes 476.00 bytes/sec
tamaño total es 64657 la aceleración es 90.5614.5 Crear un trabajo cron
Primero crearemos un script que se asegurará de que si por alguna razón web1.example.com se cae, rsync se detendrá y que root debe reiniciar manualmente el proceso.
La razón por la que tenemos que hacer esto es porque web2.example.com tomará el control de web1.example.com para el correo si se cae. Nuevo correo será recibido en web2.example.com durante ese período, así que digamos que web1.example.com vuelve a estar en línea una hora después, todo el nuevo correo durante ese período de tiempo se eliminaría en web2.example.com debido al comando rsync –delete. Veremos a continuación cómo sincronizar ambos servidores si eso sucede.
Por ahora, escribamos ese script.
En web2.example.com
vi /root/rsync_web1
#!/bin/bash
# Script para rsync datos web y correo entre 2 servidores balanceados
# Copyright (c) 2008 blogama.org
# Este script está licenciado bajo GNU GPL versión 2.0 o superior
# ---------------------------------------------------------------------
### Este script tiene 2 propósitos ###
### 1) Verificar conexión en el puerto 25 al servidor maestro y luego rsync correo ###
### 2) Verificar conexión en el puerto 80 al servidor maestro y luego rsync datos www ###
### Para ser modificado ###
MASTERSERVERIP="192.168.0.104"
WEBPORT="80"
SMTPPORT="25"
SSHPORT="22"
EMAIL="[email protected]"
WWWRSYNCUSER="vmail"
WWWDIR="/var/www/"
MAILRSYNCUSER="vmail"
MAILDIR="/home/vmail/"
###### No hacer modificaciones abajo ######
### Binarios ###
MAIL=$(which mail)
TELNET=$(which telnet)
RSYNC=$(which rsync)
SSH=$(which ssh)
### Para restaurar a original cuando el problema esté solucionado ###
if [ $1 ]; then
if [ $1=="fix" ]; then
if [ -f smtp_down.txt ]; then
rm /root/smtp_down.txt
fi
if [ -f www_down.txt ]; then
rm /root/www_down.txt
fi
fi
fi
####################SMTP####################
### Si ya se notificó por problema SMTP salir ###
cd /root
if [ -f smtp_down.txt ]; then
exit 1;
fi
### Verificar si el servidor 1 está respondiendo en SMTP. Si sí, rsync correo ###
### Si el servidor 1 estaba caído, no se puede rsync --delete servidor 2 con 1 ###
### Debe volver a sincronizar el servidor1 con 2 (sin eliminar) y ejecutar /root/sync fix ###
(
echo "quit"
) | $TELNET $MASTERSERVERIP $SMTPPORT | grep Connected > /dev/null 2>&1
if [ "$?" -ne "1" ]; then
$RSYNC -avz --delete --ignore-errors --exclude-from '/root/exclude_mail.txt' -e "ssh -p $SSHPORT -i /root/rsync/mirror-rsync-key" $MAILRSYNCUSER@$MASTERSERVERIP:$MAILDIR $MAILDIR
else
echo "Servidor 1 caído. La sincronización de correo ya no está funcionando" > /root/smtp_down.txt
$MAIL -s "Servidor 1 caído puerto 25" $EMAIL < /root/smtp_down.txt
fi
####################HTTP####################
### Si ya se notificó por problema HTTP salir ###
cd /root
if [ -f http_down.txt ]; then
exit 1;
fi
### Verificar si el servidor 1 está respondiendo en HTTP. Si sí, rsync datos www ###
(
echo "quit"
) | $TELNET $MASTERSERVERIP $WEBPORT | grep Connected > /dev/null 2>&1
if [ "$?" -ne "1" ]; then
$RSYNC -avz --delete --ignore-errors --exclude-from '/root/exclude_www.txt' -e "ssh -p $SSHPORT -i /root/rsync/mirror-rsync-key" $WWWRSYNCUSER@$MASTERSERVERIP:$WWWDIR $WWWDIR
else
echo "Servidor 1 caído. La sincronización WWW ya no está funcionando" > /root/http_down.txt
$MAIL -s "Servidor 1 caído puerto 80" $EMAIL < /root/http_down.txt
fiY haz que este archivo sea ejecutable :
chmod +x /root/rsync_web1
Por supuesto, puedes poner lo que quieras en esos archivos ;) Si no pones una barra, ignorará la palabra clave recursivamente (ej: *.gz), si pones una barra es para una ubicación precisa (ej: /example/ssl/).
Ahora agregamos el script a nuestro crontab haciendo lo siguiente :
crontab -e
y agrega esta línea :
[...]
*/5 * * * * /root/rsync_web1 >/dev/null 2>&1
[...]Esto lo ejecutará cada 5 minutos, por supuesto, puedes cambiar eso según tus necesidades.
14.6 ¿Qué pasa si web1.example.com estaba caído?
En términos generales, si web1.example.com está caído, entonces debes :
- rsync WEB1 A WEB2 sin el comando –delete :
web1.example.com
rsync -avz [email protected]:/var/www/ /var/www/
rsync -avz [email protected]:/home/vmail/ /home/vmail/
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.