Документация PM2 - Process Manager для Node.js приложений

Поделиться

Содержание

  1. Что такое PM2?
  2. Установка
  3. Основные команды
  4. Управление процессами
  5. Мониторинг и логи
  6. Режимы запуска
  7. Экосистема и конфигурация
  8. Автозапуск (startup)
  9. Модули PM2
  10. Примеры использования

Что такое PM2?

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

Установка

# Глобальная установка
npm install -g pm2

# Проверка версии
pm2 --version
# или
pm2 -v

Основные команды
Запуск приложения
bash
# Базовый запуск
pm2 start app.js

# Запуск с указанием имени
pm2 start app.js --name "my-app"

# Запуск с наблюдением за изменениями
pm2 start app.js --watch

# Запуск нескольких экземпляров (кластерный режим)
pm2 start app.js -i 4

# Запуск с максимальным использованием CPU
pm2 start app.js -i max

# Запуск с указанием лог-файлов
pm2 start app.js --output out.log --error err.log

# Запуск с ограничением памяти
pm2 start app.js --max-memory-restart 200M

# Запуск с задержкой перезапуска
pm2 start app.js --restart-delay 3000

# Запуск с cron перезапуском
pm2 start app.js --cron "0 0 * * *"
Просмотр процессов
bash
# Список всех процессов
pm2 list
pm2 ls
pm2 status
pm2 ps

# Компактный список
pm2 mini-list

# JSON вывод
pm2 jlist
pm2 prettylist

# Информация о конкретном процессе
pm2 show app-name
pm2 desc app-name
pm2 info app-name
pm2 describe app-name

# Переменные окружения процесса
pm2 env app-id
Управление процессами
Остановка и удаление
bash
# Остановка процесса
pm2 stop app-name
pm2 stop app-id
pm2 stop all

# Перезапуск
pm2 restart app-name
pm2 restart all

# Перезагрузка (graceful reload для кластера)
pm2 reload app-name
pm2 reload all

# Удаление из PM2
pm2 delete app-name
pm2 del app-id
pm2 delete all

# Отправка сигнала процессу
pm2 sendSignal SIGINT app-name
Масштабирование
bash
# Изменение количества экземпляров
pm2 scale app-name 6

# Параллельные действия
pm2 restart all --parallel 4
Мониторинг и логи
Мониторинг в реальном времени
bash
# Терминальный мониторинг
pm2 monit
pm2 imonit  # старая версия

# Дашборд с мониторингом и логами
pm2 dashboard
pm2 dash
Логи
bash
# Просмотр всех логов
pm2 logs

# Логи конкретного приложения
pm2 logs app-name

# Просмотр последних N строк
pm2 logs --lines 100

# С флагами времени
pm2 logs --time

# JSON формат логов
pm2 logs --log-type json

# Очистка логов
pm2 flush
pm2 flush app-name

# Перезагрузка лог-файлов
pm2 reloadLogs
Форматы логов
bash
# Указание формата даты в логах
pm2 start app.js --log-date-format "YYYY-MM-DD HH:mm:ss"

# Объединение логов разных инстансов
pm2 start app.js -i 4 --merge-logs

# Отключение сохранения логов
pm2 start app.js --disable-logs
Режимы запуска
Fork vs Cluster
bash
# Fork режим (по умолчанию)
pm2 start app.js
# или явно
pm2 start app.js --execute-command

# Cluster режим
pm2 start app.js -i 4
pm2 start app.js -i max  # использовать все CPU
Настройки интерпретатора
bash
# Другой интерпретатор
pm2 start script.py --interpreter python
pm2 start script.sh --interpreter bash

# Аргументы для интерпретатора
pm2 start app.js --node-args "--max-old-space-size=200"
pm2 start app.js --interpreter-args "--harmony"
Дополнительные опции запуска
bash
# Ожидание ready события
pm2 start app.js --wait-ready
pm2 start app.js --listen-timeout 3000

# Graceful shutdown
pm2 start app.js --shutdown-with-message
pm2 start app.js --kill-timeout 5000

