Implantación de Aplicaciones Web
Curso 2026/2027
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 Balancing.
Un proxy inverso (reverse proxy) es un servidor que se sitúa delante de uno o varios servidores web y recibe las peticiones de los clientes en su nombre. El cliente se comunica únicamente con el proxy inverso, que reenvía cada petición al servidor interno correspondiente y devuelve la respuesta al cliente. De este modo, el cliente no sabe qué servidor ha atendido realmente su petición.
A diferencia de un proxy directo (forward proxy), que actúa en nombre de los clientes para acceder a Internet, un proxy inverso actúa en nombre de los servidores.
Entre las funciones más habituales de un proxy inverso se encuentran:
En esta práctica utilizaremos Nginx como proxy inverso para realizar el balanceo de carga entre dos frontales web y la terminación HTTPS con un certificado de Let’s Encrypt.
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 No-IP o Duck DNS.
Configure los registros DNS del proveedor de nombres de dominio para que el nombre de dominio que 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 de 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 instalado, 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 solo 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.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 DOMAIN_NAME;
location / {
proxy_pass http://frontend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Tenga en cuenta que deberá reemplazar los siguientes valores:
server_name para que
Certbot pueda encontrar este
bloque server y configurar HTTPS de forma automática.Las directivas proxy_set_header permiten que los
frontales reciban el nombre de dominio original (Host), la
dirección IP del cliente (X-Real-IP y
X-Forwarded-For) y el protocolo utilizado por el cliente
(X-Forwarded-Proto). Si no se configuran, Nginx enviará a los frontales la cabecera
Host: frontend_servers y algunas aplicaciones web pueden
generar URLs incorrectas o bucles de redirección cuando se utiliza
HTTPS.
Habilite el nuevo Virtual 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, de modo que las peticiones de un mismo cliente siempre se envían al mismo servidor. Es útil para mantener sesiones persistentes. Tenga en cuenta que, para direcciones IPv4, solo se utilizan los tres primeros octetos, por lo que los clientes que acceden desde la misma red (o detrás de un mismo NAT) serán atendidos por el mismo servidor. 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
├── install_load_balancer.sh
├── install_lamp_frontend.sh
├── install_lamp_backend.sh
├── setup_letsencrypt_https.sh
├── deploy_frontend.sh
└── deploy_backend.sh
El documento técnico README.md tiene que estar escrito
en Markdown y debe
incluir como mínimo los siguientes contenidos:
El directorio conf debe incluir los siguientes
archivos:
load-balancer.conf: Plantilla del archivo de
configuración del proxy inverso de Nginx. Contiene los valores
IP_FRONTEND_1, IP_FRONTEND_2 y
DOMAIN_NAME, que se reemplazarán desde el script
install_load_balancer.sh.
000-default.conf: Archivo de configuración del
Virtual Host de Apache que se utilizará en los frontales web.
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.
install_load_balancer.sh: Script de Bash con la
automatización del proceso de instalación y configuración del servidor
web Nginx como proxy inverso y balanceador de carga.
install_lamp_frontend.sh: Script de Bash con la
automatización del proceso de instalación de Apache y PHP en las
máquinas de frontend.
install_lamp_backend.sh: Script de Bash con la
automatización del proceso de instalación de MySQL Server en la máquina
de backend.
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 Nginx que hace de balanceador
de carga.
deploy_frontend.sh: Script de Bash con la
automatización del proceso de instalación de la aplicación web propuesta
en el frontend.
deploy_backend.sh: Script de Bash con la
automatización del proceso de instalación de la aplicación web propuesta
en el backend.
Para no tener que editar manualmente el archivo de configuración de
Nginx, se recomienda utilizar el archivo
conf/load-balancer.conf como plantilla.
Esta plantilla contiene unos valores que actúan como marcadores y que el
script install_load_balancer.sh reemplazará por los valores
reales definidos en el archivo .env.
Plantilla conf/load-balancer.conf
upstream frontend_servers {
server IP_FRONTEND_1;
server IP_FRONTEND_2;
}
server {
listen 80;
server_name DOMAIN_NAME;
location / {
proxy_pass http://frontend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Variables del archivo scripts/.env
# Direcciones IP privadas de los frontales web
FRONTEND_1_PRIVATE_IP=172.31.10.11
FRONTEND_2_PRIVATE_IP=172.31.10.12
# Nombre de dominio registrado
CERTIFICATE_DOMAIN=practica-nginx.example.orgScript
scripts/install_load_balancer.sh
#!/bin/bash
# Muestra los comandos que se ejecutan y detiene el script si hay algún error
set -ex
# Importamos las variables de configuración
source .env
# Instalamos Nginx
apt update
apt install nginx -y
# Deshabilitamos el sitio por defecto (si sigue habilitado)
if [ -L /etc/nginx/sites-enabled/default ]; then
unlink /etc/nginx/sites-enabled/default
fi
# Copiamos la plantilla al directorio de sitios disponibles
cp ../conf/load-balancer.conf /etc/nginx/sites-available/
# Reemplazamos los marcadores por los valores del archivo .env
sed -i "s/IP_FRONTEND_1/$FRONTEND_1_PRIVATE_IP/" /etc/nginx/sites-available/load-balancer.conf
sed -i "s/IP_FRONTEND_2/$FRONTEND_2_PRIVATE_IP/" /etc/nginx/sites-available/load-balancer.conf
sed -i "s/DOMAIN_NAME/$CERTIFICATE_DOMAIN/" /etc/nginx/sites-available/load-balancer.conf
# Habilitamos el sitio (-f sobrescribe el enlace si ya existe)
ln -sf /etc/nginx/sites-available/load-balancer.conf /etc/nginx/sites-enabled/
# Comprobamos la sintaxis y recargamos la configuración
nginx -t
systemctl reload nginxEl script se debe ejecutar desde el directorio scripts,
ya que utiliza rutas relativas para acceder a los archivos
.env y ../conf/load-balancer.conf:
Observe que la plantilla original del directorio conf no
se modifica, ya que el comando sed -i se aplica sobre la
copia que se encuentra en /etc/nginx/sites-available/. De
este modo, el script se puede volver a ejecutar tantas veces como sea
necesario.
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.