Rsync y Nginx - Guía de Laboratorio
Configuración de Servidores - Troubleshooting
Rsync y Nginx - Guía de Laboratorio
Resumen de Problemas y Soluciones
1. Error Rsync: Permission Denied
Problema
rsync: [receiver] mkdir "/var/www/html/site" failed: Permission denied (13)
rsync: [receiver] mkstemp "/usr/share/nginx/html/.example.tar.gz.WXvxvL" failed: Permission denied (13)
Causa
El usuario no tiene permisos de escritura en los directorios destino del servidor remoto.
Solución
Opción A: Crear directorio con permisos adecuados
BASH
- 1
- ssh conecta al servidor remoto para configurar permisos.
- 2
- mkdir -p crea el directorio destino si no existe.
- 3
- chown cambia propietario para permitir escritura del usuario.
- 4
- rsync transfiere el archivo al directorio configurado.
Opción B: Usar directorio home del usuario
BASH
1rsync /tmp/example.tar.gz usuario@192.168.56.10:~/site/- 1
- ~/ usa el directorio home del usuario, que siempre tiene permisos de escritura.
Opción C: Rsync con sudo en el servidor remoto
BASH
1rsync --rsync-path="sudo rsync" /tmp/example.tar.gz usuario@192.168.56.10:/var/www/html/site/- 1
- –rsync-path=“sudo rsync” ejecuta rsync con privilegios elevados en el destino.
2. Error Nginx: 404 Not Found
Problema
Nginx sirve desde /var/www/html pero los archivos están en /usr/share/nginx/html/.
Solución
Opción A: Copiar archivos al directorio correcto de nginx
BASH
- 1
- cp copia archivos desde la ubicación de instalación al root de nginx.
- 2
- cp / copia todos los archivos del proyecto web.
- 3
- nginx -s reload recarga la configuración sin reiniciar el servicio.
Opción B: Cambiar la raíz de documentos de nginx
BASH
- 1
- nano abre el archivo de configuración del sitio.
- 2
- nginx -t valida la sintaxis antes de aplicar cambios.
3. Backup entre Servidores
Escenario
- Origen:
usuario@192.168.56.10:/usr/share/nginx/html/ - Destino:
usuario@192.168.56.20
Backup en directorio home
BASH
# Desde el servidor destino (192.168.56.20):
1rsync -avz usuario@192.168.56.10:/usr/share/nginx/html/ ~/nginx-backup/- 1
- rsync -avz sincroniza con verbose y compresión, descargando del origen.
Backup en /opt/backup
BASH
- 1
- mkdir -p crea el directorio de backup con permisos de root.
- 2
- chown transfiere propiedad al usuario para futuras sincronizaciones.
- 3
- rsync sincroniza directamente al directorio de backup.
4. Comandos Rsync Útiles
Sincronización básica
BASH
1rsync -avz origen/ destino/- 1
- -a modo archivo (preserva permisos, timestamps, etc.), -v verbose, -z comprime.
Copiar archivo específico
BASH
1rsync /tmp/example.tar.gz usuario@192.168.56.10:/var/www/html/site/- 1
- Transfiere un archivo individual al servidor remoto.
Modo verbose y progreso
BASH
1rsync -avz --progress origen/ destino/- 1
- –progress muestra barra de progreso y velocidad de transferencia.
Eliminar archivos en destino que no existen en origen
BASH
1rsync -avz --delete origen/ destino/- 1
- –delete sincroniza exactamente, eliminando archivos obsoletos.
Comprimir durante transferencia
BASH
1rsync -az origen/ destino/- 1
- -a -z combina archivado con compresión.
Mantener permisos y propietarios
BASH
1rsync -avz --preserve=mode,ownership origen/ destino/- 1
- –preserve=mode,ownership asegura que permisos se mantengan en la copia.
Sincronización con SSH
BASH
1rsync -avz -e "ssh -i ~/.ssh/id_ed25519" origen/ usuario@192.168.56.10:~/destino/- 1
- -e “ssh” especifica el comando SSH a usar, con clave específica.
5. Comandos Nginx Útiles
Verificar configuración
BASH
1sudo nginx -t- 1
- nginx -t valida sintaxis sin aplicar cambios.
Ver configuración completa
BASH
1sudo nginx -T- 1
- -T muestra toda la configuración incluyendo server blocks.
Recargar configuración
BASH
1sudo nginx -s reload- 1
- -s reload recarga configuración gracefully sin cortar conexiones.
Reiniciar nginx
BASH
1sudo systemctl restart nginx- 1
- systemctl restart reinicia el servicio completamente.
Ver estado del servicio
BASH
1sudo systemctl status nginx- 1
- status muestra estado actual y logs recientes.
Ver logs de errores en tiempo real
BASH
1sudo tail -f /var/log/nginx/error.log- 1
- tail -f sigue el archivo de log en tiempo real.
6. Estructura de Directorios Nginx
Directorios comunes
/etc/nginx/ # Configuración principal
/etc/nginx/nginx.conf # Archivo de configuración principal
/etc/nginx/sites-available/ # Sitios disponibles
/etc/nginx/sites-enabled/ # Sitios activos (symlinks)
/etc/nginx/conf.d/ # Configuración adicional
/usr/share/nginx/html/ # Archivos web (en Ubuntu/Debian)
/var/www/html/ # Raíz de documentos por defecto
7. Variables de Entorno del Servidor
IP del servidor actual
BASH
1hostname -I | awk '{print $1}'- 1
- hostname -I obtiene todas las IPs del servidor.
IP del servidor destino
BASH
# Disponible en la red local
# Verificar conectividad:
1ping -c 1 192.168.56.10- 1
- ping verifica que el servidor destino es alcanzable.
8. Conexión SSH entre Servidores
Generar clave SSH (si no existe)
BASH
1ssh-keygen -t ed25519 -C "usuario@laboratorio"- 1
- ssh-keygen crea un par de claves ed25519 modernas.
Copiar clave al servidor destino
BASH
1ssh-copy-id usuario@192.168.56.10- 1
- ssh-copy-id automatiza la instalación de clave pública en authorized_keys.
Conectar al servidor destino
BASH
1ssh usuario@192.168.56.10- 1
- ssh conecta al servidor remoto con autenticación de clave.
9. Permisos de Archivos
chmod básico
- 1
- 600 lectura/escritura solo para propietario.
- 2
- 644 lectura para todos, escritura para propietario.
- 3
- 755 lectura/ejecución para todos, escritura para propietario.
chown para cambiar propietario
- 1
- chown cambia propietario y grupo de un archivo.
- 2
- -R aplica recursivamente a subdirectorios y archivos.
10. Seguridad
No exponer contraseñas en comandos
- Usar claves SSH en lugar de contraseñas
- Usar
ssh-copy-idpara configurar autenticación sin contraseña - Nunca compartir contraseñas en scripts o historial
Verificar fingerprint SSH
The authenticity of host '192.168.56.10 (192.168.56.10)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Verificar host key antes de conectar
BASH
1ssh-keyscan -H 192.168.56.10 >> ~/.ssh/known_hosts- 1
- ssh-keyscan obtiene y guarda el fingerprint del host remoto.
Práctica de Laboratorio: Rsync entre Servidores Nginx
Escenario del Laboratorio
Servidor 1 (Origen):
BASH
1statick@ubuntu-server:~$ hostname -I | awk '{print $1}'
192.168.56.10- 1
- hostname -I obtiene la IP del servidor origen.
Servidor 2 (Destino):
BASH
1statick@ubuntu-server:~$ hostname -I | awk '{print $1}'
192.168.56.20- 1
- hostname -I obtiene la IP del servidor destino.
Ejercicio 1: Verificar contenido del servidor origen
BASH
1statick@ubuntu-server:~$ cat /usr/share/nginx/html/index.html
<h1>Hello World from Nginx</h1>
<h2>Esto es una prueba</h2>
<p>Mi nombre es Diego Saavedra</p>
<h3>Esto es un cambio en la rama experimental</h3>
<h3>Esto es para verificar cambios en github</h3>
<p>Esto es un cambio para verificar que funciona bien git push</p>
<p>Esto es una prueba del enlace simbolico del repositorio en mi nginx</p>- 1
- cat muestra el contenido del archivo HTML que será sincronizado.
Ejercicio 2: Error - Host no alcanzable
BASH
1statick@ubuntu-server:~$ rsync -avz /usr/share/nginx/html/* statick@192.168.56.30:/var/www/html/site/
2ssh: connect to host 192.168.56.30 port 22: No route to host
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(232) [sender=3.2.7]
# <1> <2>- 1
- rsync -avz intenta sincronizar archivos al servidor destino.
- 2
- No route to host indica que la IP de destino no es alcanzable en la red.
Diagnóstico:
BASH
1ping -c 1 192.168.56.30- 1
- ping verifica conectividad de red con el servidor destino.
Ejercicio 3: Error - Permiso denegado
BASH
1statick@ubuntu-server:~$ rsync -avz /usr/share/nginx/html/* statick@192.168.56.20:/var/www/html/site/
2statick@192.168.56.20's password:
sending incremental file list
3rsync: [Receiver] mkdir "/var/www/html/site" failed: Permission denied (13)
rsync error: error in file IO (code 11) at main.c(791) [Receiver=3.2.7]
# <1> <2> <3>- 1
- rsync -avz sincroniza al directorio destino.
- 2
- password es requerido porque la clave SSH no está configurada o el usuario no tiene permisos.
- 3
- Permission denied indica que el usuario no puede crear el directorio en el destino.
Solución en el servidor destino:
BASH
- 1
- ssh conecta al servidor destino.
- 2
- mkdir -p crea el directorio destino si no existe.
- 3
- chown cambia el propietario para permitir escritura del usuario.
- 4
- exit cierra la conexión SSH.
Ejercicio 4: Sincronización exitosa a /opt/backup
BASH
1statick@ubuntu-server:~$ rsync -avz /usr/share/nginx/html/* statick@192.168.56.20:/opt/backup/
2statick@192.168.56.20's password:
sending incremental file list
3index.html -> ../../../../home/statick/myrepository/index.html
sent 112 bytes received 19 bytes 52,40 bytes/sec
total size is 48 speedup is 0,37
# <1> <2> <3>- 1
- rsync -avz sincroniza al directorio /opt/backup/ que tiene permisos de escritura.
- 2
- password autenticación con contraseña (para laboratorio).
- 3
- El symlink -> indica que el archivo es un enlace simbólico.
Ejercicio 5: Sincronización con nombre de archivo específico
BASH
1statick@ubuntu-server:~$ rsync -avz /usr/share/nginx/html/* statick@192.168.56.20:/opt/backup/backup.tar.gz
2statick@192.168.56.20's password:
sending incremental file list
3index.html -> ../../../../home/statick/myrepository/index.html
sent 112 bytes received 19 bytes 37,43 bytes/sec
total size is 48 speedup is 0,37
# <1> <2> <3>- 1
- rsync con nombre de archivo destino específico.
- 2
- password autenticación requerida.
- 3
- -> indica que el archivo origen es un symlink.
Ejercicio 6: Verificar sincronización exitosa
- 1
- ssh conecta al servidor destino.
- 2
- ls -la lista los archivos sincronizados.
- 3
- exit cierra la sesión SSH.
Checklist de Verificación
| Paso | Comando | Esperado |
|---|---|---|
| 1 | ping -c 1 IP_DESTINO |
0% packet loss |
| 2 | ssh usuario@IP_DESTINO |
Conexión exitosa |
| 3 | sudo mkdir -p /RUTA/DESTINO |
Directorio creado |
| 4 | sudo chown usuario:usuario /RUTA/DESTINO |
Permisos correctos |
| 5 | rsync -avz origen/ usuario@IP_DESTINO:/RUTA/ |
Transferencia exitosa |
Notas
- El directorio
/usr/share/nginx/html/es la ubicación estándar en Ubuntu/Debian - El directorio
/var/www/html/es la raíz de documentos por defecto en nginx - Rsync requiere permisos de escritura en el destino
- Usar
-avzpara transferencias completas y comprimidas - Verificar siempre la configuración de nginx antes de recargar con
nginx -t - Las IPs 192.168.56.x son para redes locales de laboratorio
Quiz de Verificación
Pregunta 1: ¿Qué significa el flag -avz en rsync?
Pregunta 2: ¿Qué error indica “Permission denied” en rsync?
Pregunta 3: ¿Qué comando permite verificar conectividad con el servidor destino?
Pregunta 4: ¿Cuál es la ubicación estándar de nginx en Ubuntu/Debian?
Pregunta 5: ¿Qué significa el error “No route to host”?
Respuestas: 1. -a archive (preserva permisos), -v verbose (muestra detalles), -z compress (comprime durante transferencia) 2. El usuario no tiene permisos de escritura en el directorio destino 3. ping verifica conectividad de red con el servidor destino 4. /usr/share/nginx/html/ es la raíz de documentos de nginx en Ubuntu/Debian 5. El servidor de destino no es alcanzable (problema de red o IP incorrecta)