# Без автоматического перезапуска
pm2 start app.js --no-autorestart

# Указание кодов выхода без перезапуска
pm2 start app.js --stop-exit-codes 0 1

# Запуск от конкретного пользователя
pm2 start app.js --uid john --gid developers
Экосистема и конфигурация
Создание файла экосистемы
bash
# Создание ecosystem.config.js
pm2 ecosystem
pm2 init simple
pm2 init

# Пример ecosystem.config.js
javascript
// ecosystem.config.js
module.exports = {
  apps : [{
    name: 'my-app',
    script: 'app.js',
    instances: 'max',
    exec_mode: 'cluster',
    watch: true,
    ignore_watch: ['node_modules', 'logs'],
    max_memory_restart: '200M',
    log_date_format: 'YYYY-MM-DD HH:mm:ss',
    error_file: './logs/err.log',
    out_file: './logs/out.log',
    merge_logs: true,
    env: {
      NODE_ENV: 'development',
      PORT: 3000
    },
    env_production: {
      NODE_ENV: 'production',
      PORT: 8080
    },
    cron_restart: '0 */4 * * *',
    restart_delay: 4000,
    kill_timeout: 5000,
    wait_ready: true,
    listen_timeout: 3000
  }],

  deploy : {
    production : {
      user : 'node',
      host : '192.168.1.100',
      ref  : 'origin/master',
      repo : 'git@github.com:repo.git',
      path : '/var/www/production',
      'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env production'
    }
  }
};
Запуск с ecosystem файлом
bash
# Запуск с конфигурацией
pm2 start ecosystem.config.js

# Запуск с конкретным окружением
pm2 start ecosystem.config.js --env production

# Запуск конкретного приложения из конфига
pm2 start ecosystem.config.js --only my-app
Деплой
bash
# Настройка деплоя
pm2 deploy ecosystem.config.js production setup

# Деплой
pm2 deploy ecosystem.config.js production

# Откат
pm2 deploy ecosystem.config.js production revert 1
Автозапуск (startup)
bash
# Создание скрипта автозапуска
pm2 startup
pm2 startup systemd  # для systemd

# Сохранение текущего списка процессов
pm2 save
pm2 dump

# Восстановление процессов
pm2 resurrect

# Очистка сохраненного дампа
pm2 cleardump

# Отключение автозапуска
pm2 unstartup
Модули PM2
bash
# Установка модуля
pm2 install module-name
pm2 module:install git://repo.url

# Обновление модуля
pm2 module:update module-name

# Удаление модуля
pm2 uninstall module-name
pm2 module:uninstall module-name

# Создание нового модуля
pm2 module:generate my-module

# Публикация модуля
pm2 publish
pm2 module:publish
PM2 Plus (Мониторинг)
bash
# Подключение к PM2 Plus
pm2 link secret-key public-key
pm2 plus
pm2 register

# Вход/выход из аккаунта
pm2 login
pm2 logout

# Мониторинг процесса в веб-интерфейсе
pm2 monitor app-name
pm2 unmonitor app-name
pm2 open
Системные команды
bash
# Демон PM2
pm2 ping          # проверка демона
pm2 kill          # остановка демона
pm2 updatePM2     # обновление демона
pm2 update        # алиас для updatePM2

# Профилирование
pm2 profile:mem 10    # профиль памяти за 10 сек
pm2 profile:cpu 10    # профиль CPU за 10 сек

# Отладка
pm2 inspect app-name  # инспектирование процесса

# Отчет о системе
pm2 report

# Информация о системе в JSON
pm2 sysinfos
pm2 slist
Продвинутые возможности
Наблюдение за файлами (Watch)
bash
# Включение наблюдения
pm2 start app.js --watch

# Указание расширений для наблюдения
pm2 start app.js --watch --ext "js,json"

# Игнорирование путей
pm2 start app.js --watch --ignore-watch "node_modules logs *.log"

# Задержка при изменении
pm2 start app.js --watch --watch-delay 5
Работа с PID и сигналами
bash
# Получение PID
pm2 pid app-name
pm2 pid all

