Búsqueda de sitios web

Duplica tu sitio web con rsync


Este tutorial muestra cómo puede reflejar 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 hacemos que se ejecute a través de un trabajo cron que verifica cada x minutos si hay algo que actualizar en el espejo. Por lo tanto, su servidor de respaldo normalmente debería estar actualizado si tiene que hacerse cargo.

rsync actualiza solo los archivos que han cambiado, por lo que no necesita transferir 5 GB de datos cada vez que ejecuta rsync. Solo refleja archivos nuevos/modificados y también puede eliminar archivos del espejo que se han eliminado en el servidor principal. Además de eso, puede preservar los permisos y la propiedad de archivos y directorios reflejados; Para preservar las propiedades, necesitamos ejecutar rsync como root, que es lo que hacemos aquí. Si los permisos y/o las 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 si 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 una tarea cron. La necesidad de una contraseña requiere interacción humana, que no es lo que queremos.

Pero afortunadamente existe 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 (servidor1.ejemplo.com). Después ya no se nos pedirá una contraseña cuando ejecutemos rsync. Esto también incluye trabajos cron, que es exactamente lo que queremos.

Como ya habrás adivinado por lo que he escrito hasta ahora, el concepto es que iniciamos la duplicación de server1.example.com directamente desde espejo.ejemplo.com; server1.example.com no tiene que hacer nada para reflejarse.

Usaré la siguiente configuración aquí:

  • Servidor principal: server1.example.com (server1) - Dirección IP: 192.168.0.100
  • Servidor espejo/de respaldo: mirror.example.com (espejo) - Dirección IP: 192.168.0.175
  • El sitio web que se va a reflejar está en /var/www en server1.example.com.

rsync es sólo para duplicar archivos y directorios; Si desea duplicar su base de datos MySQL, utilice la duplicación/replicación MySQL en su lugar.

En primer lugar quiero decir que ésta no es la única manera de establecer un sistema de este tipo. Hay muchas maneras de lograr este objetivo, pero esta es la que yo tomaré.

El primer paso es iniciar sesión o convertirse en usuario root de su sistema. En Debian y centOS, use:

su -

Si ha iniciado sesión como un usuario diferente al root. En Ubuntu, use:

sudo -s

en cambio.

1 Instalar rsync

Primero, tenemos que instalar rsync tanto en server1.example.com como en mirror.example.com. Para los sistemas Debian y Ubuntu, esto se ve así:

servidor1/espejo:

(¡Hacemos esto como root!)

apt install rsync

En 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 rsync

2 Cree un usuario sin privilegios en server1.example.com

Ahora creamos un usuario sin privilegios llamado algúnusuario en server1.example.com que será utilizado por rsync en mirror.example.com para reflejar el directorio /var/www (por supuesto, algún usuario debe tener permisos de lectura en /var/www en server1 .ejemplo.com).

servidor 1:

(¡Hacemos esto como root!)

sudo useradd -d /home/someuser -m -s /bin/bash someuser

Esto creará el usuario someuser con el directorio de inicio /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 dale a algún usuario una contraseña:

passwd someuser

3 Prueba rsync

A continuación, probamos rsync en mirror.example.com. Como root hacemos esto:

espejo :

