GNU/Linux >> Tutoriales Linux >  >> Linux

Duplique su sitio web con rsync

Este tutorial muestra cómo puede duplicar su sitio web desde su servidor web principal a un servidor de respaldo que puede hacerse cargo 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 para actualizar en el espejo. Por lo tanto, su servidor de respaldo generalmente 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 hayan eliminado en el servidor principal. Además de eso, puede preservar los permisos y las propiedades de los archivos y directorios duplicados; 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 que 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 existe una solución:el uso de claves públicas . Creamos un par de claves (en nuestro servidor de respaldo mirror.example.com ), uno de los cuales se guarda en un archivo en el sistema remoto (server1.example.com ). Posteriormente, 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 mirror.example.com; servidor1.ejemplo.com no tiene que hacer nada para ser reflejado.

Usaré la siguiente configuración aquí:

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

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

Primero quiero decir que esta no es la única forma de establecer un sistema de este tipo. Hay muchas formas de lograr este objetivo, pero esta es la que yo tomo.

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-get install rsync

En otras distribuciones de Linux, usaría yum (Fedora/CentOS) o yast (SuSE) para instalar rsync.

2 Crea 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 duplicar el directorio /var/www (por supuesto, someuser debe tener permisos de lectura en /var/www en server1 .ejemplo.com).

servidor1:

(¡Hacemos esto como root!)

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 protected]:/var/www/ /var/www/

Debería ver algo como esto. Responda 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 de server1.example.com está reflejado en /var/www en mirror.example.com.

Puede 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 Crea 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 [email protected]

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

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

espejo:

(Aún así, hacemos esto como root).

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

La clave pública mirror-rsync-key.pub ahora debería estar 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 root!) y haga esto:

servidor1:

(¡Por favor haz esto como un 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, agregamos 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:

servidor1:

(¡Sigue siendo un usuario!)

vi /home/someuser/.ssh/authorized_keys
ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom [email protected]
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 principio de /home/someuser/.ssh/authorized_keys:

servidor1:

(¡Sigue siendo 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 [email protected]
mirror

Es importante que utilice un FQDN como mirror.example.com en lugar de una dirección IP después de from=, 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.

servidor1:

(¡Todavía hacemos esto como algún 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 Probar rsync en mirror.example.com

Ahora debemos probar en mirror.example.com si podemos duplicar server1.example.com sin que se nos solicite la contraseña de algún usuario. 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 protected]:/var/www/ /var/www/

(La opción --delete significa que los archivos que se eliminaron 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 duplicar /var/www/error". Puede usar múltiples opciones --exclude. He enumerado estas opciones como ejemplos; puede ajustar el comando a sus necesidades. Eche un vistazo a

man rsync

para más información.)

Ahora debería ver que la duplicación tiene lugar:

receiving file list ... done

sent 71 bytes received 643 bytes 476.00 bytes/sec
total size is 64657 speedup is 90.56

sin que se le solicite 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 para ello 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 protected]com:/var/www/ /var/www/ 

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

man 5 crontab

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

espejo:

(¡Hacemos esto como root!)

which rsync

para saber dónde está el tuyo.

8 Enlaces

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

Linux
  1. Asegure sus contenedores con SELinux

  2. Almacenamiento de alta disponibilidad con GlusterFS en CentOS 7:espejo en dos servidores de almacenamiento

  3. Almacenamiento de alta disponibilidad con GlusterFS 3.2.x en Debian Wheezy:replicación automática de archivos (espejo) en dos servidores de almacenamiento

  4. Introducción a las expresiones regulares:un ejemplo

  5. Solucione los problemas de su red con tcpdump

Cómo ejecutar sus propios servidores DNS (primario y secundario) con ISPConfig 3 (Debian Squeeze)

Aloje múltiples sitios web en un solo servidor con Apache en Ubuntu 18.04

Protección de su servidor web Apache con Mod Security

Ubicación de DocumentRoot en CentOS

Cómo escribir su propio módulo kernel de Linux con un ejemplo simple

Cómo asignar IP estática a su dominio (con el ejemplo de GoDaddy)