Top.Mail.Ru

Node.js через NVM и PM2: установка и запуск на Ubuntu

3
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

Похожее

Все статьи
124877

Какая CMS лучше подходит для разных типов сайтов

Выбор системы управления сайтом — это всегда компромисс в какой-то степени компромисс между сложностью, доступностью и привычностью. Нельзя просто так взять и сказать: «Вот конкретно именно эта CMS самая лучшая».  Под каждую задачу есть свой инструмент. Поэтому более корректно спрашивать:…

2903956 25854 (1) (1)

Что такое SSH и зачем он нужен

SSH — инструмент, с которым почти неизбежно сталкивается каждый, кто начинает работать с сервером. Сначала кажется, что это что-то из мира системных администраторов: терминал, команды, непонятные ключи, доступ по IP. Но на самом деле SSH — обычный рабочий инструмент. Просто…