Настройка PM2 для production: управление Node.js-процессами

Node.js-процесс упал посреди ночи, и вы узнали об этом только от клиентов? Без надёжного менеджера процессов production превращается в рулетку. Мы настраиваем PM2 под ключ: кластеризация, zero-downtime reload, автостарт и мониторинг — чтобы ваше приложение работало стабильно 24/7. Наша команда берёт на себя весь цикл внедрения и обеспечивает последующую поддержку.
Часто задаваемые вопросы

Управление 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 раза быстрее при деплое.

Процесс работы

Мы подходим к настройке поэтапно:

  1. Аналитика — изучаем архитектуру приложения, нагрузку и требования.
  2. Проектирование — определяем количество воркеров, лимиты памяти, настройки логов.
  3. Реализация — создаем ecosystem.config.js, настраиваем автостарт и logrotate.
  4. Тестирование — проверяем zero-downtime reload, failover, мониторинг.
  5. Деплой — запускаем на 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

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1393
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1368
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    815
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1139