👉 Узнайте, как создавать готовые микросервисыв Node.js, из нашей последней электронной книги Build Layered Microservices (PDF + ePub).

При работе сервер Node.js должен иметь возможность автоматически перезапускаться в случае сбоя или перезагрузки компьютера.

Он также должен иметь возможность перезагружаться при изменении кода с минимальным временем простоя.

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

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

Начало работы с PM2

Как и при использовании Docker, приложения, управляемые PM2, можно запускать, перечислять и останавливать.

Монтаж

Чтобы установить инструмент командной строки PM2, вы можете использовать следующую команду npm:

$ npm install -g pm2

Это установит этот пакет глобально, поэтому его можно будет использовать в любом из ваших проектов.

Запуск приложения

Чтобы запустить приложение в производственном режиме, вы можете использовать команду pm2 start, которая демонизирует (т.е. запускает как фоновую задачу), контролирует и поддерживает его работу навсегда.

$ pm2 start app.js

Кроме того, вы можете использовать флаг параметра --name, чтобы дать этому процессу более явное имя, которое облегчит управление им в будущем.

$ pm2 start app.js --name <app>

Список запущенных приложений

Чтобы вывести список всех процессов, управляемых PM2, а также дополнительную информацию, такую ​​как время их работы, состояние, использование ЦП, использование памяти и т. д., вы можете использовать команду pm2 list.

$ pm2 list

Остановка запущенных приложений

Чтобы остановить работающее приложение, управляемое PM2, вы можете использовать команду pm2 stop, которая отправит вашему приложению сигнал SIGINT.

$ pm2 stop <app>

Чтобы обеспечить плавное завершение работы, убедитесь, что вы перехватили сигнал SIGINT и очистили все ресурсы, используемые вашим приложением (т. е. соединения с базой данных, задачи обработки и т. д.), прежде чем оно завершится.

process.on('SIGINT', () => {
  // close database connection
  // terminate background jobs
  // ...
});

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

Также обратите внимание, что по умолчанию PM2 будет ждать 1,6 с, прежде чем отправить еще один неперехватываемый сигнал SIGKILL, чтобы принудительно завершить процесс.

Перезапуск стратегий

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

Когда процесс завершается, демон PM2 автоматически пытается перезапустить его.

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

Вот краткий список наиболее полезных опций, предоставляемых PM2 для разграничения границ этих перезапусков.

Ручной перезапуск

Чтобы вручную перезапустить запущенный процесс — что подразумевает его предварительное уничтожение — вы можете использовать команду pm2 restart:

$ pm2 restart <app>

Перезагрузка при изменении файла

Как и в случае с Nodemon, вы можете настроить PM2 для автоматического перезапуска приложения, отслеживая изменения файлов в каталоге и подкаталогах сценария запуска, используя флаг параметра --watch:

$ pm2 start app.js --watch

Который также можно комбинировать с флагом опции --ignore-watch:

$ pm2 start app.js --watch --ignore-watch "node_modules"

Вы можете узнать больше об утилите Nodemon, прочитав нашу статью Как автоматически перезапустить ваше приложение node.js при изменении файла в режиме разработки.

Перезагрузка на пороге памяти

Флаг параметра --max-memory-restart позволяет вам перезапускать приложение всякий раз, когда оно достигает определенного порога памяти, что может помочь предотвратить ошибку «куча нехватки памяти», если, например, сервер, на котором оно работает, имеет ограниченный объем памяти, например небольшой экземпляр EC2.

$ pm2 start app.js --max-memory-restart 100M

Перезапустить с задержкой

Флаг параметра --restart-delay позволяет ждать определенное количество миллисекунд между перезапусками, что может помочь уменьшить нагрузку на базу данных или внешних поставщиков.

$ pm2 start app.js --restart-delay 3000

Перезапустить N раз

Флаг опции --max-restarts позволяет вам определить, сколько раз PM2 должен перезапускать приложение, предотвращая его вход в бесконечный цикл сбоя.

$ pm2 start app.js --max-restarts 3

Перезагрузка с 0-секундным временем простоя

В отличие от перезапуска, PM2 предлагает возможность перезагрузить ваше приложение с нулевым временем простоя с помощью команды pm2 reload:

$ pm2 reload <app>

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

Хотите узнать больше?

👉 Ознакомьтесь с другими нашими статьями о серверной части, Node.js, Linux, Docker, Git и многом другом на LearnBackend.dev.

📚 Узнайте, как создавать отраслевые готовые API в Node.js с помощью Express framework и трехуровневая архитектура в нашей последней книге Build Layered Microservices.