Implantación de Aplicaciones Web
José Juan Sánchez Hernández
Curso 2024/2025
En esta práctica vamos a configurar Nginx para que trabaje como un balanceador de carga. Se recomienda la lectura del artículo Nginx Load Balancing - HTTP Load Balancer.
La infraestructura propuesta consta de cuatro máquinas virtuales, una para el balanceador de carga (Load Balancer), dos como frontales web (Front-End) y una como servidor de base de datos MySQL (Back-End).
Tiene que utilizar máquinas virtuales EC2 de Amazon Web Services (AWS), con la última versión de Ubuntu Server.
El balanceador tendrá instalado el servidor Nginx.
Las dos máquinas que actúan como frontales web tendrán que estar configuradas para servir páginas PHP con acceso a una base de datos MySQL.
La instancia EC2 que hace de balanceador tiene que utilizar una dirección IP elástica de AWS.
Registre un nombre de dominio en algún proveedor de nombres de dominio gratuito. Por ejemplo, puede hacer uso de Freenom o No-IP.
Configure los registros DNS del proveedor de nombres de dominio para que el nombre de dominio de ha registrado pueda resolver hacia la dirección IP elástica que ha asociado con su instancia EC2 de AWS.
Instale y configure el cliente ACME Certbot en su instancia EC2 de AWS que hace balanceador para que pueda aceptar tráfico HTTPS. Siga los pasos de la documentación oficial.
En primer lugar, tendremos que instalar el servidor web Nginx.
Una vez instadlo, podemos examinar los directorios donde se almacenan los archivos de configuración de los Virtual Hosts de Nginx:
/etc/nginx/sites-available/
: Virtual Hosts
disponibles./etc/nginx/sites-enabled/
: Virtual Hosts habilitados.
Estos archivos son enlaces simbólicos a los archivos de configuración
que hay en /etc/nginx/sites-available/
.En la instalación por defecto sólo tendremos un archivo de
configuración default
en ambos directorios.
Una posible configuración para un Virtual Host que responde peticiones HTTP en el puerto 80 podría ser la siguiente:
server {
listen 80;
server_name _;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
}
Para configurar Nginx como balanceador de carga, vamos a deshabilitar el sitio por defecto eliminando el enlace simbólico con el siguiente comando:
Una vez eliminado, vamos a crear un nuevo archivo de configuración
llamado load-balancer.conf
en el directorio
/etc/nginx/sites-available/
con el siguiente contenido:
upstream frontend_servers {
server IP_FRONTEND_1;
server IP_FRONTEND_2;
}
server {
listen 80;
server_name _;
location / {
proxy_pass http://frontend_servers;
}
}
Tenga en cuenta que deberá configurar IP_FRONTEND_1 y IP_FRONTEND_2 con los valores de las direcciones IP donde quiere que Nginx redirija las peticiones HTTP.
Habilite el nuevo Virtal Host que acaba de crear.
Recargue la configuración de Nginx.
Nota: Si tiene algún problema al recargar el servicio de Nginx, puede ejecutar el siguiente comando para revisar la sintaxis del archivo de configuración.
Nginx nos permite configurar algunos
métodos de balanceo de carga dentro de la directiva
upstream
.
Round Robin: Es el método por defecto. Nginx distribuye las peticiones de manera equitativa entre los servidores que se hayan definido en el grupo. Ejemplo:
upstream frontend_servers {
server IP_FRONTEND_1;
server IP_FRONTEND_2;
}
Least Connections: Nginx envía las peticiones al servidor con menos conexiones activas. Ejemplo:
upstream frontend_servers {
least_conn;
server IP_FRONTEND_1;
server IP_FRONTEND_2;
}
IP Hash: Nginx asigna las peticiones basándose en la dirección IP del cliente. Esto permite mantener la sesión del cliente en el mismo servidor. Es útil para mantener sesiones persistentes. Ejemplo:
upstream frontend_servers {
ip_hash;
server IP_FRONTEND_1;
server IP_FRONTEND_2;
}
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
├── setup_load_balancer.sh
├── setup_letsencrypt_https.sh
├── install_lamp_frontend.sh
├── install_lamp_backend.sh
├── deploy_frontend.sh
└── deploy_backend.sh
El documento técnico README.md
tiene que estar escrito
en [Markdown][6] y debe incluir como mínimo los
siguientes contenidos:
El directorio scripts
debe incluir los siguientes
archivos:
.env
: Este archivo contiene todas las variables de
configuración que se utilizarán en los scripts de Bash.
setup_load_balancer.sh
: Script de Bash con la
automatización del proceso de instalación del servidor web Nginx como
balanceador de carga.
setup_letsencrypt_https.sh
: Script de Bash con la
automatización del proceso de solicitar un certificado SSL/TLS de Let’s
Encrypt y configurarlo en el servidor web Apache que hace de balanceador
de carga.
install_lamp_frontend.sh
: Script de Bash con la
automatización del proceso de instalación de la pila LAMP en las
máquinas de frontend.
install_lamp_backend.sh
: Script de Bash con la
automatización del proceso de instalación de la pila LAMP en la máquina
de backend.
deploy_frontend
: Script de Bash con la
automatización del proceso de instalación de la aplicación web propuesta
en el frontend.
deploy_backend
: Script de Bash con la automatización
del proceso de instalación de la aplicación web propuesta en el
backend.
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.