Práctica 1.10

Implantación de Aplicaciones Web

Curso 2024/2025



1 Balanceador de carga con Apache

En esta práctica deberá automatizar la instalación y configuración de una aplicación web LAMP en cuatro máquinas virtuales EC2 de Amazon Web Services (AWS), con la última versión de Ubuntu Server. En esta práctica vamos a usar una máquina virtual con Apache HTTP Server como un proxy inverso para hacer de balanceador de carga.

El objetivo de esta práctica es crear una arquitectura de alta disponibilidad que sea escalable y redundante, de modo que podamos balancear la carga entre todos los frontales web.

La arquitectura estará formada por:

Necesitará crear cuatro máquinas virtuales:

1.1 ¿Qué es un balanceador de carga?

Un balanceador de carga es un dispositivo hardware o software que se pone al frente de un conjunto de servidores y se encarga de asignar o balancear las peticiones que llegan de los clientes hacia los servidores.

Estos dispositivos permiten distribuir el tráfico de red entre varios servidores o dispositivos de red, con el fin de mejorar el rendimiento y la disponibilidad de un sistema o aplicación.

Ejemplos de balanceadores de carga hardware:

Ejemplos de balanceadores de carga software:

Se recomienda la lectura de las siguientes referencias:

1.2 ¿Qué es un proxy inverso?

Un proxy inverso es un tipo de servidor proxy que hace de intermediario entre un cliente y uno o más servidores. El cliente realiza las peticiones a los servidores a través del proxy inverso y las respuestas de los servidores hacia el cliente también se envían a través del proxy inverso.

En esta práctica vamos a configurar un servidor web Apache como proxy inverso para que trabaje como balanceador de carga para el tráfico HTTP y HTTPS.

Se recomienda la lectura de la siguiente referencia:

1.3 Activación de los módulos necesarios de Apache para configurarlo como proxy inverso

Para configurar el servidor web Apache como proxy inverso tenemos que activar como mínimo los siguientes módulos:

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer

A continuación, se muestra una breve descripción de cada uno de ellos:

Después de habilitar los módulos es necesario reiniciar el servicio de Apache.

sudo systemctl restart apache2

Otros módulos

También es posible activar otros módulos que nos permiten realizar otras tareas según nuestras necesidades:

1.4 Configuración de la política de balanceo de carga

Para configurar la política de balanceo de carga es necesario tener activado previamente el módulo proxy_balancer con el siguiente comando:

sudo a2enmod proxy_balancer

El balanceo de carga que vamos a utilizar en esta práctica será un balanceo de tipo Round Robin. Este método de balanceo de carga consiste en distribuir las peticiones entre los servidores de forma secuencial, de forma que cada vez que llegue una nueva petición se envía al siguiente servidor de la lista de servidores configurados en el servidor Apache.

Para activar este método de balance tenemos que activar el módulo lbmethod_byrequests:

sudo a2enmod lbmethod_byrequests

Este método de balanceo también permite distribuir las peticiones entre los servidores en función de los parámetros lbfactor y lbstatus.

Puede consultar más información sobre este módulo en la documentación oficial.

Recuerde que después de habilitar los módulos es necesario reiniciar el servicio de Apache.

sudo systemctl restart apache2

Otros métodos de balanceo de carga

Los módulos disponibles para configurar el método de balanceo de carga son los siguientes:

1.5 Configuración de Apache para trabajar como balanceador de carga para el tráfico HTTP

Paso 1. Creación de un nuevo archivo de VirtualHost

Creamos un nuevo archivo de configuración para crear un VirtualHost con la configuración del proxy inverso.

Creamos el archivo load-balancer.conf en el directorio /etc/apache2/sites-available:

sudo nano /etc/apache2/sites-available/load-balancer.conf

Le añadimos las directivas Proxy y ProxyPass.

<VirtualHost *:80>
    <Proxy balancer://mycluster>
        # Server 1
        BalancerMember http://IP_HTTP_SERVER_1

        # Server 2
        BalancerMember http://IP_HTTP_SERVER_2
    </Proxy>

    ProxyPass / balancer://mycluster/
</VirtualHost>

Tendremos que reemplazar IP_HTTP_SERVER_1 y IP_HTTP_SERVER_2 por las direcciones IPs de las dos máquinas que estamos utilizando como Front-End.

Paso 2. Habilitamos el VirtualHost que acabmos de crear

Habilitamos el VirtualHost que acabamos de crear con el siguiente comando:

sudo a2ensite load-balancer.conf 

Deshabilitamos el VirtualHost que tiene Apache configurado por defecto:

sudo a2dissite 000-default.conf 

Puede consultar los VirtualHost que tiene habilitados Apache con el comando:

sudo apache2ctl -S

Paso 3. Reiniciamos el servicio de Apache

Una vez aplicados los cambios reiniciamos el servicio de Apache:

sudo systemctl restart apache2

1.6 Configuración de Apache para trabajar como balanceador de carga para el tráfico HTTPS

Una vez que haya comprobado que el balanceo de carga del tráfico HTTP se realiza de forma correcta, puede empezar a configurar el balanceador de carga para el tráfico HTTPS.

Para poder habilitar el protocolo HTTPS en el balanceador es necesario obtener un certificado de SSL/TLS. Este certificado tiene que ser emitido por una autoridad de certificación (AC). En esta práctica vamos a utilizar Certbot para obtener un certificado de la Autoridad de Certificación Let’s Encrypt.

Se recomienda la lectura de la práctica HTTPS con Let’s Encrypt y Certbot para conocer cuáles son los pasos necesarios para obtener un certificado de Let’s Encrypt con Certbot.

Los pasos que tendrá que realizar son los siguientes:

1.7 Entregables

Deberá crear un repositorio en GitHub con el nombre de la práctica y añadir al profesor como colaborador.

El repositorio debe tener el siguiente contenido:

Además del contenido anterior puede ser necesario crear otros archivos de configuración. A continuación se muestra un ejemplo de cómo puede ser la estructura del repositorio:

.
├── README.md
├── conf
│   ├── load-balancer.conf
│   └── 000-default.conf
└── scripts
    ├── .env
    ├── install_load_balancer.sh
    ├── install_lamp_frontend.sh
    ├── install_lamp_backend.sh
    ├── setup_letsencrypt_https.sh
    └── deploy.sh

1.7.1 Documento técnico

El documento técnico README.md tiene que estar escrito en Markdown y debe incluir como mínimo los siguientes contenidos:

1.7.2 Scripts de Bash

El directorio scripts debe incluir los siguientes archivos:

2 Referencias

3 Licencia

Licencia de Creative Commons
Esta página forma parte del curso Implantación de Aplicaciones Web de José Juan Sánchez Hernández y su contenido se distribuye bajo una licencia Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional.