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