Документация PM2 - Process Manager для Node.js приложений
Содержание
- Что такое PM2?
- Установка
- Основные команды
- Управление процессами
- Мониторинг и логи
- Режимы запуска
- Экосистема и конфигурация
- Автозапуск (startup)
- Модули PM2
- Примеры использования
Что такое 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`
- Практические примеры для каждой команды
- Структурированное содержание с навигацией
- Примеры конфигурационных файлов
- Сценарии использования от простых до сложных
- Советы по лучшим практикам