Перейти к содержанию
Innovialabs

PM2: как запускать Node.js-приложения в продакшене

Практика3 мин

Коротко

PM2 держит Node.js-приложение запущенным, перезапускает его при падении, распределяет нагрузку по ядрам в cluster mode и поднимает процессы после перезагрузки сервера.

Коротко: зачем нужен PM2

Если запустить приложение командой node server.js, оно остановится при закрытии терминала, ошибке или перезагрузке сервера. PM2 — менеджер процессов для Node.js, который:

  • держит приложение в фоне и перезапускает при падении;
  • запускает несколько копий на разных ядрах CPU (cluster mode);
  • перезагружает код без простоя;
  • поднимает процессы после рестарта сервера;
  • собирает логи и показывает потребление ресурсов.

Установка и первый запуск

npm install -g pm2
pm2 start server.js --name api

Основные команды:

КомандаЧто делает
pm2 listсписок процессов и их статус
pm2 logs apiлоги в реальном времени
pm2 monitCPU и память в терминале
pm2 restart apiжесткий перезапуск
pm2 reload apiперезапуск без простоя
pm2 stop api / pm2 delete apiостановить / убрать из списка

Ecosystem-файл вместо длинных команд

Настройки удобнее хранить в репозитории, в файле ecosystem.config.js:

module.exports = {
  apps: [
    {
      name: "api",
      script: "./dist/server.js",
      instances: "max",
      exec_mode: "cluster",
      max_memory_restart: "500M",
      env: {
        NODE_ENV: "production",
        PORT: 3000,
      },
    },
  ],
};

Запуск: pm2 start ecosystem.config.js. Так конфигурация одинакова на всех серверах и видна в истории Git. Секреты в этот файл не кладите — передавайте их через переменные окружения сервера или .env, который не попадает в репозиторий.

Cluster mode

Node.js выполняет JavaScript в одном потоке, то есть один процесс использует одно ядро. В cluster mode PM2 запускает несколько экземпляров и распределяет входящие соединения между ними. instances: "max" — по числу ядер.

Важные условия:

  • приложение должно быть stateless: сессии, кэш и очереди — во внешнем хранилище (Redis, база), а не в памяти процесса;
  • cron-задачи внутри приложения будут выполняться в каждом экземпляре — выносите их отдельно или запускайте только в одном;
  • WebSocket в кластере требует внимания к sticky-сессиям или внешнему адаптеру.

Перезапуск без простоя

pm2 reload api перезапускает экземпляры по очереди: пока один перезагружается, остальные обслуживают запросы. Это работает в cluster mode. Чтобы reload был по-настоящему плавным:

  • обрабатывайте сигнал SIGINT — закрывайте сервер и соединения с базой корректно;
  • при необходимости используйте wait_ready: true и process.send("ready"), чтобы PM2 ждал фактической готовности приложения.

Автозапуск после перезагрузки сервера

pm2 startup
# выполните команду, которую выведет PM2
pm2 save

pm2 startup создает системную службу, а pm2 save запоминает текущий список процессов. Повторяйте pm2 save после добавления или удаления приложений.

Управление логами

По умолчанию логи пишутся в ~/.pm2/logs и сами не удаляются. Установите модуль ротации:

pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 10

Иначе логи рано или поздно заполнят диск.

PM2 или Docker

PM2Docker
Порог входанизкийвыше
Окружениезависит от сервераодинаковое везде
Несколько языков и сервисовнеудобноестественно
Масштабирование на много сервероввручнуючерез оркестратор
Подходит дляодин сервер, небольшой проекткоманды, микросервисы, CI/CD

Если у вас один VPS и одно-два Node.js-приложения, PM2 — простой и надежный выбор. Если проект растет, есть несколько сервисов и нужна воспроизводимость окружения, переходите на Docker. Внутри контейнера PM2 обычно не нужен: перезапуском занимается сам Docker или оркестратор, а несколько копий запускаются как отдельные контейнеры.

Частые вопросы

restart останавливает все процессы и запускает их заново — будет короткий простой. reload перезапускает экземпляры по очереди и в cluster mode обходится без простоя.

Поможем с этим

Если хотите не разбираться самим, а получить результат — этим мы занимаемся каждый день.

Обсудить проект

Читайте также

Есть идея или задача? Расскажите нам

Ответим в течение рабочего дня и предложим решение. Консультация бесплатная.