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@web2

Es 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@web2

Ahora 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-pty

justo 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@
web2

Ahora 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"
                ;;
esac

chmod 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.56

14.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
fi

Y 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 :

  1. 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/

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.