Как да заредите приложения за балансиране на NodeJs с помощта на Nginx?

В тази статия ще научим как да зареждаме приложения за балансиране на NodeJs с помощта на Nginx.

В началото, ако не сте запознати с Nginx, моля, прочетете статията в линка по-долу, за да разберете какво е Nginx.

ПРОБЛЕМЪТ

Ако в приложението ви няма много заявки, не е необходимо да използвате балансиране на натоварването, но когато приложението ви стане известно и популярно :), то ще може да обработва много посещения в трафика, така че настройката на единични NodeJs не е гъвкава за това.

На тази снимка можете да видите как работи една настройка на NodeJs с обратен прокси Nginx.

единична настройка на Nodejs с обратен прокси

РЕШЕНИЕ

В приложения с висок трафик трябва да разпределяме заявки между множество http сървъри като тази диаграма.

В нашия пример имаме 4 случая на едно приложение Node.js, което слушате на различни портове, също така можете да стартирате вашите копия на други сървъри с различни IP адреси.

Това е обикновено приложение Nodejs.

const http = изисквам ('http');
const име на хоста = '127.0.0.1';
const port = process.argv [2] || 3000;
const server = http.createServer ((req, res) => {
res.statusCode = 200;
res.setHeader („Тип съдържание“, „текст / обикновен“);
res.end ('Hello World \ n');
});
server.listen (порт, име на хост, () => {
console.log (`Сървър работи на http: // $ {hostname}: $ {port} /`);
});

Нуждаем се от мениджър на процеси NodeJs, за да стартираме нашите приложения NodeJs във фонов режим, така че използваме pm2 мениджър на процеси.

Стартирайте приложението в 4 различни порта като този:

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

Е, сега имаме 4 случая на нашето просто приложение NodeJs.

Създайте нов файл в /etc/nginx/conf.d/ наречен your-domain.com.conf и го поставете върху него:

Ако го имате, моля, отворете го и го редактирайте.

нагоре my_http_servers {
    сървър 127.0.0.1.4544; # httpServer1 слуша порт 444
    сървър 127.0.0.1.4545; # httpServer2 слуша порт 445
    сървър 127.0.0.1.4546; # httpServer3 слуша порт 446
    сървър 127.0.0.1.4547; # httpServer4 слуша порт 447
}
сървър {
    слушайте 80;
    име на сървър your-domain.com www.your-domain.com;
    местоположение / {
        proxy_set_header X-Real-IP $ remote_addr;
        proxy_set_header Хост $ http_host;
        proxy_pass http: // my_http_servers;
    }
}

Нагоре в nginx дефинира група сървъри. Сървърите могат да слушат на различни портове. В допълнение, сървърите, които слушат на TCP и UNIX домейн сокове, могат да бъдат смесени.

Избор на метод за балансиране на натоварването

Балансирането на натоварването в Nginx има различни методи:

1 - Кръг-робин

При този метод заявките се разпределят равномерно на сървърите с тежести на сървъра, взети под внимание. Този метод се използва по подразбиране (няма директива за разрешаването му).

В нашия пример:

нагоре my_http_servers {
    сървър 127.0.0.1.4544; # httpServer1 слуша порт 444
    сървър 127.0.0.1.4545; # httpServer2 слуша порт 445
    сървър 127.0.0.1.4546; # httpServer3 слуша порт 446
    сървър 127.0.0.1.4547; # httpServer4 слуша порт 447
}

2 - най-малко_кон

Заявка се изпраща до сървъра с най-малък брой активни връзки с тежести на сървъра, взети под внимание:

В нашия пример:

нагоре my_http_servers {
    least_conn;
    сървър 127.0.0.1.4544; # httpServer1 слуша порт 444
    сървър 127.0.0.1.4545; # httpServer2 слуша порт 445
    сървър 127.0.0.1.4546; # httpServer3 слуша порт 446
    сървър 127.0.0.1.4547; # httpServer4 слуша порт 447
}

3 - ip_hash

Сървърът, до който се изпраща заявка, се определя от IP адреса на клиента. В този случай за изчисляване на хеш стойността се използват или първите три октета на IPv4 адрес, или целият IPv6 адрес. Методът гарантира, че заявки от един и същ адрес стигат до един и същ сървър, освен ако не е наличен.

Ако използвате socket.io, трябва да използвате директивата ip_hash. Много важно е, че ще получите тези грешки „Невалидна заявка“ от приложението си.

Можете да получите повече информация за методите за балансиране на натоварването на официалния уебсайт на nginx.

Добре, да изберем най-малко_conn;

Това е нашият финален конфигурационен файл.

нагоре my_http_servers {
    least_conn;
    сървър 127.0.0.1.4544; # httpServer1 слуша порт 444
    сървър 127.0.0.1.4545; # httpServer2 слуша порт 445
    сървър 127.0.0.1.4546; # httpServer3 слуша порт 446
    сървър 127.0.0.1.4547; # httpServer4 слуша порт 447
}
сървър {
    слушайте 80;
    име на сървър your-domain.com www.your-domain.com;
    местоположение / {
        proxy_set_header X-Real-IP $ remote_addr;
        proxy_set_header Хост $ http_host;
        proxy_pass http: // my_http_servers;
    }
}

И накрая рестартирайте nginx услугата.

sudo service nginx рестартиране

заключение

В тази статия сме създали обикновено приложение на NodeJs и разпределяме заявки между множество негови инстанции.

В друга статия ще напиша повече за приложенията на NodeJs в производството.

И накрая, Ако имате идея или опит за балансиране на приложенията на NodeJs, моля, кажете ми в коментари и ще ги добавя към статия.