Load Balancer Nginx

Cada dia las aplicaciones se convierten en mas concurrentes y en ocasiones nuestros servidores no dan abasto para tanta carga y da la necesidad de poder distribuir el peso de las aplicación en mas de un servidor (Divide y conquista).

La cosa es que este concepto de balanceo de cargas puede ser implementado desde servidores web hasta servidores de base de datos, ejemplo puedo balancear la carga de un servidor mysql o MongoDB (Eso sera ya otro tutorial 🙂 ).

Balanceo de carga con Nginx

Balancear la carga con nginx es tan facil como configurar un virtual host (vhost)

Basta con esto para tener balanceado nuestro servidor nginx

http {
    upstream test_app {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://test_app;
        }
    }
}

En la sección de upstream es donde colocamos los diferentes servidores donde queremos apuntar, mi conf de nginx quedaria de esta forma:

http {
    upstream test_app {
        server 127.0.0.1:8080;
        server 127.0.0.1:9090;
    }

    server {
        listen 80;
        server_name balancer.dev;

        location / {
            proxy_pass http://test_app;
        }
    }
}

Para visualizar el balance usaremos esta mini aplicación realizada en nodejs, la cual solo imprime un hola mundo con el puerto en el cual esta corriendo.

server.js

var http = require('http');

var args = process.argv;

/* Este es el numero que estaremos pasando como server port */
var port = parseInt( args[2] ) 

console.log(args);

var server = http.createServer(function(req,res){
    res.end('hola server ' + port);
});

server.listen(port);

console.log(port)

console.log("Servidor corriendo en el puerto " + port)

Digamos que ahora ejecutamos nuestro servidores de aplicación:

node server.js 8080 &
node server.js 9090 &

Una vez ejecutado todo esto y nuestro servidor web nginx corriendo, si vamos a la url http://balancer.dev debería de direccionar a uno de nuestras app nodejs, si ejecutamos nuevamente nos mostrara otro contenido y asi cada vez que realicemos un request, la proporción actual es de 50% 50% lo que no hay preferencia en redireccionar a ninguna app.

Si quieres que un servidor tengas mas request el el otro, es necesario usar este atributo weight en nuestro conf de nginx

server 127.0.0.1:8080 weight=3;

Referencia

Nginx balanceo de carga
Nginx health-check

Este en un libro en ingles de mas detalles de como trabajar con este servidor web

Libro