Comment charger des applications d'équilibrage NodeJs à l'aide de Nginx?

Dans cet article, nous allons apprendre à charger des applications d'équilibrage NodeJs à l'aide de Nginx.

Au début, si vous n'êtes pas familier avec Nginx, veuillez lire l'article dans le lien ci-dessous pour comprendre ce qu'est Nginx.

LE PROBLÈME

Si votre application n’a pas beaucoup de demandes, vous n’êtes pas obligé d’utiliser l’équilibrage de charge, mais lorsque votre application devient célèbre et populaire :), elle sera capable de gérer de nombreux accès de trafic. Par conséquent, la configuration d’un seul NodeJ n’est pas flexible.

Sur cette image, vous pouvez voir comment fonctionne une configuration unique de NodeJs avec le proxy inverse Nginx.

configuration unique de Nodejs avec proxy inverse

SOLUTION

Dans les applications à fort trafic, nous devons répartir les demandes entre plusieurs serveurs http, comme ce diagramme.

Dans notre exemple, nous avons 4 instances d'une application Node.js qui écoutent sur différents ports. Vous pouvez également exécuter vos instances sur d'autres serveurs avec des adresses IP différentes.

Ceci est une simple application Nodejs.

const http = require ('http');
const hostname = '127.0.0.1';
const port = process.argv [2] || 3000;
serveur const = http.createServer ((req, res) => {
res.statusCode = 200;
res.setHeader ('Content-Type', 'text / plain');
res.end ('Hello World \ n');
});
server.listen (port, nom d'hôte, () => {
console.log (`Le serveur tourne à l'adresse http: // $ {nom_hôte}: $ {port} /`);
});

Nous avons besoin d'un gestionnaire de processus NodeJs pour exécuter nos applications NodeJs en arrière-plan. Nous utilisons donc le gestionnaire de processus pm2.

Exécutez l'application dans 4 ports différents comme ceci:

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

Nous avons maintenant 4 instances de notre application simple NodeJs.

Créez un nouveau fichier dans /etc/nginx/conf.d/ appelé your-domain.com.conf et mettez-le dessus:

Si vous l'avez, ouvrez-le et éditez-le.

en amont my_http_servers {
    serveur 127.0.0.1:444; # httpServer1 écoute le port 444
    serveur 127.0.0.1:445; # httpServer2 écoute le port 445
    serveur 127.0.0.1:446; # httpServer3 écoute le port 446
    serveur 127.0.0.1:447; # httpServer4 écoute le port 447
}
serveur {
    écoutez 80;
    nom_serveur votre-domaine.com www.votre-domaine.com;
    emplacement / {
        proxy_set_header X-Real-IP $ remote_addr;
        proxy_set_header Host $ http_host;
        proxy_pass http: // my_http_servers;
    }
}

Upstream dans nginx définit un groupe de serveurs. Les serveurs peuvent écouter sur différents ports. De plus, les serveurs écoutant des sockets TCP et UNIX peuvent être mélangés.

Choix d'une méthode d'équilibrage de charge

L'équilibrage de charge dans Nginx a différentes méthodes:

1 - Round robin

Avec cette méthode, les demandes sont réparties uniformément sur les serveurs, en tenant compte de leur poids. Cette méthode est utilisée par défaut (il n'y a pas de directive pour l'activer).

Dans notre exemple:

en amont my_http_servers {
    serveur 127.0.0.1:444; # httpServer1 écoute le port 444
    serveur 127.0.0.1:445; # httpServer2 écoute le port 445
    serveur 127.0.0.1:446; # httpServer3 écoute le port 446
    serveur 127.0.0.1:447; # httpServer4 écoute le port 447
}

2 - le moins_connu

Une demande est envoyée au serveur avec le nombre le moins élevé de connexions actives avec les pondérations du serveur prises en compte:

Dans notre exemple:

en amont my_http_servers {
    less_conn;
    serveur 127.0.0.1:444; # httpServer1 écoute le port 444
    serveur 127.0.0.1:445; # httpServer2 écoute le port 445
    serveur 127.0.0.1:446; # httpServer3 écoute le port 446
    serveur 127.0.0.1:447; # httpServer4 écoute le port 447
}

3 - ip_hash

Le serveur auquel une demande est envoyée est déterminé à partir de l'adresse IP du client. Dans ce cas, les trois premiers octets de l'adresse IPv4 ou l'adresse IP entière sont utilisés pour calculer la valeur de hachage. La méthode garantit que les demandes provenant de la même adresse parviennent au même serveur, sauf si elles ne sont pas disponibles.

Si vous utilisez socket.io, vous devez utiliser la directive ip_hash. Très important, vous obtiendrez ces erreurs «Demande non valide» de votre application.

Vous pouvez obtenir plus d'informations sur les méthodes d'équilibrage de charge sur le site Web officiel de nginx.

Ok, choisissons less_conn;

Ceci est notre fichier de configuration final.

en amont my_http_servers {
    less_conn;
    serveur 127.0.0.1:444; # httpServer1 écoute le port 444
    serveur 127.0.0.1:445; # httpServer2 écoute le port 445
    serveur 127.0.0.1:446; # httpServer3 écoute le port 446
    serveur 127.0.0.1:447; # httpServer4 écoute le port 447
}
serveur {
    écoutez 80;
    nom_serveur votre-domaine.com www.votre-domaine.com;
    emplacement / {
        proxy_set_header X-Real-IP $ remote_addr;
        proxy_set_header Host $ http_host;
        proxy_pass http: // my_http_servers;
    }
}

Et enfin, redémarrez le service nginx.

sudo service nginx restart

Conclusion

Dans cet article, nous avons créé une application NodeJs simple et répartissons les demandes entre plusieurs instances.

Dans un autre article, je vais écrire davantage sur les applications NodeJs en production.

Enfin, si vous avez une idée ou une expérience concernant l’équilibrage de charge des applications NodeJs, veuillez me le signaler dans les commentaires et je les ajouterai à l’article.