Configurare un load balancer con NGINX per un webservice

Vedremo in questa lezione come configurare un load balancer per un webservice node.js usando nginx su windows 10. Utilizzeremo WSL.

Una volta installato e configurato WSL con una distribuzione Linux (ti consiglio di utilizzare Debian, la puoi scaricare direttamente dal Windows Store), puoi utilizzare nginx, installandolo utilizzando il seguente comando

sudo apt install nginx

Configurazione di NGINX per il load balancing

Una volta terminata l’installazione correttamente, questione di pochi secondi, possiamo procedere alla configurazione del servizio. Il file da modificare è /etc/nginx/site-avaliable/default e dovremo sostituire il contenuto con il seguente, che poi analizzeremo

upstream backend {
 server 127.0.0.1:3001;
 server 127.0.0.1:3002;
}


server {
        listen 80 default_server;
        listen [::]:80 default_server;
  
      
        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;

        server_name _;

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

Cosa abbiamo fatto? nella sezione upstream abbiamo definito un gruppo chiamato backend che contiene due processi server (sempre localhost ma con due porte diverse, e queste saranno le porte su cui avvieremo le istanze del nostro web service). Nella definizione della location / ovvero delle richieste alla root del server, queste verranno passate al gruppo di server backend definito sopra. tutto qua. Sostanzialmente abbiamo detto a nginx di operare come un proxy server verso i server interni definiti nel blocco upstream. Come viene fato il load balancing? Se ne occupa totalmente nginx, per cui noi non dobbiamo preoccuparci di nulla, di default utilizza un algoritmo tipo round robin ma altri sono definibili, fai riferimento alla documentazione per i dettagli del caso.

Definizione dei web service node.js

utilizzeremo l’esempio base dalla documentazione di express.js per definire un web service che risponda con un messaggio diverso in relazione all’istanza che prende in carico la richiesta del client. In particolare il primo server (quello sulla porta 3001 risponderà con un “ciao dal servizio A” e quello sulla 3002 risponderà “ciao dal servizio B”). I codici dei due web service sono i seguenti:

codice web service A

const express = require("express")
 
const app = express()

app.get("/", (req, res) => {
    console.log(".")
    res.send("ciao dal servizio A")
})

app.listen(3001, () => {
    console.log("service A started")
})

codice web service B

const express = require("express")

const app = express()

app.get("/", (req, res) => {
    console.log(".")
    res.send("ciao dal servizio B")
})

app.listen(3002, () => {
    console.log("service A started")
})

per entrambi i servizi il file package.json è il seguente:

{
  "name": "service_a",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "dev": "node index.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1"
  }
}

creato i due web service in cartelle diverse e avviati i dei web service semplicemente uilizzando il comando npm run dev i web service saranno attivi ma dovremo ancora avviare nginx con la nuova configurazione. Per farlo è sufficiente tornare nella finestra di WSL e utilizzare il comando

sudo service nginx start

Se il messaggio avvisa che il servizio è stato avviato correttamente, sarà sufficiente collegarsi all’indirizzo http://127.0.0.1 per ricevere il messaggio da uno dei due web service. Ricaricando più volte la pagina vedrai che le risposte arriveranno a volte da uno e a volte dall’altro. Questa è l’essenza del load balancing, per aggiungere istanze basterà aggiungere direttive server dentro al blocco upstream.

Domande

  • Che rapporto c’è tra scalabilità e load balancing?
  • Quali sono altri algoritmi per il load balancing disponibili per nginx?
  • Noi abbiamo fatto rispondere due web service differenti (anche se di poco). Nei sistemi reali invece si utilizzano istanze multiple del medesimo servizio, su macchine e/o porte diverse, perchè?