rsync -avz -e ssh [email :/var/www/ /var/www/

Debería ver algo como esto. Responde con sí:

The authenticity of host 'server1.example.com (192.168.0.100)' can't be established.
RSA key fingerprint is 32:e5:79:8e:5f:5a:25:a9:f1:0d:ef:be:5b:a6:a6:23.
Are you sure you want to continue connecting (yes/no)?
<-- yes

Luego ingrese la contraseña de algún usuario y debería ver que el directorio /var/www del servidor1.example.com está reflejado en /var/www en mirror.example.com.

Puedes comprobarlo así en ambos servidores:

servidor1/espejo:

ls -la /var/www

Debería ver que todos los archivos y directorios se han reflejado en mirror.example.com, y los archivos y directorios deben tener los mismos permisos/propiedades que en server1.example.com.

4 Cree las claves en mirror.example.com

Ahora creamos el par de claves pública/privada en mirror.example.com:

espejo :

(¡Hacemos esto como root!)

mkdir /root/rsync
ssh-keygen -t dsa -b 1024 -f /root/rsync/mirror-rsync-key

Verás algo como esto:

Generating public/private dsa key pair.
Enter passphrase (empty for no passphrase): [press enter here]
Enter same passphrase again: [press enter here]
Your identification has been saved in /root/cron/mirror-rsync-key.
Your public key has been saved in /root/cron/mirror-rsync-key.pub.
The key fingerprint is:
68:95:35:44:91:f1:45:a4:af:3f:69:2a:ea:c5:4e:d7 root@mirror

Es importante que no ingrese una frase de contraseña, de lo contrario, la duplicación no funcionará sin interacción humana, así que simplemente presione enter.

A continuación, copiamos nuestra clave pública a server1.example.com:

espejo :

(Aun así, hacemos esto como root).

scp /root/rsync/mirror-rsync-key.pub [email :/home/someuser/

La clave pública mirror-rsync-key.pub ahora debería estar disponible en /home/someuser en server1.example.com.

5 Configurar servidor1.ejemplo.com

Ahora inicie sesión a través de SSH en server1.example.com como algún usuario (¡no root!) y haga esto:

servidor 1:

(¡Por favor haga esto como algún usuario!)

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/someuser/.ssh/authorized_keys. /home/someuser/.ssh/authorized_keys debería ser similar a este:

servidor 1:

(¡Aún como un usuario!)

vi /home/someuser/.ssh/authorized_keys
ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@
mirror

Ahora queremos permitir conexiones solo desde mirror.example.com, y el usuario que se conecta debe poder usar solo rsync, por lo que agregamos

command="/home/someuser/rsync/checkrsync",from="mirror.example.com",no-port-forwarding,no-X11-forwarding,no-pty

justo al comienzo de /home/someuser/.ssh/authorized_keys:

servidor 1:

(¡Aún como un usuario!)

vi /home/someuser/.ssh/authorized_keys
command="/home/someuser/rsync/checkrsync",from="mirror.example.com",no-port-forwarding,no-X11-forwarding,no-pty ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@
mirror

Debe utilizar un FQDN como mirror.example.com en lugar de una dirección IP después de =; de lo contrario, la duplicación automática no funcionará.

Ahora creamos el script /home/someuser/rsync/checkrsync que rechaza todos los comandos excepto rsync.

servidor 1:

(¡Todavía hacemos esto como usuario!)

mkdir ~/rsync
vi ~/rsync/checkrsync
#!/bin/sh
case "$SSH_ORIGINAL_COMMAND" in
        *\&*)
                echo "Rejected"
                ;;
        *\(*)
                echo "Rejected"
                ;;
        *\{*)
                echo "Rejected"
                ;;
        *\;*)
                echo "Rejected"
                ;;
        *\<*)
                echo "Rejected"
                ;;
        *\`*)
                echo "Rejected"
                ;;
        rsync\ --server*)
                $SSH_ORIGINAL_COMMAND
                ;;
        *)
                echo "Rejected"
                ;;
esac
chmod 700 ~/rsync/checkrsync

6 Pruebe rsync en mirror.example.com

Ahora debemos probar en mirror.example.com si podemos reflejar server1.example.com sin que se nos solicite la contraseña de algún usuario. Nosotros hacemos esto:

espejo :

(¡Hacemos esto como root!)

rsync -avz --delete --exclude=**/stats --exclude=**/error --exclude=**/files/pictures -e "ssh -i /root/rsync/mirror-rsync-key" [email :/var/www/ /var/www/

(La opción --delete significa que los archivos que se han eliminado en server1.example.com también deben eliminarse en mirror.example.com. La opción --exclude significa que estos archivos/directorios no deben duplicarse; por ejemplo, --exclude =**/error significa "no reflejar /var/www/error". Puede utilizar varias opciones --exclude. He enumerado estas opciones como ejemplos; puede ajustar el comando a sus necesidades.

man rsync

para más información.)

Ahora deberías ver que se produce la duplicación:

receiving file list ... done
sent 71 bytes  received 643 bytes  476.00 bytes/sec
total size is 64657  speedup is 90.56

¡sin que te pidan una contraseña! Esto es lo que queríamos.

7 Crear un trabajo cron

Queremos automatizar la duplicación, por eso creamos un trabajo cron en mirror.example.com. Ejecute crontab -e como root:

espejo :

(¡Hacemos esto como root!)

crontab -e

y crea 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 :/var/www/ /var/www/ 

Esto ejecutaría rsync cada 5 minutos; ajústelo a sus necesidades (ver

man 5 crontab

). Utilizo la ruta completa a rsync aquí (/usr/bin/rsync) solo para asegurarme de que cron sepa dónde encontrar rsync. Su ubicación de rsync puede diferir. Correr

espejo :

(¡Hacemos esto como root!)

which rsync

para saber dónde está el tuyo.

8 enlaces

  • rsync: https://rsync.samba.org/

Artículos relacionados: