rsync tutorial · 6 min read · Dec 13, 2025
Espeje su sitio web con rsync

Este tutorial muestra cómo puede espejar su sitio web desde su servidor web principal a un servidor de respaldo que puede tomar el control si el servidor principal falla. Usamos la herramienta rsync para esto, y la hacemos funcionar a través de un trabajo cron que verifica cada x minutos si hay algo que actualizar en el espejo. Así, su servidor de respaldo debería estar generalmente actualizado si tiene que tomar el control.
rsync solo actualiza los archivos que han cambiado, por lo que no necesita transferir 5 GB de datos cada vez que ejecuta rsync. Solo espeja archivos nuevos/cambiados, y también puede eliminar archivos del espejo que han sido eliminados en el servidor principal. Además de eso, puede preservar permisos y propiedades de archivos y directorios espejados; para preservar las propiedades, necesitamos ejecutar rsync como root, que es lo que hacemos aquí. Si los permisos y/o propiedades cambian en el servidor principal, rsync también los cambiará en el servidor de respaldo.
En este tutorial, haremos un túnel de rsync a través de SSH, que es más seguro; también significa que no tiene que abrir otro puerto en su firewall para rsync: es suficiente con que el puerto 22 (SSH) esté abierto. El problema es que SSH requiere una contraseña para iniciar sesión, lo cual no es bueno si desea ejecutar rsync como un trabajo cron. La necesidad de una contraseña requiere interacción humana, que no es lo que queremos.
Pero afortunadamente hay una solución: el uso de claves públicas. Creamos un par de claves (en nuestro servidor de respaldo mirror.example.com), una de las cuales se guarda en un archivo en el sistema remoto (server1.example.com). Después de eso, no se nos pedirá más una contraseña cuando ejecutemos rsync. Esto también incluye trabajos cron, que es exactamente lo que queremos.
Como ya puede haber adivinado por lo que he escrito hasta ahora, el concepto es que iniciamos el espejado de server1.example.com directamente desde mirror.example.com; server1.example.com no tiene que hacer nada para ser espejado.
Utilizaré la siguiente configuración aquí:
- Servidor principal: server1.example.com (server1) - Dirección IP: 192.168.0.100
- Servidor espejo/respaldo: mirror.example.com (mirror) - Dirección IP: 192.168.0.175
- El sitio web que se va a espejar está en /var/www en server1.example.com.
rsync es solo para espejar archivos y directorios; si desea espejar su base de datos MySQL, use la replicación/espejado de MySQL en su lugar.
Quiero decir primero que esta no es la única forma de configurar un sistema así. Hay muchas maneras de lograr este objetivo, pero este es el camino que tomaré.
El primer paso es iniciar sesión o convertirse en el usuario root en su sistema. En Debian y centOS, use:
su -Si ha iniciado sesión como un usuario diferente a root. En Ubuntu, use:
sudo -sen su lugar.
1 Instalar rsync
Primero, tenemos que instalar rsync en ambos server1.example.com y mirror.example.com. Para sistemas Debian y Ubuntu, esto se ve así:
server1/mirror:
(¡Hacemos esto como root!)
apt install rsyncEn otras distribuciones de Linux, usaría yum / dnf (Fedora/CentOS) o yast (SuSE) para instalar rsync.
En CentOS / Rocky Linux o AlmaLinux, use:
dnf install rsync2 Crear un usuario sin privilegios en server1.example.com
Ahora creamos un usuario sin privilegios llamado someuser en server1.example.com que será utilizado por rsync en mirror.example.com para espejar el directorio /var/www (por supuesto, someuser debe tener permisos de lectura en /var/www en server1.example.com).
server1:
(¡Hacemos esto como root!)
sudo useradd -d /home/someuser -m -s /bin/bash someuserEsto creará el usuario someuser con el directorio home /home/someuser y el shell de inicio de sesión /bin/bash (es importante que someuser tenga un shell de inicio de sesión válido: algo como /bin/false no funciona). Ahora asigne una contraseña a someuser:
passwd someuser3 Probar rsync
A continuación, probamos rsync en mirror.example.com. Como root hacemos esto:
mirror:
rsync -avz -e ssh [email protected]:/var/www/ /var/www/Debería ver algo como esto. Responda con sí:
La autenticidad del host 'server1.example.com (192.168.0.100)' no se puede establecer.
La huella digital de la clave RSA es 32:e5:79:8e:5f:5a:25:a9:f1:0d:ef:be:5b:a6:a6:23.
¿Está seguro de que desea continuar conectándose (sí/no)?<-- síLuego ingrese la contraseña de someuser, y debería ver que el directorio /var/www de server1.example.com se espeja a /var/www en mirror.example.com.
Puede verificarlo así en ambos servidores:
server1/mirror:
ls -la /var/wwwDebería ver que todos los archivos y directorios se han espejado a mirror.example.com, y los archivos y directorios deberían tener los mismos permisos/propiedades que en server1.example.com.
4 Crear las claves en mirror.example.com
Ahora creamos el par de claves privada/pública en mirror.example.com:
mirror:
(¡Hacemos esto como root!)
mkdir /root/rsync
ssh-keygen -t dsa -b 1024 -f /root/rsync/mirror-rsync-keyVerá algo como esto:
Generando par de claves dsa pública/privada.
Ingrese la frase de contraseña (vacío para no usar frase de contraseña): [presione enter aquí]
Ingrese la misma frase de contraseña nuevamente: [presione enter aquí]
Su identificación se ha guardado en /root/cron/mirror-rsync-key.
Su clave pública se ha guardado en /root/cron/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@mirrorEs importante que no ingrese una frase de contraseña, de lo contrario, el espejado no funcionará sin interacción humana, así que simplemente presione enter.
A continuación, copiamos nuestra clave pública a server1.example.com:
mirror:
(Todavía, hacemos esto como root.)
scp /root/rsync/mirror-rsync-key.pub [email protected]:/home/someuser/La clave pública mirror-rsync-key.pub debería estar ahora disponible en /home/someuser en server1.example.com.
5 Configurar server1.example.com
Ahora inicie sesión a través de SSH en server1.example.com como someuser (¡no como root!) y haga esto:
server1:
(¡Por favor, haga esto como someuser!)
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_keysAl hacer esto, hemos agregado el contenido de mirror-rsync-key.pub al archivo /home/someuser/.ssh/authorized_keys. /home/someuser/.ssh/authorized_keys debería verse similar a esto:
server1:
(Todavía como someuser!)
vi /home/someuser/.ssh/authorized_keysssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@
mirrorAhora queremos permitir conexiones solo desde mirror.example.com, y el usuario que se conecta solo debería poder usar rsync, así que agregamos
command="/home/someuser/rsync/checkrsync",from="mirror.example.com",no-port-forwarding,no-X11-forwarding,no-ptyjusto al principio de /home/someuser/.ssh/authorized_keys:
server1:
(Todavía como someuser!)
vi /home/someuser/.ssh/authorized_keyscommand="/home/someuser/rsync/checkrsync",from="mirror.example.com",no-port-forwarding,no-X11-forwarding,no-pty ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@
mirror¡Debe usar un FQDN como mirror.example.com en lugar de una dirección IP después de from=, de lo contrario, el espejado automatizado no funcionará!
Ahora creamos el script /home/someuser/rsync/checkrsync que rechaza todos los comandos excepto rsync.
server1:
(¡Todavía hacemos esto como someuser!)
mkdir ~/rsync
vi ~/rsync/checkrsync#!/bin/sh
case "$SSH_ORIGINAL_COMMAND" in
*[0m&*)
echo "Rechazado"
;;
*[0m(*)
echo "Rechazado"
;;
*[0m{*)
echo "Rechazado"
;;
*[0m;*)
echo "Rechazado"
;;
*[0m<*)
echo "Rechazado"
;;
*[0m`*)
echo "Rechazado"
;;
rsync[0m --server*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo "Rechazado"
;;
esacchmod 700 ~/rsync/checkrsync6 Probar rsync en mirror.example.com
Ahora debemos probar en mirror.example.com si podemos espejar server1.example.com sin que se nos pida la contraseña de someuser. Hacemos esto:
mirror:
(¡Hacemos esto como root!)
rsync -avz --delete --exclude=/stats --exclude=/error --exclude=/files/pictures -e "ssh -i /root/rsync/mirror-rsync-key" [email protected]:/var/www/ /var/www/(La opción –delete significa que los archivos que han sido eliminados en server1.example.com también deberían ser eliminados en mirror.example.com. La opción –exclude significa que estos archivos/directorios no deberían ser espejados; por ejemplo, –exclude=/error significa “no espejar /var/www/error”. Puede usar múltiples opciones –exclude. He enumerado estas opciones como ejemplos; puede ajustar el comando a sus necesidades. Consulte
man rsyncpara más información.)
Ahora debería ver que el espejado tiene lugar:
recibiendo lista de archivos ... hecho
enviado 71 bytes recibido 643 bytes 476.00 bytes/sec
tamaño total es 64657 aceleración es 90.56¡sin que se le pida una contraseña! Esto es lo que queríamos.
7 Crear un trabajo cron
Queremos automatizar el espejado, por eso creamos un trabajo cron para ello en mirror.example.com. Ejecute crontab -e como root:
mirror:
(¡Hacemos esto como root!)
crontab -ey cree un trabajo cron como este:
*/5 * * * * /usr/bin/rsync -azq --delete --exclude=/stats --exclude=/error --exclude=**/files/pictures -e "ssh -i /root/rsync/mirror-rsync-key" [email protected]:/var/www/ /var/www/ Esto ejecutaría rsync cada 5 minutos; ajústelo a sus necesidades (consulte
man 5 crontab). Uso la ruta completa a rsync aquí (/usr/bin/rsync) solo para asegurarme de que cron sepa dónde encontrar rsync. La ubicación de su rsync puede diferir. Ejecute
mirror:
(¡Hacemos esto como root!)
which rsyncpara averiguar dónde está el suyo.
8 Enlaces
- rsync: https://rsync.samba.org/
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.