Come caricare le app di bilanciamento di NodeJs usando Nginx?

In questo articolo impareremo come caricare le applicazioni di Bilanciamento di NodeJs utilizzando Nginx.

All'inizio, se non hai familiarità con Nginx, leggi l'articolo nel link sottostante per capire cos'è Nginx.

IL PROBLEMA

Se l'applicazione non ha molte richieste, non è necessario utilizzare il bilanciamento del carico, ma quando l'applicazione diventerà famosa e popolare :) sarà in grado di gestire molti accessi al traffico, quindi la configurazione di NodeJ singola non è flessibile per farlo.

In questa immagine puoi vedere come funziona una singola configurazione di NodeJs con proxy inverso Nginx.

configurazione Nodejs singola con proxy inverso

SOLUZIONE

Nelle app ad alto traffico dobbiamo distribuire le richieste tra più server http come questo diagramma.

Nel nostro esempio abbiamo 4 istanze di un'app Node.js che ascoltano su porte diverse, inoltre puoi eseguire le tue istanze su altri server con IP diversi.

Questa è una semplice applicazione Nodejs.

const http = request ('http');
const hostname = '127.0.0.1';
const port = process.argv [2] || 3000;
const server = http.createServer ((req, res) => {
res.statusCode = 200;
res.setHeader ('Content-Type', 'text / plain');
res.end ('Hello World \ n');
});
server.listen (port, hostname, () => {
console.log (`Server in esecuzione su http: // $ {hostname}: $ {port} /`);
});

Abbiamo bisogno di un gestore processi NodeJs per eseguire le nostre app NodeJs in background, quindi utilizziamo il gestore processi pm2.

Esegui l'applicazione in 4 porte diverse come questa:

pm2 start server.js -f - 444
pm2 start server.js -f - 445
pm2 start server.js -f - 446
pm2 start server.js -f - 447

Bene, ora abbiamo 4 istanze della nostra semplice applicazione NodeJs.

Crea un nuovo file in /etc/nginx/conf.d/ chiamato your-domain.com.conf e inseriscilo sopra:

Se ce l'hai, ti preghiamo di aprirlo e modificarlo.

upstream my_http_servers {
    server 127.0.0.1:444; # httpServer1 ascolta la porta 444
    server 127.0.0.1:445; # httpServer2 ascolta la porta 445
    server 127.0.0.1:446; # httpServer3 ascolta la porta 446
    server 127.0.0.1:447; # httpServer4 ascolta la porta 447
}
server {
    ascolta 80;
    nome_server tu-dominio.com www.tuo-dominio.com;
    Posizione / {
        proxy_set_header X-Real-IP $ remote_addr;
        proxy_set_header Host $ http_host;
        proxy_pass http: // my_http_servers;
    }
}

L'upstream in nginx definisce un gruppo di server. I server possono ascoltare su porte diverse. Inoltre, i server in ascolto su socket di dominio TCP e UNIX possono essere miscelati.

Scelta di un metodo di bilanciamento del carico

Il bilanciamento del carico in Nginx ha diversi metodi:

1 - Round-robin

In questo metodo le richieste vengono distribuite uniformemente tra i server tenendo conto dei pesi del server. Questo metodo viene utilizzato per impostazione predefinita (non esiste una direttiva per abilitarlo).

Nel nostro esempio:

upstream my_http_servers {
    server 127.0.0.1:444; # httpServer1 ascolta la porta 444
    server 127.0.0.1:445; # httpServer2 ascolta la porta 445
    server 127.0.0.1:446; # httpServer3 ascolta la porta 446
    server 127.0.0.1:447; # httpServer4 ascolta la porta 447
}

2 - least_conn

Una richiesta viene inviata al server con il numero minimo di connessioni attive con i pesi del server presi in considerazione:

Nel nostro esempio:

upstream my_http_servers {
    least_conn;
    server 127.0.0.1:444; # httpServer1 ascolta la porta 444
    server 127.0.0.1:445; # httpServer2 ascolta la porta 445
    server 127.0.0.1:446; # httpServer3 ascolta la porta 446
    server 127.0.0.1:447; # httpServer4 ascolta la porta 447
}

3 - ip_hash

Il server a cui viene inviata una richiesta viene determinato dall'indirizzo IP del client. In questo caso, per calcolare il valore hash vengono utilizzati i primi tre ottetti dell'indirizzo IPv4 o l'intero indirizzo IPv6. Il metodo garantisce che le richieste dallo stesso indirizzo arrivino allo stesso server a meno che non sia disponibile.

Se usi socket.io devi usare la direttiva ip_hash. Molto importante altrimenti riceverai questi errori "Richiesta non valida" dalla tua app.

È possibile ottenere ulteriori informazioni sui metodi di bilanciamento del carico sul sito Web ufficiale di nginx.

Ok, scegliamo minimum_conn;

Questo è il nostro file di configurazione finale.

upstream my_http_servers {
    least_conn;
    server 127.0.0.1:444; # httpServer1 ascolta la porta 444
    server 127.0.0.1:445; # httpServer2 ascolta la porta 445
    server 127.0.0.1:446; # httpServer3 ascolta la porta 446
    server 127.0.0.1:447; # httpServer4 ascolta la porta 447
}
server {
    ascolta 80;
    nome_server tu-dominio.com www.tuo-dominio.com;
    Posizione / {
        proxy_set_header X-Real-IP $ remote_addr;
        proxy_set_header Host $ http_host;
        proxy_pass http: // my_http_servers;
    }
}

E infine riavviare il servizio nginx.

servizio sudo riavvio nginx

Conclusione

In questo articolo abbiamo creato una semplice applicazione NodeJs e distribuiamo le richieste tra più istanze di essa.

In un altro articolo scriverò di più sulle applicazioni di NodeJ in produzione.

Infine, se hai un'idea o un'esperienza sul bilanciamento del carico delle applicazioni NodeJs, per favore dimmelo nei commenti e le aggiungerò all'articolo.