En el post anterior vimos como instalar un servidor nginx. Una de las capacidades que tiene ngin-x es ser un potente servidor proxy, utilizado como balanceador de carga. En este post vamos a ver como usarlo para balancear la carga de dos WebAPPs (podrían ser tantas como fueran necesarias). Este escenario presenta una particularidad que obliga a modificar ligeramente el procedimiento normal para esta operación.
Partimos de una máquina linux con ngin-x instalado, tal como se vió en el post anterior.
Además vamos a crear dos WebAPPs simples, con un mensaje que nos diferencie entre cada una de ellas por ejemplo, tal como se ve en las siguientes imágenes:
A continuación vamos a configurar ngin-x siguiendo las pautas normales. Entramos al servidor linux en una consola de comando y editamos el fichero de congiguración con nano por ejemplo:
sudo nano /etc/nginx/nginx.conf
Y modificamos el script para que quede como el siguiente código:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
upstream bloqueprimerproxy {
server xxURL1xx.azurewebsites.net;
server xxURL2xx.azurewebsites.net;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://bloqueprimerproxy;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
En donde xxURL1xx.azurewebsites.net y xxURL2xx.azurewebsites.net son las URLs de las dos WebAPPs a balancear.
Grabamos el código y reiniciamos el servicio ngin-x con:
sudo service nginx restart
El script anterior sería la forma normal de balancear dos WEBs con ngin-x. Pero si lo probamos ahora obtendremos el siguiente error:
Ésto se debe a que Azure App Service usa cookies para ARR (Application Request Routing). Es necesario asegurarse que el proxy pasa la cabecera de forma correcta a la WebAPP para que ésta identifique la petición correctamente.
Para esto editamos de nuevo el fichero de configuración y lo dejamos como sigue:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
upstream bloqueprimerproxy {
server localhost:8001;
server localhost:8002;
}
upstream servidor1 {
server xxURL1xx.azurewebsites.net;
}
upstream servidor2 {
server xxURL2xx.azurewebsites.net;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://bloqueprimerproxy;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 8001;
server_name servidor1;
location / {
proxy_set_header Host xxURL1xx.azurewebsites.net;
proxy_pass http://servidor1;
}
}
server {
listen 8002;
server_name servidor2;
location / {
proxy_set_header Host xxURL2xx.azurewebsites.net;
proxy_pass http://servidor2;
}
}
}
En donde igual que antes xxURL1xx.azurewebsites.net y xxURL2xx.azurewebsites.net son las URLs de las dos WebAPPs a balancear.
En este script lo que hacemos es aplicar un doble proxy, de tal forma que balanceamos la entrada contra el mismo ngin-x, atacando por los puertos 8001 y 8002, del cual encaminamos a las WebAPPs, pero añadiendo a la cabecera la URL real de la WebAPP.
Tras grabar el script y reiniciar el servicio ngin-x, si entramos al mismo veremos que nos balancea de una a otra web sin problema.
Para saber más sobre los modos de balanceo disponibles en ngin-x podeis consultar este enlace.


