项目作者: theboshy

项目描述 :
Balanceador de cargas simple con 4 servidores de 2 instancias en go y nodejs con configuracion nginx
高级语言: Makefile
项目地址: git://github.com/theboshy/nginx-load-balancer.git
创建时间: 2018-05-18T17:56:31Z
项目社区:https://github.com/theboshy/nginx-load-balancer

开源协议:Apache License 2.0

下载


nginx-load-balancer 🚀

Pequeña demostración sobre la implementación de un Load Balancer con Nginx.
Este ejemplo cuenta con dos servicios: uno en Go y otro en Node.js. Ambos se exponen mediante Nginx, el cual implementa el método Round-Robin para balancear la carga de las solicitudes entre diferentes servidores.

📌 Para más información, consulta la documentación oficial de Load Balancing en Nginx.


🛠 Requisitos

Antes de comenzar, asegúrate de tener instaladas las siguientes herramientas:

  • Docker - Plataforma de contenedores
  • GNUWin - Herramientas GNU para Windows (opcional)

🚀 Ejecución del Proyecto

Para ejecutar el proyecto, dirígete a la carpeta de descarga y ejecuta el archivo Makefile:

  1. $ cd <[proyect_path]>
  2. $ make build

⚠️ Si prefieres no instalar GNUWin, puedes copiar los comandos manualmente desde la sección #node servers en el archivo Makefile.

Una vez finalizada la instalación, accede al servidor Nginx dentro de Docker en el puerto 8080 (xxx.xxx.xxx.xxx:8080). Luego, prueba las rutas /go y /node. Si actualizas varias veces, notarás que el mensaje mostrado cambia en cada petición, lo que indica que la carga se está distribuyendo correctamente.

Para conocer la IP del entorno Docker, ejecuta:

  1. $ docker-machine ip <MACHINE_NAME>

Si usaste la configuración predeterminada de Docker, puedes verificar la IP con:

  1. $ docker-machine ip default

Para listar todas las máquinas virtuales en ejecución, usa:

  1. $ docker-machine ls

📂 Estructura del Proyecto

📌 ./dirapp

Contiene los servicios y archivos Docker necesarios para el enrutamiento con Nginx.

🌐 goserv - Servicio en Go

Este servicio utiliza Gin Gonic para exponer un servidor REST simple.

📄 main.go

  1. import (
  2. "log"
  3. "os"
  4. "github.com/gin-gonic/gin"
  5. )
  6. func main() {
  7. r := gin.Default()
  8. r.GET("/go", func(c *gin.Context) {
  9. c.JSON(200, gin.H{
  10. "message": os.Getenv("MESSAGE"),
  11. })
  12. })
  13. if err := r.Run(":8080"); err != nil {
  14. log.Fatalf("Failed to run server: %v", err)
  15. }
  16. }

Prueba el servidor localmente con:

  1. $ go run ./main.go

Luego, accede a http://localhost:8080/go.

🌐 nodeserv - Servicio en Node.js

📄 index.js

  1. const http = require('http');
  2. http.createServer((req, res) => {
  3. res.writeHead(200, {'Content-Type': 'text/html'});
  4. res.end(`<h1>${process.env.MESSAGE}</h1>`);
  5. }).listen(8080);

Prueba el servidor con:

  1. $ node index.js

🖥 Configuración de Nginx

📌 ./nginx

Esta carpeta almacena la configuración de Nginx como balanceador de carga.

📄 Dockerfile

  1. FROM nginx
  2. RUN rm /etc/nginx/conf.d/default.conf
  3. COPY nginx.conf /etc/nginx/conf.d/default.conf
  4. EXPOSE 80

📄 nginx.conf

  1. upstream app-node {
  2. server 172.17.0.1:8081 weight=1;
  3. server 172.17.0.1:8082 weight=1;
  4. }
  5. upstream app-go {
  6. server 172.17.0.1:8083 weight=1;
  7. server 172.17.0.1:8084 weight=1;
  8. }
  9. server {
  10. listen 80;
  11. location /node {
  12. proxy_pass http://app-node;
  13. }
  14. location /go {
  15. proxy_pass http://app-go;
  16. }
  17. }

El parámetro weight define la cantidad de sesiones asignadas a cada servidor. Ejemplo:

  1. upstream app-node {
  2. server 172.17.0.1:8081 weight=100;
  3. server 172.17.0.1:8082 weight=10;
  4. }

En este caso, cuando el servidor 172.17.0.1:8081 alcance 100 sesiones, las siguientes solicitudes se dirigirán a 172.17.0.1:8082.


📌 Actualización 6/6/18 🚀

TODO: Añadir configuración de balanceadores de carga dinámicos usando docker-gen.