# Указание pid файла
pm2 start app.js --pid /var/run/app.pid
Namespace (Пространства имен)
bash
# Запуск в определенном namespace
pm2 start app.js --namespace production
pm2 start app.js --namespace development

# Управление по namespace
pm2 list production
pm2 restart production
pm2 stop development
pm2 delete staging
Триггеры и действия
bash
# Отправка действия процессу
pm2 trigger app-name reload

# Триггер с параметрами
pm2 trigger app-name log "Hello World"
Примеры использования
Пример 1: Простое Node.js приложение
bash
# Запуск с базовыми параметрами
pm2 start server.js --name web-app
pm2 save
pm2 startup
Пример 2: API сервер в кластерном режиме
bash
# Запуск API на всех ядрах
pm2 start api.js -i max --name api-server \
  --max-memory-restart 500M \
  --log-date-format "YYYY-MM-DD HH:mm" \
  --time
Пример 3: Микросервисная архитектура
javascript
// ecosystem.config.js
module.exports = {
  apps: [
    {
      name: 'auth-service',
      script: './services/auth.js',
      instances: 2,
      env: { PORT: 3001 }
    },
    {
      name: 'user-service',
      script: './services/users.js',
      instances: 2,
      env: { PORT: 3002 }
    },
    {
      name: 'frontend',
      script: './frontend/server.js',
      instances: 1,
      env: { PORT: 3000 }
    }
  ]
};
Пример 4: Python приложение
bash
# Запуск Python скрипта
pm2 start script.py --interpreter python3 \
  --name python-app \
  --watch \
  --max-memory-restart 100M
Пример 5: Разработка с автоматической перезагрузкой
bash
# Режим разработки
pm2 start dev-server.js --name dev \
  --watch \
  --ignore-watch "node_modules .git" \
  --watch-delay 2 \
  --no-autorestart \
  --log-date-format "HH:mm:ss"
Пример 6: Production с ротацией логов
bash
# Настройка ротации логов
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
Пример 7: HTTP сервер для статики
bash
# Раздача статических файлов
pm2 serve ./public 8080 --name static-server \
  --spa \
  --watch \
  --basic-auth-username admin \
  --basic-auth-password secret
Пример 8: Работа с переменными окружения
bash
# Передача переменных окружения
pm2 start app.js --env NODE_ENV=production
pm2 start app.js --update-env  # обновить окружение

# Использование .env файла
pm2 start app.js --env production --update-env
Советы и рекомендации
Graceful Shutdown
javascript
// В вашем приложении
process.on('SIGINT', function() {
  console.log('Получен SIGINT, завершаем работу...');
  server.close(() => {
    console.log('Сервер остановлен');
    process.exit(0);
  });
});
Проверка готовности (Ready)
javascript
// После инициализации приложения
process.send('ready');
Управление памятью
bash
# Ограничение памяти и авто-перезапуск
pm2 start app.js --max-memory-restart 200M \
  --exp-backoff-restart-delay 1000
Алиасы для частых команд
bash
# Создание алиасов в .bashrc
alias pm2list='pm2 list'
alias pm2logs='pm2 logs'
alias pm2restart='pm2 restart all'
Полезные ссылки
Официальный сайт PM2

Документация

GitHub репозиторий

PM2 Plus

Часто задаваемые вопросы
Q: Как обновить PM2 без остановки процессов?

bash
pm2 update
Q: Как посмотреть использование памяти процессом?

bash
pm2 monit
# или
pm2 show app-name
Q: Как перенести процессы на другой сервер?

bash
# На старом сервере
pm2 save
# Скопировать ~/.pm2/dump.pm2 на новый сервер
# На новом сервере
pm2 resurrect
Эта документация охватывает основные возможности PM2. Для более детальной информации обращайтесь к официальной документации.

text

Эта документация включает:
- Полный разбор всех команд из `--help`
- Практические примеры для каждой команды
- Структурированное содержание с навигацией
- Примеры конфигурационных файлов
- Сценарии использования от простых до сложных
- Советы по лучшим практикам