Как развернуть приложения Node.js в производственной среде и получить надежный конвейер для перехода от разработки к развертыванию

Это первая часть серии статей, в которой мы рассмотрим PM2 как менеджер процессов, помогающий масштабироваться в нашем приложении.



Многие из нас используют Node.js в качестве среды выполнения при создании внутренних серверов по множеству причин - это быстро, использует JavaScript, а экосистема npm не имеет себе равных. Но большинство из нас оставляют наши приложения, используя только конфигурацию по умолчанию, работающую -

node server.js

Хотя это легко, но невозможно масштабировать из-за однопоточной природы Node.js. В большинстве случаев система / виртуальная машина развертывания будет иметь более 1 используемого потока, и выполнение команды по умолчанию приведет к неоптимальному использованию доступных ресурсов, поскольку для запуска этого процесса Node.js используется только один поток. В идеале вы хотите запускать столько процессов Node.js, сколько доступно вам ядер / потоков (для монолитного приложения).

Здесь на помощь приходит PM2. PM2 - менеджер производственных процессов для приложений Node.js. Использование PM2 имеет множество преимуществ - запуск нескольких экземпляров Node.js, расширенный мониторинг и ведение журнала, плавный перезапуск и т. Д.

Мы будем использовать фиктивное приложение Node.js, которое я создал для этой демонстрации. Вы можете найти исходное состояние перед любой конфигурацией PM2, здесь. Ветвь master всегда будет содержать последнее состояние проекта в зависимости от того, когда вы это читаете, поэтому, чтобы найти исходный код, переключитесь на ветвь initial. В этом руководстве мы будем работать в ветке pm2.

Во-первых, нам нужно установить PM2 как глобальную зависимость. Для этого:

npm i -g pm2@latest

Некоторым людям, возможно, придется запустить эту команду, используя sudo.

Кроме того, еще одна вещь, которую вы, возможно, захотите сделать, - это загрузить PM2 во время запуска системы, и в зависимости от того, на какой ОС вы работаете, все может отличаться. Но, к счастью, PM2 позаботился и об этом:

pm2 startup

Это распечатает команду, которую вам нужно запустить, которая позволит PM2 загрузиться при запуске системы. Эта команда потребует от вас использовать sudo

Теперь мы уже можем запустить несколько экземпляров нашего приложения Node.js, просто используя PM2 из командной строки, указав конфигурацию в аргументах -

pm2 start server.js -i 0

Эта команда будет запускать столько процессов Node.js, сколько доступно для использования потоков / ядер. При желании вы можете настроить количество процессов, заменив 0 любым числом, которое вам нравится.

Полезные дополнительные команды, которые вы должны знать, включают:

# List all processes
pm2 list
# Monitoring
pm2 monit
# Stop All Processes
pm2 stop all
# Delete All Processes
pm2 delete all
# Start All Processes
pm2 start all

Хотя это работает довольно хорошо, мне нравится более индивидуальный подход к этому, и мы можем добиться, чтобы мы использовали файл с именем ecosystem.config.js, и мы можем легко сгенерировать шаблон для этого, используя - pm2 ecosystem
Мы не собираемся использовать раздел deploy этого файла для этого примера, поэтому мы можем его удалить. Мы собираемся изменитьecosystem.config.js, чтобы он выглядел примерно так -

Хорошо, это много терминов, которые нужно объяснить, но мы справимся с этим. Список apps содержит список всех приложений Node.js, которые мы хотим запустить, а в нашем случае это только одно приложение, которое у нас есть. Давайте посмотрим на свойства объекта в appslist.

  • имя относится к имени приложения, с которым PM2 будет ссылаться на него. Это отобразится в списке процессов.
  • скрипт - это начальная точка приложения, которая является для нас файлом server.js.
  • экземпляров относится к количеству процессов Node.js, порождаемых PM2, это может быть любое количество. Установка его на max порождает процессы, равные количеству потоков / ядер.
  • exec_mode - это свойство, которое позволяет нашему приложению Node.js масштабироваться по ядрам ЦП, установив его в режим cluster. По сути, этим мы реализуем «балансировку нагрузки» для повышения производительности нашего приложения.
  • Следующий объект - это переменные среды для приложения, и мы можем иметь столько из них, сколько нам нужно, каждая из которых начинается с env_ *. В данном случае у нас есть два: PORT и NODE_ENV.

Это все, что нам нужно для запуска нашего приложения. Теперь давайте изменим наш сценарий запуска в package.json файле, чтобы использовать PM2.

start: "pm2 start ecosystem.config.js --env production"

Поздравляю! Теперь у вас есть приложение Node.js, масштабированное для использования всех доступных ядер ЦП, а также дополнительные функции, такие как плавное завершение работы / перезапуск, мониторинг и т. Д.

Большое вам спасибо, если вы зашли так далеко, и я надеюсь, что это было полезно. Пожалуйста, поделитесь этим, и мы будем благодарны за любые отзывы. Увидимся в части 2.