Rsync y Nginx - Guía de Laboratorio

Configuración de Servidores - Troubleshooting

Author

Diego Saavedra

Published

Feb 8, 2026

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
# En el servidor destino (192.168.56.10):
1ssh usuario@192.168.56.10
2sudo mkdir -p /var/www/html/site
3sudo chown -R usuario:usuario /var/www/html/site
exit

# Desde el servidor origen:
4rsync /tmp/example.tar.gz usuario@192.168.56.10:/var/www/html/site/
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
1sudo cp /usr/share/nginx/html/index.html /var/www/html/
2sudo cp /home/usuario/mirepositorio/* /var/www/html/
3sudo nginx -s reload
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
# Editar /etc/nginx/sites-enabled/default:
1sudo nano /etc/nginx/sites-enabled/default

# Cambiar:
# root /var/www/html;
root /usr/share/nginx/html;

# Verificar y recargar:
2sudo nginx -t && sudo nginx -s reload
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
# En el servidor destino (192.168.56.20):
1sudo mkdir -p /opt/backup
2sudo chown usuario:usuario /opt/backup

# Transferir:
3rsync -avz usuario@192.168.56.10:/usr/share/nginx/html/ /opt/backup/
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

BASH
1chmod 600 archivo
2chmod 644 archivo
3chmod 755 archivo
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

BASH
1chown usuario:grupo archivo
2chown -R usuario:grupo /directorio/
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-id para 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
1statick@ubuntu-server:~$ ssh statick@192.168.56.20
2sudo mkdir -p /var/www/html/site
3sudo chown -R statick:statick /var/www/html/site
4exit
# <1> <2> <3> <4>
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

BASH
1statick@ubuntu-server:~$ ssh statick@192.168.56.20
2ls -la /opt/backup/
3exit
# <1> <2> <3>
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 -avz para 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)

Code Appendix