Balanceo de carga con nginx a dos WebAPP de Azure

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:

20160505_NGINX_WebAPP_Paso02

20160505_NGINX_WebAPP_Paso03

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:

20160505_NGINX_WebAPP_Paso01

É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.

 

 

Instalación de NGINX en una VM Linux Ubuntu 16.04 en Azure

En éste post vamos a ver como instalar nginx en una máquina virtual Linux Ubuntu 16.04 LTS en Azure. Se trata de uno de los mejores servidores HTTP y proxy inversos, además de ser también un proxy IMAP/POP3. Es de código abierto.

Vamos a suponer que ya tenemos desplegada la máquina virtual linux en un estado básico. Si no, como resumen, los pasos serían:

– Crear una máquina virtual desde la galería con Ubuntu 16.04. Puedes ver mi post sobre creación de VM linux.
– Cambiar el puerto ssh por defecto. Tienes instrucciones para hacerlo en Azure en mi post al respecto.
– Actualizar el sistema, conectándonos a una sesión de consola y ejecutando:

sudo apt-get update
sudo apt-get upgrade

Éste paso siempre es recomendable antes de instalar algún paquete (salvo servidores de producción con paquetes productivos previos que habrá que estudiar si es o no conveniente).

Como vamos a instalar un servidor HTTP, si disponéis de un servidor http previo como Apache, tenéis que desinstalarlo para evitar conflictos.

Una vez con la máquina lista para instalar nginx, desde la consola ssh ejecutamos:

sudo apt-get install nginx

Y por último iniciamos el servicio nginx con:

sudo systemctl start nginx

Comprobamos que el servicio está activo con:

sudo service nginx status

Lo que ofrece información del servicio que será similar a la siguiente pantalla:

20160505_Install_NGINX_Paso02

Ya tendríamos instalado nginx, con su configuración por defecto al puerto 80. Si entramos a la máquina por dicho puerto nos aparecerá la siguiente página de cortesía:

20160505_Install_NGINX_Paso03

Para más información sobre nginx podéis acceder a su página en éste enlace.