Короткий ответ: 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.
