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