PM2 для Node.js: запуск, мониторинг и развёртывание
Развёртывание — одна из самых важных и окончательных стадий разработки ПО. Правильная стратегия развёртывания дает лучший опыт пользователям и экономно использует ресурсы. Но этот этап приносит и свои сложности.
Node.js — это среда выполнения JavaScript вне браузера. Она популярна для бэкенда благодаря высокой скорости разработки и богатому экосистему модулей. Но что делать, если ваше Node.js-приложение падает в продакшне? В этой статье вы узнаете, как снизить риск простоев и быстро восстановить сервис.
Что такое PM2 и зачем он нужен
PM2 — это демон-менеджер процессов для Node.js. Коротко:
- Держит процессы живыми (auto-restart) при падениях.
- Позволяет перезагружать процессы без даунтайма (reload).
- Поддерживает кластерный режим и простое масштабирование.
- Собирает логи и предоставляет встроенный мониторинг.
- Настраивает автозапуск после перезагрузки сервера.
Определение: демон — это фоновый процесс, который управляет другими процессами и работает независимо от пользовательских сессий.
Важно: без менеджера процессов вам придётся вручную перезапускать сервисы при падении. PM2 автоматизирует это и уменьшает операционные затраты.
Установка PM2 на Linux
Перед установкой убедитесь, что на сервере установлены Node.js и npm. Если вы используете nvm, активируйте нужную версию Node.
Установите PM2 глобально командой:
npm install -g pm2Флаг -g устанавливает пакет глобально. В зависимости от прав пользователя может понадобиться sudo:
sudo npm install -g pm2Примечание: если вы используете контейнеры (Docker), установка глобального PM2 не всегда нужна — в контейнере обычно запускают один процесс и используют оркестраторы.
Запуск Node-приложений с PM2
Перейдите в каталог проекта и запустите входной файл:
pm2 start index.jsПример:
pm2 start index.js(В некоторых окружениях между pm2 и start могут быть неразрывные пробелы; используйте корректную раскладку клавиатуры.)
Чтобы перезапустить приложение после правок:
pm2 restart index.jsЧтобы остановить приложение:
pm2 stop index.jsЧтобы удалить процесс из управления PM2:
pm2 delete index.jsЗапуск npm-скрипта через PM2 (например, скрипт start из package.json):
pm2 start npm --name my-app -- startЧтобы обеспечить восстановление процессов после перезапуска сервера, создайте скрипт автозапуска:
pm2 startup
pm2 saveКоманда pm2 startup генерирует команду для вашей системы init/systemd; запустите её от root, если потребуется.
Важно: сохраните текущую конфигурацию командой pm2 save — тогда список процессов восстановится после reboot.
Конфигурация через ecosystem файл
Для более сложных настроек используйте ecosystem.config.js:
module.exports = {
apps: [{
name: "my-app",
script: "index.js",
instances: "max",
exec_mode: "cluster",
env: {
NODE_ENV: "development"
},
env_production: {
NODE_ENV: "production"
}
}]
}Запуск конфигурации:
pm2 start ecosystem.config.js --env productionecosystem позволяет задавать переменные окружения, режим исполнения (fork/cluster), количество инстансов и аргументы запуска.
Просмотр логов и статистики
Просмотр логов приложения:
pm2 logs Мониторинг процессов в реальном времени:
pm2 monitПросмотр метаданных процесса (версия, рестарты, uptime):
pm2 show Дополнительные команды:
- pm2 list — список процессов.
- pm2 flush — очистить все логи.
- pm2 reload
— zero-downtime перезагрузка.
Лог-менеджмент: для вращения логов можно подключить модуль pm2-logrotate:
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 30Это предотвратит переполнение диска большими лог-файлами.
Масштабирование и кластерный режим
PM2 умеет запускать ваше приложение в нескольких экземплярах и распределять нагрузку между ними (внутренний балансировщик):
pm2 scale my-app +2В ecosystem.config.js установите instances: “max” для запуска инстансов по количеству CPU.
Для обновлений без даунтайма используйте:
pm2 reload my-appReload заменяет процессы по очереди, сохраняя доступность сервиса.
Когда PM2 не подходит
- В серверлесс-архитектуре (AWS Lambda, Azure Functions) PM2 не нужен.
- При использовании Kubernetes или другого оркестратора контейнеров управления состоянием внутри контейнера обычно делегируют оркестратору.
- Для простых локальных скриптов PM2 может быть избыточен.
Альтернативы и дополнения:
- systemd — проще для одиночных системных сервисов.
- Docker + Kubernetes — для сложных кластеров и автошкалирования.
- nodemon — для разработки и автоматической перезагрузки при изменениях кода.
- forever — более простая альтернатива для автоперезапуска.
Роли и контрольные списки
Для DevOps:
- Установить PM2 и задать pm2 startup + pm2 save.
- Настроить лог-вращение (pm2-logrotate).
- Поддерживать ecosystem.config.js в репозитории.
Для разработчика:
- Проверять обработку ошибок в приложении (unhandledRejection, uncaughtException).
- Локально тестировать перезапуск и миграции.
Для SRE:
- Настроить мониторинг (Prometheus/Datadog) и алертинг по рестартам и нагрузке.
- Проводить нагрузочное тестирование и проверять масштабирование.
Критерии приёмки
- Приложение автоматически поднимается после падения.
- PM2 сохраняет список процессов и восстанавливает их после перезагрузки сервера.
- Логи агрегируются и не занимают весь диск (включено вращение).
- Обновление приложения проходит без даунтайма (pm2 reload).
Мини-методология развёртывания
- Подготовьте ecosystem.config.js и переменные окружения.
- Разверните код на сервере.
- Выполните pm2 start или pm2 start ecosystem.config.js.
- Проверьте логи pm2 logs и монитор pm2 monit.
- Включите автозапуск pm2 startup && pm2 save.
- Настройте лог-вращение и мониторинг внешними инструментами.
Безопасность и конфиденциальность
- Не храните в логах чувствительные персональные данные.
- Настройте ротацию логов и удалённый сбор логов на централизованный сервер.
- Запускайте процессы от непривилегированного пользователя, не от root, где это возможно.
- Контролируйте доступ к серверу и интерфейсам мониторинга.
Юридическая заметка: логи могут содержать персональные данные. Если вы работаете с EU/EEA пользователями, убедитесь, что хранение логов соответствует требованиям GDPR: минимизация данных, контроль доступа и политика удаления.
Шпаргалка команд PM2
pm2 start index.js # Запуск приложения
pm2 start npm --name my-app -- start # Запуск npm-скрипта через PM2
pm2 restart my-app # Перезапуск
pm2 stop my-app # Остановка
pm2 delete my-app # Удаление
pm2 list # Список процессов
pm2 logs my-app # Просмотр логов
pm2 monit # Монитор в реальном времени
pm2 show my-app # Детали процесса
pm2 save # Сохранить текущие процессы (для автозапуска)
pm2 startup # Сгенерировать команду автозапуска для systemd/init
pm2 reload my-app # Zero-downtime перезагрузка
pm2 scale my-app +2 # Добавить инстансы
pm2 install pm2-logrotate # Установить ротацию логовЧасто задаваемые вопросы
Q: Нужен ли PM2 в Docker-контейнере?
A: В простом контейнере лучше запускать один процесс без PM2 и полагаться на Docker/Kubernetes для перезапуска. PM2 может пригодиться в контейнере для запуска нескольких процессов, но это нарушает принцип одного процесса на контейнер.
Q: Как обеспечить zero-downtime при деплое?
A: Используйте pm2 reload или стратегию blue-green с балансировщиком. reload перезапускает процессы по очереди.
Q: Можно ли хранить секреты в ecosystem.config.js?
A: Лучше не хранить секреты в файлах в репозитории. Используйте секреты CI/CD или менеджер секретов и переменные окружения.
Краткое резюме
PM2 — надёжный инструмент для работы с Node.js в традиционных VPS/VM-средах. Он автоматизирует перезапуск, даёт мониторинг и упрощает масштабирование. Однако для контейнерных и серверлесс-архитектур стоит рассмотреть альтернативы.
Важно: проверяйте обработку ошибок в коде, настраивайте ротацию логов и используйте проверенные практики безопасности.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone