Мониторинг: 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 без перезапуска