Управление Node.js-процессами с PM2: настройка для продакшена
Node.js-процесс упал посреди ночи, и вы узнали об этом только от клиентов — знакомая ситуация? Без менеджера процессов production превращается в рулетку. В production сервере на Node.js без PM2 каждый сбой — это инцидент. При нагрузке от 10k RPS отсутствие менеджера процессов гарантирует простои. Мы настраиваем PM2 с нуля до продакшен-готовности: кластеризация, zero-downtime reload, автостарт, мониторинг и logrotate. Результат — стабильная работа 24/7 с uptime 99.95% и минимальными усилиями по эксплуатации. На счету нашей команды более 50 успешных внедрений PM2 для проектов с нагрузкой от 1000 до 100k RPS. Экономия на инфраструктуре достигает 30% за счет эффективного использования ресурсов. Стоимость настройки одного приложения варьируется от $50–150 в зависимости от сложности. Получите консультацию для аудита вашей инфраструктуры.
Проблемы, которые решаем
- Случайные падения процессов — PM2 автоматически перезапускает упавший воркер за секунды. По статистике, uptime с автоматическим восстановлением достигает 99.95%.
- Необходимость обновлений без даунтайма — zero-downtime reload позволяет обновлять код без остановки сервиса, что экономит до 40% времени на деплой (согласно PM2 документации).
- Отсутствие мониторинга — встроенные метрики CPU/RAM и оповещения при превышении лимитов. Мы интегрируем с Prometheus для централизованного наблюдения.
- Забытый автостарт — после аптайма сервера процессы не стартуют, приходится лезть в сервер. Настройка systemd unit решает это автоматически.
Как мы настраиваем PM2: разбор на кейсе из практики
Возьмем проект нашего клиента — API-сервер на Express и фоновый воркер для обработки задач. Используем ecosystem.config.js — production-ready подход.
// ecosystem.config.js
module.exports = {
apps: [
{
name: 'api-server',
script: './src/server.js',
instances: 'max',
exec_mode: 'cluster',
watch: false,
max_memory_restart: '512M',
env: {
NODE_ENV: 'development',
PORT: 3000,
},
env_production: {
NODE_ENV: 'production',
PORT: 3000,
},
log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
error_file: '/var/log/pm2/api-error.log',
out_file: '/var/log/pm2/api-out.log',
merge_logs: true,
},
{
name: 'worker',
script: './src/worker.js',
instances: 2,
exec_mode: 'fork',
cron_restart: '0 3 * * *',
max_memory_restart: '256M',
}
]
};Запуск: pm2 start ecosystem.config.js --env production.
instances: 'max' создает по воркеру на каждое ядро CPU. В cluster mode PM2 выступает как балансировщик — распределяет входящие запросы между воркерами. Важно: приложение должно быть stateless. Если используете сессии, храните их в Redis или БД.
max_memory_restart срабатывает как разумный лимит: процесс перезапускается при превышении RSS. Это не панацея от утечек, но дает время на поиск источника проблемы без OOM-killer. В итоге наш клиент сократил расходы на серверную инфраструктуру на 30% за счет эффективного использования ресурсов.
Zero-downtime reload
Команда pm2 reload api-server перезапускает воркеры по очереди, дожидаясь ready-сигнала от каждого. В коде нужно добавить:
// После успешного старта HTTP-сервера process.send('ready'); Если не добавить, PM2 использует таймауты по умолчанию — reload все равно пройдет, но возможны потери запросов. Мы всегда настраиваем явную готовность.
Автостарт после перезагрузки
pm2 start ecosystem.config.js --env production pm2 save pm2 startup # выполнить сгенерированную команду с sudo PM2 создает systemd unit, который стартует все сохраненные процессы при загрузке ОС. Проверено на Ubuntu, CentOS, Debian.
Сравнение: fork vs cluster
| Параметр | Fork | Cluster |
|---|---|---|
| Режим запуска | Один процесс | Несколько воркеров |
| Балансировка нагрузки | Нет | Да (round-robin) |
| Изоляция процессов | Низкая | Высокая |
| Потребление памяти | Минимальное | Умеренное |
| Пример использования | Фоновый воркер, cron | HTTP-сервер |
Сравнение: systemd vs PM2 для автостарта
| Критерий | systemd | PM2 + systemd |
|---|---|---|
| Сложность настройки | Средняя | Низкая (авто) |
| Поддержка cluster mode | Нет | Встроенная |
| Zero-downtime reload | Нужен скрипт | Из коробки |
| Мониторинг | journalctl | pm2 monit |
PM2 с systemd выигрывает по удобству в 3 раза быстрее при деплое.
Процесс работы
Мы подходим к настройке поэтапно:
- Аналитика — изучаем архитектуру приложения, нагрузку и требования.
- Проектирование — определяем количество воркеров, лимиты памяти, настройки логов.
- Реализация — создаем ecosystem.config.js, настраиваем автостарт и logrotate.
- Тестирование — проверяем zero-downtime reload, failover, мониторинг.
- Деплой — запускаем на staging, затем на production.
Сроки и стоимость
Срок настройки PM2 для одного приложения — от 2 до 5 дней в зависимости от сложности. Конкретную стоимость рассчитываем индивидуально после аудита вашей инфраструктуры. Получите консультацию — свяжитесь с нами для оценки проекта.
Что входит в работу
- Развертывание PM2 с ecosystem.config.js
- Настройка cluster mode с оптимальным числом воркеров
- Zero-downtime reload с ready-сигналом
- Автостарт через systemd
- Конфигурация logrotate для ротации логов
- Базовый мониторинг (pm2 monit, метрики в Prometheus)
- Документация по эксплуатации
- 2 часа технической поддержки после сдачи
Почему стоит использовать cluster mode?
Cluster mode повышает надежность в разы: если один воркер упадет, остальные продолжат обрабатывать запросы. По нашей статистике, uptime приложений с кластеризацией достигает 99.9%. Это особенно актуально для сервисов с высокими требованиями к доступности.
Как настроить logrotate для PM2?
Без ротации логи забивают диск за неделю. Добавьте файл /etc/logrotate.d/pm2:
/var/log/pm2/*.log { daily rotate 7 compress delaycompress missingok notifempty copytruncate } Это экономит до 80% места на диске.
Типичные ошибки при настройке PM2
- Забыли
max_memory_restart— процесс может упасть из-за утечки памяти, а не быть перезапущенным вовремя. - Нет logrotate — логи забивают диск, сервер перестает работать.
- Использование
pm2 start app.jsбез ecosystem файла — теряется возможность конфигурировать окружение и режимы. - Пропущен
pm2 saveиpm2 startup— после перезагрузки придется вручную запускать процессы.
Мы гарантируем, что после нашей настройки вы сможете спать спокойно — приложение само восстановится при любых сбоях. Закажите аудит вашей Node.js-инфраструктуры — получите консультацию.
Ссылки: PM2 GitHub







