Менеджер процессов PM2¶
Для обеспечения непрерывной работоспособности Node.js сервера нужно либо постоянно держать открытой консоль, либо использовать менеджер процессов pm2. Он имеет встроенный балансировщик нагрузки, позволяет следить за потребляемыми ресурсами запущенных процессов, автоматически перезапускать процессы после системного сбоя и т. д.
Менеджер процессов pm2
имеется в репозитории npm и должен быть установлен в системе глобально.
1 |
|
Управление процессами¶
Запуск Node.js сервера с использованием pm2
осуществляется командой start
, которой передается путь к главному файлу приложения.
1 |
|
Команда start
инициирует запуск приложения в фоновом режиме и добавляет его в список процессов, который можно увидеть выполнив команду ls
.
1 |
|
Перечень полей таблицы:
app name
- имя приложения (по умолчанию имя главного файла без расширения), для задания собственного названия используйте при запуске параметр--name
:pm2 start app.js --name=custom_app_name
id
- уникальный идентификатор приложения;mode
- режим, в котором был запущен сервер (fork
илиcluster
);pid
- уникальный идентификатор процесса в системе;status
- статус приложения, может бытьlaunching
,online
,errored
илиstopped
;restart
- количество перезапусков;uptime
- время, прошедшее с момента запуска приложения;cpu
- нагрузка на процессор в процентах;mem
- занимаемая приложением оперативная память.
Для получения более подробной информации о количестве запросов, параметрах запуска процессов и т. д. используйте команду monit
.
За перезапуск процесса отвечает команда restart
, принимающая имя или идентификатор приложения.
1 |
|
Выполнение restart
увеличивает значение одноименного поля в списке процессов применительно к тому из них, для которого была выполнена команда.
Остановка процесса осуществляется командой stop
, которой необходимо указать либо название, либо идентификатор приложения.
1 |
|
Выполнение stop
останавливает работу приложения, но не удаляет его из списка процессов, статус при этом будет stopped
.
Чтобы остановить процесс и удалить его из списка, используйте команду delete
.
1 |
|
Посмотреть консольные логи приложения можно командой log
. Если для log
не указать приложение, то будут выведены логи всех процессов, отсортированные по времени.
1 |
|
Командам restart
, stop
, delete
и log
можно передать через пробел сразу несколько процессов для обработки.
1 |
|
Для возможности восстановления и запуска списка процессов в случае перезапуска или непредвиденного сбоя сервера, сохраните текущую конфигурацию на диск выполнив команду save
.
1 |
|
После этого сохраненные процессы могут быть запущены следующим образом.
1 |
|
Распределение нагрузки (кластеризация)¶
Запуск приложения в нескольких экземплярах, которые будут распределять между собой поступающие запросы, осуществляется с использованием параметра -i
(instances) у команды start
, с помощью которого указывается, сколько экземпляров запустить. Создание дополнительных процессов одного и того же приложения называется кластеризацией.
1 |
|
Приведенная команды запускает приложение в двух экземплярах. Помните, что для эффективной работы кластера количество дополнительных процессов не должно превышать количество ядер процессора. Чтобы запустить количество процессов равное количеству ядер, укажите параметру -i
значение max
.
1 |
|
В данном случае Node.js pm2
самостоятельно определит количество ядер процессора и создаст соответствующее количество дополнительных экземпляров.
Файл ecosystem.config.js¶
Если разработанная вами система состоит из множества приложений, которым к тому же при запуске необходимо указывать массу параметров, то при развертывании на разных серверах этот процесс займет немало времени. Чтобы оптимизировать все это, в pm2
имеется поддержка запуска приложений из конфигурационного файла - ecosystem.config.js
.
Чтобы сгенерировать шаблон ecosystem.config.js
воспользуйтесь следующей командой.
1 |
|
Теперь в директории, откуда была выполнена команда, должен появиться файл ecosystem.config.js
с таким содержимым.
ecosystem.config.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
В массиве apps
каждый элемент является объектом, описывающим конфигурацию для запуска одного приложения набором параметров. Рассмотрим основные из них:
name
- имя приложения, которое будет отображаться в списке процессов при выполнении командыpm2 list
;script
- путь к главному файлу приложения, который отвечает за запуск;instances
- запускает процесс в кластерном режиме, в качестве значения передается количество дополнительных экземпляров;disable_logs
- если задатьtrue
, то логи вестись не будут;env
- значение переменной среды окруженияNODE_ENV
в режиме разработки;env_production
- значение переменной среды окруженияNODE_ENV
в режиме эксплуатации.
ПС полным списком параметров можно ознакомиться в официальной документации.
Для запуска описанных в ecosystem.config.js
приложений, выполните команду start
с указанием пути к файлу.
1 |
|
Если вам нужно запустить только одно приложение из описанного массива, укажите параметр --only
и значение поля name
из конфигурации.
1 |
|
Лимит использования RAM¶
Менеджер процессов Node.js pm2 позволяет настроить перезапуск процесса по достижению использования им указанного объема оперативной памяти. Для этого при запуске приложения необходимо указать параметр --max-memory-restart
.
1 |
|
Значение параметра указывается в одном из трех возможных измерений:
K
(килобайты);M
(мегабайты)G
(гигабайты).
Проверка использования процессами оперативной памяти осуществляется pm2 раз в 30 секунд.
Детектирование изменений¶
В pm2 также можно настроить автоматический перезапуск приложения при изменении одного из его файлов. Для этого при старте приложения укажите параметр --watch
.
1 |
|
Процесс отслеживания изменений не завершается с остановкой процесса приложения. Чтобы отключить его, при выполнении команды stop
также необходимо передать параметр --watch
.
1 |
|
Параметр --watch
имеет ряд параметров, но их указание возможно только через файл ecosystem.config.js
.
ecosystem.config.js
1 2 3 4 5 6 7 8 9 10 11 |
|
Здесь в параметре watch
явно указывается, изменений каких директорий необходимо отслеживать. Чтобы исключить из отслеживания определенные директории, имеется параметр ignore_watch
. А с помощью watch_delay
указывается время в миллисекундах, которое необходимо выждать при перезапуске приложения, прежде чем инициировать процесс детектирования изменений.