Node.js через NVM и PM2: установка и запуск на Ubuntu
NVM (Node Version Manager) позволяет устанавливать несколько версий Node.js на одном сервере и переключаться между ними без переустановки. PM2 — менеджер процессов, который держит Node.js-приложение запущенным в фоне, перезапускает его при падении и добавляет в автозагрузку. Вместе они закрывают большинство задач с Node.js на продакшн-сервере.
Почему NVM, а не apt install nodejs
Стандартный пакет Node.js в репозитории Ubuntu часто отстаёт на несколько мажорных версий. Ubuntu 22.04 из коробки предлагает Node.js 12.x, тогда как актуальные LTS-версии — 20 и 22. Установка через apt также даёт только одну версию на всю систему.
NVM решает оба вопроса: вы сами выбираете версию, устанавливаете их сколько угодно и переключаетесь между ними командой nvm use. Это особенно важно если на сервере несколько проектов с разными требованиями.
Установка NVM
Перед установкой убедитесь что curl доступен:
sudo apt update && sudo apt install curl -y
Установите NVM скриптом с GitHub. Перед запуском проверьте актуальную версию на github.com/nvm-sh/nvm/releases — вставьте её в URL вместо v0.40.1:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
Скрипт автоматически добавит нужные строки в ~/.bashrc. Чтобы NVM стал доступен в текущей сессии, выполните:
source ~/.bashrc
Или просто откройте новую вкладку терминала. Проверьте что NVM установлен:
nvm --version
Если видите номер версии — установка прошла успешно.
Установка Node.js
Посмотреть все LTS-версии, доступные для установки:
nvm ls-remote --lts
Установить последнюю LTS-версию:
nvm install --lts
Установить конкретную версию (например Node.js 20):
nvm install 20
NVM автоматически скачает бинарники — компилировать ничего не нужно. Проверьте что Node.js работает:
node --version
npm --version
Управление версиями
Посмотреть установленные версии:
nvm ls
Переключиться на другую версию в текущей сессии:
nvm use 20
Установить версию по умолчанию для всех новых сессий:
nvm alias default 20
Без этой команды при каждом новом подключении по SSH активируется последняя установленная версия. Укажите дефолт явно — это избавит от путаницы.
.nvmrc — версия Node.js для конкретного проекта
Если у вас несколько проектов с разными версиями Node.js, удобно хранить нужную версию в файле .nvmrc в корне проекта:
echo "20" > .nvmrc
Теперь в директории проекта достаточно выполнить:
nvm use
NVM прочитает версию из .nvmrc и переключится на неё. Обратите внимание: в файле указывается только номер (20), без буквы v.
Установка PM2
PM2 устанавливается глобально через npm:
npm install -g pm2
Проверьте установку:
pm2 --version
Запуск приложения через PM2
Самый простой запуск:
pm2 start app.js --name myapp
Флаг --name задаёт имя процесса — по нему вы будете управлять приложением. Без имени PM2 присвоит имя по имени файла.
Просмотр всех запущенных процессов:
pm2 list
В таблице видны: имя, статус (online/stopped/errored), PID, потребление CPU и памяти, количество рестартов.
Основные команды управления
| Команда | Что делает |
|---|---|
pm2 start app.js --name myapp |
Запустить приложение |
pm2 list |
Список всех процессов |
pm2 restart myapp |
Перезапустить (краткий простой) |
pm2 reload myapp |
Перезапустить без простоя (только кластер) |
pm2 stop myapp |
Остановить |
pm2 delete myapp |
Удалить из PM2 |
pm2 monit |
Интерактивный дашборд мониторинга |
pm2 logs myapp |
Логи конкретного приложения |
pm2 logs --lines 100 |
Последние 100 строк всех логов |
Разница между restart и reload: restart останавливает приложение и запускает заново — в этот момент оно недоступно. reload делает то же самое, но в режиме кластера новые воркеры поднимаются до того как старые останавливаются — ноль даунтайма. reload работает только если приложение запущено с instances > 1.
Ecosystem.config.js — правильная конфигурация
Запуск командой pm2 start app.js подходит для экспериментов. Для продакшн-сервера правильнее использовать файл конфигурации — так настройки воспроизводимы и хранятся в репозитории.
Создайте файл в корне проекта:
nano ecosystem.config.js
Пример конфигурации для веб-приложения:
module.exports = {
apps: [{
name: 'myapp',
script: './app.js',
instances: 'max', // запустить воркер на каждое ядро CPU
exec_mode: 'cluster', // режим кластера для load balancing
env: {
NODE_ENV: 'production',
PORT: 3000
},
error_file: './logs/err.log',
out_file: './logs/out.log',
log_date_format: 'YYYY-MM-DD HH:mm:ss',
max_memory_restart: '500M' // перезапустить если превысит 500 МБ
}]
}
Запустить из файла конфигурации:
pm2 start ecosystem.config.js
instances: 'max' запускает столько процессов сколько ядер у сервера — Node.js однопоточный, это единственный способ задействовать все ядра CPU.
Автозапуск при перезагрузке сервера
По умолчанию PM2 не сохраняется после перезагрузки. Два шага чтобы это исправить.
Шаг 1. Сгенерируйте systemd-сервис:
pm2 startup
PM2 выведет команду которую нужно скопировать и выполнить. Она выглядит примерно так:
sudo env PATH=$PATH:/home/user/.nvm/versions/node/v20.11.0/bin \
/home/user/.nvm/versions/node/v20.11.0/lib/node_modules/pm2/bin/pm2 \
startup systemd -u user --hp /home/user
Скопируйте именно ту команду которую вывел PM2 на вашем сервере — пути у каждого свои. Выполните её.
Шаг 2. Сохраните текущий список процессов:
pm2 save
Теперь после перезагрузки сервера все приложения из списка поднимутся автоматически.
Главная ловушка: NVM в cron и скриптах
NVM работает только в интерактивных оболочках — там где загружается ~/.bashrc. В cron-заданиях, скриптах и systemd-сервисах ~/.bashrc не читается, поэтому команды node и npm не найдутся.
Вот что происходит если написать в crontab:
# ЭТО НЕ СРАБОТАЕТ
0 3 * * * node /home/user/scripts/backup.js
Решение — указывать полный путь к бинарнику Node.js:
0 3 * * * /home/user/.nvm/versions/node/v20.11.0/bin/node /home/user/scripts/backup.js
Узнать текущий полный путь:
which node
Или добавить в начало crontab экспорт PATH:
PATH=/home/user/.nvm/versions/node/v20.11.0/bin:/usr/local/bin:/usr/bin:/bin
0 3 * * * node /home/user/scripts/backup.js
Для PM2-приложений эта проблема не актуальна: команда pm2 startup автоматически прописывает полный путь к Node.js в сгенерированный systemd-юнит.
Просмотр и ротация логов
Просмотр логов всех приложений в реальном времени:
pm2 logs
Логи конкретного приложения:
pm2 logs myapp --lines 100
Очистить все логи:
pm2 flush
По умолчанию логи PM2 не ротируются и могут занять много места на диске. Установите плагин для ротации:
pm2 install pm2-logrotate
После установки логи автоматически архивируются раз в сутки, хранятся 30 дней.
Часто задаваемые вопросы
Можно ли установить несколько версий Node.js через NVM одновременно?
Да, именно для этого NVM и создан. Установите сколько нужно версий: nvm install 18, nvm install 20, nvm install 22. Переключайтесь между ними командой nvm use 20. Все версии хранятся независимо в ~/.nvm/versions/.
Что делать если после установки NVM команда nvm не найдена?
Выполните source ~/.bashrc или закройте и откройте терминал заново. Если не помогает — проверьте что скрипт установки добавил строки в ~/.bashrc: cat ~/.bashrc | grep nvm. Если строк нет — добавьте вручную: export NVM_DIR="$HOME/.nvm" и [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh".
В чём разница между pm2 restart и pm2 reload?
pm2 restart останавливает процесс и запускает заново — в этот момент приложение недоступно несколько секунд. pm2 reload делает graceful reload: новые воркеры поднимаются прежде чем старые останавливаются, сайт не уходит в даунтайм. pm2 reload работает только в кластерном режиме (exec_mode: 'cluster').
Как запустить несколько Node.js-приложений через PM2?
Просто запустите каждое с отдельным именем: pm2 start app1.js --name api, pm2 start app2.js --name frontend. PM2 управляет ими независимо. Для сложных сетапов удобнее описать все приложения в одном ecosystem.config.js с массивом apps: [...].
Как обновить NVM до новой версии?
Запустите установочный скрипт повторно с новым номером версии — NVM обновится без потери установленных версий Node.js. Установленные версии Node и конфигурации PM2 при этом не затрагиваются.
Node.js через NVM + PM2 — стандартный стек для запуска веб-приложений на VPS. На UFO.Hosting доступны серверы с Ubuntu 22.04 и 24.04, где NVM устанавливается одной командой сразу после подключения по SSH.
Официальная документация: github.com/nvm-sh/nvm · pm2.keymetrics.io/docs
Похожее
Все статьи
Какая CMS лучше подходит для разных типов сайтов
Выбор системы управления сайтом — это всегда компромисс в какой-то степени компромисс между сложностью, доступностью и привычностью. Нельзя просто так взять и сказать: «Вот конкретно именно эта CMS самая лучшая». Под каждую задачу есть свой инструмент. Поэтому более корректно спрашивать:…
Что такое SSH и зачем он нужен
SSH — инструмент, с которым почти неизбежно сталкивается каждый, кто начинает работать с сервером. Сначала кажется, что это что-то из мира системных администраторов: терминал, команды, непонятные ключи, доступ по IP. Но на самом деле SSH — обычный рабочий инструмент. Просто…