Рубрики
Uncategorized

Как развернуть Node.js Socket. Сервер IO с балансировкой нагрузки и обратным прокси с помощью PM2 & Nginx?

Представьте, что вы строите приложение с чатами, и в нем будут тысячи пользователей, как … Tagged with Node, WebDev, Nginx, DevOps.

Представьте, что вы создаете приложение с чатами, и у него будут тысячи пользователей, как вы думаете, что сервер может обрабатывать эту нагрузку?!

С двумя понятиями:

Обратный прокси Обратный прокси -сервер обеспечивает дополнительный уровень абстракции и управления, чтобы обеспечить плавный поток сетевого трафика между клиентами и серверами.

Примерами веб -серверов являются Nginx и Apache.

Балансировка нагрузки Обратный прокси -сервер может выступать в качестве «копов трафика», сидя перед вашим бэкэнд -сервером и распределяя запросы клиентов по группе серверов таким образом, чтобы максимизировать использование скорости и емко Анкет Если сервер уходит вниз, балансировщик нагрузки перенаправляет трафик на оставшиеся онлайн -серверы.

В этом уроке предполагается, что вы можете развернуть обычное приложение Nodejs с Nginx.

Во -первых, мы не будем начинать наше приложение обычно, как Узел index.js , но мы установим пакет под названием PM2 : NPM I PM2

PM2 является расширенным диспетчера процессов и балансировщиком нагрузки для приложений для производственного Node.js.

Мы запустим приложение в кластерный режим (Режим кластера позволяет масштабировать приложения Node.js для всех доступных процессоров)

Так что установите команду начала:

pm2 start index.js -i max

-i за количество экземпляров и Макс быть масштабированным по всем доступным процессорам

Чтобы остановить приложение:

pm2 stop index.js

Чтобы осмотреть журналы:

pm2 logs

Чтобы перезапустить приложение:

pm2 restart index.js

Обычно код, который запускает сервер, выглядит как:

server.listen(8000, () => {
  console.log("listening on *:8000");
});

Но для розетки. IO нам нужно больше, чем один сервер или порт для запуска нескольких экземпляров узлов, поэтому мы используем что -то подобное:

server.listen(800 + process.env.NODE_APP_INSTANCE, () => {
  console.log(`listening on *:${800 + process.env.NODE_APP_INSTANCE}`);
});

Переменная среды NODE_APP_INSTANCE устанавливается индексом экземпляра приложения, поэтому, если у нас есть четыре экземпляра, у нас будет Localhost: 8000 , Localhost: 8001 , Localhost: 8002 , Localhost: 8003

Это была часть балансировки нагрузки.

Теперь давайте пойдем, чтобы сделать обратный прокси с Nginx.

В основном файле конфигурации nginx:

http {
  server {
    # 80 for http, 443 for https
    listen 80;
    server_name example.com;

    location / {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $host;

      proxy_pass http://nodes;

      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
    }
  }


  upstream nodes {
    # enable sticky session with either "hash" (uses the complete IP address)
    hash $remote_addr consistent;
    # or "ip_hash" (uses the first three octets of the client IPv4 address, or the entire IPv6 address)
    # ip_hash;
    # or "sticky" (needs commercial subscription)
    # sticky cookie srv_id expires=1h domain=.example.com path=/;

    server example.com:8000;
    server example.com:8001;
    server example.com:8002;
    server example.com:8003;
  }
}

Итак, давайте поймем эту строку файла по строке:

Во -первых, в конфигурации сервера мы прослушиваем порт по умолчанию HTTP, который составляет 80, 443 для HTTPS.

Затем доменное имя сервера

Затем в корневом месте мы установили пару заголовков:

  • Заголовок X-Forwarded-FOR (XFF) представляет собой DE-FACTO стандартный заголовок для идентификации исходного IP-адреса клиента, подключенного к веб-серверу через HTTP-прокси или балансировщик нагрузки. Когда между клиентами и серверами перехватывается трафик, журналы доступа к серверу содержат IP -адрес прокси или балансировщика нагрузки. Чтобы увидеть исходный IP-адрес клиента, используется заголовок запроса X-Forwarded-For.

  • Заголовок хоста, чтобы определить, на какой сервер должен быть направлен запрос.

Мы сейчас передаем proxy_pass

  • http -версия — 1.1 версия, которая поддерживает веб -билет

  • Обновление HTTP используется для обозначения предпочтения или требования переключения на другую версию HTTP или на другой протокол, если это возможно, поэтому здесь, в сокете. Реализация IO нам нужно обновить на подключение к WebSocket

Если вы не знаете, как сокет. Я работаю под капюшоном Я предлагаю вам прочитать Эта страница из розетки. В io документация.

  • Block вверх по течению узлов используется для включения липкого сеанса, так что розетка. IO мог бы работать и установить серверы, которые будет использовать наш балансировщик нагрузки, поэтому мы устанавливаем Proxy_Pass в блоке местоположения вверх по течению «узлов», чтобы он мог сделать свой обратный прокси.

Затем вам нужно будет использовать адаптер для управления данными между экземплярами, поэтому вот ссылка для Redis Adapter Docs (Наиболее рекомендуемый адаптер с nginx)

Теперь, наконец, беги NPM запускается

Надеюсь, вы нашли эту статью полезной и, пожалуйста, поделитесь своими мыслями ниже:-)

Для более полезных статей не забудьте следовать 😉

Twitter: @Amr__elmohamady

LinkedIn: Амр Эльмохамади

Оригинал: «https://dev.to/amrelmohamady/how-to-deploy-node-js-socket-io-server-with-load-balancing-reverse-proxy-using-pm2-nginx-7k0»