PM2: запуск Node.js на сервере Перейти к содержимому
+7 (920) 556-26-91 пн–пт: 10:00–19:00 (МСК)
Проконсультироваться Обсудить задачу

Инструкции

PM2: запуск Node.js на сервере и перезапуск без простоя

Установка PM2, файл ecosystem.config.cjs, кластерный режим, автозапуск после перезагрузки, ротация логов и сравнение с systemd.

PM2: запуск Node.js на сервере и перезапуск без простоя

Короткий ответ: PM2 запускает Node.js-приложение как постоянный процесс: перезапускает при падении, хранит список приложений, собирает логи и умеет перезапускаться без разрыва соединений. Настройка сводится к трём командам — запуск, сохранение списка, включение автозапуска. Конфигурация хранится в файле ecosystem.config.cjs, который лежит в репозитории, а не набирается руками на сервере.

Альтернатива без дополнительных зависимостей — сервис systemd. Сравнение приведено ниже.

Когда PM2, а когда systemd

Задача PM2 systemd
Один процесс Node.js Проще настроить Уже есть в системе, без зависимостей
Кластер на несколько ядер Встроенный режим cluster Требует шаблона unit-файла
Логи приложения Отдельные файлы с ротацией journald
Перезапуск без простоя pm2 reload — встроено Нужна настройка через сокет
Лишние зависимости Пакет из npm Нет

Для одного процесса разумнее systemd: он уже есть и не требует следить за обновлениями ещё одного инструмента. PM2 выигрывает, когда приложений несколько и нужен кластерный режим.

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

npm install -g pm2

pm2 start app.js --name myapp
pm2 status
pm2 logs myapp

Ключевой шаг, который часто пропускают, — сохранение списка процессов и включение автозапуска:

pm2 save
pm2 startup systemd -u app --hp /home/app

pm2 startup выведет команду, которую нужно выполнить от root. Без неё после перезагрузки сервера приложения не поднимутся, потому что PM2 не знает, что он должен запускаться сам. Порядок именно такой: сначала save, потом startup.

Файл конфигурации

Набирать параметры в командной строке неудобно: они не сохраняются в репозитории. Правильнее описать приложение в ecosystem.config.cjs:

module.exports = {
  apps: [
    {
      name: 'myapp',
      script: './index.js',
      cwd: '/var/www/app',
      instances: 'max',
      exec_mode: 'cluster',
      watch: false,
      max_memory_restart: '400M',
      env: {
        NODE_ENV: 'production',
        PORT: 3000,
      },
      error_file: '/var/log/pm2/myapp-error.log',
      out_file: '/var/log/pm2/myapp-out.log',
      merge_logs: true,
      time: true,
    },
  ],
};
Параметр Смысл
instances: 'max' Столько процессов, сколько ядер процессора
exec_mode: 'cluster' Процессы делят один порт между собой
watch: false Перезапуск при изменении файлов на сервере не нужен и опасен
max_memory_restart Перезапуск при превышении памяти — защита от утечек
time: true Отметки времени в логах

Кластерный режим работает только для приложений, которые не хранят состояние в памяти процесса: сессии должны лежать в Redis или базе, иначе пользователи будут терять авторизацию при каждом переключении между процессами.

Запуск и обновление:

pm2 start ecosystem.config.cjs
pm2 reload ecosystem.config.cjs   # без разрыва соединений
pm2 save

Полезные команды

pm2 status              # список процессов, память, время работы
pm2 logs myapp          # поток логов в реальном времени
pm2 logs myapp --lines 200
pm2 monit               # интерактивный монитор
pm2 describe myapp      # все параметры процесса
pm2 reload myapp        # плавный перезапуск
pm2 restart myapp       # жёсткий перезапуск
pm2 scale myapp 4       # изменить число процессов
pm2 flush               # очистить файлы логов
pm2 save                # сохранить текущий список

Разница между reload и restart существенна: restart убивает процессы и поднимает новые, то есть соединения рвутся. reload поднимает новые процессы и только потом гасит старые.

Логи и ротация

PM2 пишет логи в файлы, которые растут бесконечно. Без ротации они однажды займут весь диск:

pm2 install pm2-logrotate

pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
pm2 set pm2-logrotate:rotateInterval '0 0 * * *'
Параметр Значение
max_size Размер файла, после которого выполняется ротация
retain Сколько архивных файлов хранить
compress Сжимать архивы
rotateInterval Ротация по расписанию в формате cron

Настройка ротации логов — не мелочь: заполненный диск останавливает и сайт, и базу данных, а причина при этом выглядит неочевидно. Об этом же — материал про резервное копирование и обслуживание сервера.

Типичные ошибки

  • Забыт pm2 save. После перезагрузки список процессов пуст.
  • Забыт pm2 startup. PM2 не запускается сам, приложения не поднимаются.
  • Кластер без общего хранилища сессий. Пользователи теряют авторизацию при переключении процессов.
  • watch: true на сервере. Процесс перезапускается от любого изменения файлов, включая запись логов в тот же каталог.
  • Нет ротации логов. Диск заполняется, и отказ выглядит как проблема приложения.
  • Приложение работает от root. Отдельный пользователь обязателен, как и для systemd.