Мониторинг: PM2

PM2 (Process Manager 2) — менеджер процессов для Node.js production-окружений: обеспечивает автозапуск при сбоях, кластерный режим, мониторинг и управление логами.

Зачем нужно

node app.js завершится при любой необработанной ошибке. PM2 перезапускает процесс автоматически, запускает несколько воркеров (cluster mode) для использования всех CPU-ядер, ротирует логи и предоставляет встроенный мониторинг. Это минимальный production-стандарт для Node.js без Kubernetes.

Где используется

  • Production-серверы без Docker/Kubernetes (VPS, DigitalOcean)
  • Запуск нескольких Node.js-приложений на одном сервере
  • Cluster mode — горизонтальное масштабирование на многоядерном CPU
  • CI/CD деплой с нулевым простоем (zero-downtime reload)

Основной контент

Установка и базовые команды

npm install -g pm2

# Запустить приложение
pm2 start app.js --name "my-api"

# Список запущенных процессов
pm2 list
pm2 status

# Просмотр логов
pm2 logs              # все процессы
pm2 logs my-api       # конкретный процесс
pm2 logs --lines 100  # последние 100 строк

# Мониторинг в реальном времени
pm2 monit

# Управление процессами
pm2 restart my-api
pm2 stop my-api
pm2 delete my-api
pm2 reload my-api  # zero-downtime reload (cluster mode)

Cluster mode — все CPU

# Запустить столько воркеров, сколько CPU-ядер
pm2 start app.js -i max --name "my-api"

# Указать конкретное число
pm2 start app.js -i 4 --name "my-api"

# Zero-downtime перезагрузка (без разрыва соединений)
pm2 reload my-api

ecosystem.config.js — декларативная конфигурация

// ecosystem.config.js
module.exports = {
  apps: [
    {
      name: 'api',
      script: './src/app.js',
      instances: 'max',        // cluster mode
      exec_mode: 'cluster',
      watch: false,            // не перезапускать при изменении файлов
      max_memory_restart: '500M', // перезапуск при превышении памяти

      env: {
        NODE_ENV: 'development',
        PORT: 3000
      },
      env_production: {
        NODE_ENV: 'production',
        PORT: 8080
      },

      // Логи
      out_file: './logs/out.log',
      error_file: './logs/error.log',
      log_date_format: 'YYYY-MM-DD HH:mm:ss',

      // Перезапуск при сбое
      restart_delay: 3000,    // 3 секунды до перезапуска
      max_restarts: 10        // максимум перезапусков
    },
    {
      name: 'worker',
      script: './src/worker.js',
      instances: 2,
      exec_mode: 'fork'       // не cluster для workers с state
    }
  ]
};
# Запустить по конфигу
pm2 start ecosystem.config.js --env production

# Обновить конфиг без остановки
pm2 reload ecosystem.config.js --env production

Автозапуск при перезагрузке сервера

# Сохранить список процессов
pm2 save

# Создать systemd service
pm2 startup
# Команда выведет инструкцию вида:
# sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u ubuntu --hp /home/ubuntu

# Выполнить предложенную команду, затем
pm2 save

Деплой с нулевым простоем

# В CI/CD:
pm2 reload ecosystem.config.js --env production
# PM2 поочерёдно перезагружает воркеры, не прерывая трафик

Мониторинг через PM2 Plus

# Бесплатный онлайн-мониторинг
pm2 link <secret_key> <public_key>
pm2 monitor  # открыть dashboard

Частые ошибки

  • Cluster mode с сохранением состояния в памяти — разные воркеры не делят память; использовать Redis для сессий и кеша
  • watch: true в production — перезапустит приложение при любом изменении файла (logs, uploads) — опасно
  • Не сохранять список процессов — после pm2 save и pm2 startup процессы переживут перезагрузку сервера
  • Игнорировать max_memory_restart — memory leak приведёт к OOM kill без перезапуска

Связанные темы

Ресурсы