Práctica: Protocolo HTTP y almacenamiento
En esta práctica vamos a trabajar con las distintas aplicaciones que hemos estudiado que utilizan el protocolo HTTP: servidor web, proxy inverso y balanceador de carga. Vamos a configurar un proxy inverso que nos permite el acceso a diferentes aplicaciones web. Algunas de las aplicaciones web se sirven desde un servidor web y otras se sirven desde un balanceador de carga.
Posteriormente, sobre ese mismo escenario, añadiremos un servidor de almacenamiento que ofrecerá una SAN (protocolo iSCSI) y una NAS (protocolo NFS) a los servidores web y backends.
Infraestructura
Podemos usar contenedores LXC para crear las distintas máquinas, aunque servidorweb, backend1 y backend2 tienen que ser máquinas virtuales: en la segunda parte, servidorweb será cliente iSCSI y los backends montarán un directorio por NFS, y eso no se puede hacer en un contenedor LXC sin cambiar su configuración de seguridad. Para configurar la red de los contenedores con netplan, tienes las indicaciones en la presentación de contenedores LXC de Infraestructura Virtual.
Podemos hacer la práctica en varios escenarios distintos:
- Escenario 1: Es más real, tenemos cada servidor en una red privada.
- Escenario 2: En este caso todos los servidores están en la misma red.
- Escenario 3: En este caso sólo tenemos dos servidores web, uno de ellos será backend para el balanceador de carga y servidor web para el acceso desde el proxy inverso.

Elige el escenario que más te guste. En todos ellos, el servidor de almacenamiento de la segunda parte es una máquina virtual aparte.
Configuración de servicios
Servidor web
- Usa nginx como servidor web.
- Tendrá una página principal con hoja de estilo, con distinta información (tu nombre, …).
- Cuando se accede a la ruta
/nasse redirecciona a/documentos. - En la ruta
/documentoshay una autenticación básica. - Cuando nos autenticamos, nos muestra una página con documentos pdf que se pueden descargar.
- Esta página será accesible desde el proxy inverso con la url
nas.tunombre.org.
El servidor web tendrá además dos aplicaciones web implantadas en contenedores docker:
- Un juego llamado 2048 (imagen docker
josedom24/2048:v1, que sirve el contenido en el puerto 80 del contenedor) que será accesible desde el proxy inverso con la URLwww.tunombre.org/game. - La aplicación de monitorización Grafana (imagen docker
grafana/grafana, que sirve el contenido en el puerto 3000) que será accesible desde el proxy inverso con la URLwww.tunombre.org/grafana. Grafana, por defecto, espera estar en la raíz del sitio: para publicarla en una subruta hay que indicarle cuál es su URL pública y que se sirve desde una subruta, con la variable de entornoGF_SERVER_ROOT_URL. Busca en su documentación qué valor necesitan, y piensa qué URL tiene que pasarle el proxy inverso para que funcione.
Balanceador de carga
- En el escenario 1 también funcionará como router/NAT.
- Instalaremos
haproxyy balanceará la carga sobre los servidoresbackend1ybackend2. - En los servidores web instalaremos una aplicación PHP con hoja de estilo, que tendrá en el cuerpo de la página el siguiente código PHP, para que muestre el nombre del servidor al que se está accediendo:
<?php // Mostrar el hostname del servidor echo "<h1>Servidor: " . gethostname() . "</h1>"; // Información adicional opcional (útil para diagnóstico) echo "<p>Dirección IP del servidor: " . $_SERVER['SERVER_ADDR'] . "</p>"; echo "<p>Dirección IP del cliente: " . $_SERVER['REMOTE_ADDR'] . "</p>"; echo "<p>Fecha y hora: " . date('Y-m-d H:i:s') . "</p>"; ?> - La página balanceada será accesible desde el proxy inverso con la url
app.tunombre.org. - Configura la página de estadísticas de haproxy, con autenticación.
Proxy inverso
- En el escenario 1 y en el escenario 2 también funcionará como router/NAT.
- Usa nginx como proxy inverso.
- Las url y las páginas a las que vamos a acceder son:
nas.tunombre.org: Accederemos al servidor web.www.tunombre.org/game: Accedemos a la aplicación2048.www.tunombre.org/grafana: Accedemos a la aplicaciónGrafana.app.tunombre.org: Accedemos al balanceador de carga.
Pregunta: El proxy inverso y el balanceador de carga son dos piezas distintas que trabajan juntas. ¿Qué función cumple cada una? ¿Qué pasaría si detuvieras el servicio web en uno de los dos backends (backend1 o backend2)? Compruébalo en tu escenario y explica lo que observas.
Servidor de almacenamiento
Sobre el escenario anterior vamos a trabajar con los protocolos de almacenamiento que hemos estudiado.
Crea una máquina virtual que va a ser nuestro servidor de almacenamiento que va a ofrecer una SAN (protocolo iSCSI) y una NAS (protocolo NFS). Dicha máquina virtual tendrá las siguientes características:
- Estará conectada a las redes donde están
servidorweb,backend1ybackend2. Si lo hiciéramos más real crearíamos una red de datos que conecta los servidores web con el servidor de almacenamiento. - Estará conectada a una red de tipo NAT para que tenga salida a internet.
- Tendrá tres discos adicionales de 3 GB.
- Crearemos un RAID5 de los tres discos con
mdadm, de forma que se mantenga después de reiniciar. ¿Qué tamaño tiene el dispositivo de bloque correspondiente al RAID5? - Crearemos un grupo de volúmenes cuyo dispositivo físico es el disco RAID5. En este grupo de volúmenes crearemos volúmenes que serán los dispositivos que vamos a compartir con otros servidores.
Es importante darse cuenta de que cuando tengamos el dispositivo de bloque compartido en otro servidor, todo lo que se guarde en ese disco se guardará en nuestro servidor SAN en un dispositivo disco RAID5 con lo que la información estará respaldada y se podrá recuperar aunque algunos de los discos fallen.
Servidor SAN
Ya tenemos el servidor de almacenamiento preparado, vamos a añadir la funcionalidad de servidor SAN y poder empezar a compartir dispositivos de bloque:
- Crea un target con 2 LUN (correspondientes a dos volúmenes lógicos de 512 MB cada uno) y autenticación por CHAP, y conéctalo al
servidorweb. - Explica cómo escaneas desde
servidorweb(cliente iSCSI) buscando los targets disponibles y utiliza una de las unidades lógicas proporcionadas, formateándola y montándola. - Utiliza una unidad de montaje de systemd (las vimos en la presentación de almacenamiento) para que el disco se monte automáticamente al arrancar el cliente. Monta el disco por su UUID, no por su nombre (
/dev/sda,/dev/sdb…), que puede cambiar al reiniciar.
El sistema debe funcionar después de un reinicio de las máquinas: el cliente tiene que volver a conectarse al target y montar el disco solo.
Pregunta: ¿Qué ocurriría si montamos el mismo dispositivo en otra máquina? ¿Podrían leer las dos máquinas del mismo disco? ¿Y escribir? ¿Por qué?
Servidor NAS
Ahora vamos a crear un servidor NAS en nuestro servidor de almacenamiento, para compartir almacenamiento mediante NFS, de forma que otros servidores GNU/Linux puedan montar carpetas remotas y utilizarlas como si fueran locales.
- Crea en el servidor un volumen lógico de 1 GB dentro del grupo de volúmenes existente (basado en el RAID5). Ese volumen será el que se compartirá mediante NFS. Formatea el volumen.
- Monta el volumen en un directorio del servidor (por ejemplo
/srv/nfs) de forma permanente, para que siga montado después de reiniciar. Configura el servicio NFS para exportar dicho directorio a la red local, de modo que cualquier servidor del mismo segmento pueda acceder con permisos de lectura y escritura. - En
backend1, monta el directorio compartido en una carpeta local. - Haz lo mismo en
backend2. - Crea una página web en dicho directorio y añade un alias en el sitio web de los dos backends (el que se sirve con
app.tunombre.org) para que se sirva dicha página: como las peticiones se reparten entre los dos, si solo lo añades en uno, la mitad de las veces la página no se encontrará. Si al crearla obtienes Permission denied, piensa por qué (recuerda la opciónroot_squashy cómo comprueba NFS los permisos) y resuélvelo dando los permisos adecuados en el servidor. - Configura los servidores backend para que el montaje NFS se realice automáticamente al arrancar utilizando una unidad de montaje de systemd.
Pregunta: ¿Ha habido algún problema de que el directorio esté compartido en los dos servidores? ¿Qué ocurre si modificas el fichero en uno de ellos? ¿Por qué con NFS no pasa lo mismo que con el disco iSCSI montado en dos máquinas?
Vídeo de demostración
Además de las capturas y ficheros de configuración, debes grabar un vídeo de 3 a 6 minutos mostrando tu escenario funcionando en directo, con narración en voz explicando qué está pasando y por qué. No repitas en el vídeo el contenido de los ficheros de configuración: eso ya se entrega por escrito.
Se valorará que la explicación hablada demuestre que entiendes lo que ocurre en cada paso, no solo que el resultado en pantalla sea el esperado. Sube el vídeo a YouTube (puede ser como oculto / no listado) y añade la URL en la incidencia de Redmine junto con el resto de la entrega.