Skip to content

This article is available in Russian. An English version is on the way.Open the Russian page

Node.js-приложение с PM2

Установить LTS-версию Node.js, запустить приложение под PM2 с автозапуском и опубликовать за Nginx.

Level
Intermediate
Reading time
3 min read
Updated
Tested on
Ubuntu 22.04, Ubuntu 24.04, Debian 12
Contents
  1. Вариант 1: NodeSource
  2. Вариант 2: nvm
  3. Отдельный пользователь
  4. Запуск под PM2
  5. Автозапуск после перезагрузки
  6. Публикация за Nginx
  7. Проверьте результат
  8. Частые ошибки

Версия Node.js в стандартных репозиториях обычно отстаёт. Возьмите актуальную LTS: либо из репозитория NodeSource (одна версия для всей системы), либо через nvm (своя версия для каждого пользователя).

Вариант 1: NodeSource

bash
$ curl -fsSL https://deb.nodesource.com/setup_lts.x -o nodesource_setup.sh$ bash nodesource_setup.sh$ apt install -y nodejs$ node -v && npm -v

Вариант 2: nvm

Выполняйте от пользователя, под которым будет работать приложение (не root). Актуальную версию установщика смотрите в репозитории nvm-sh/nvm на GitHub.

bash
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash$ source ~/.bashrc$ nvm install --lts$ node -v

Отдельный пользователь

Не запускайте приложение от root: уязвимость в зависимости не должна давать полный доступ к серверу.

bash
$ adduser --disabled-password --gecos "" app$ mkdir -p /srv/app && chown app:app /srv/app

Запуск под PM2

При установке через NodeSource поставьте PM2 от root, при nvm — от пользователя app:

bash
$ npm install -g pm2$ su - app$ cd /srv/app$ npm ci --omit=dev$ pm2 start server.js --name app$ pm2 status

Удобнее описать процесс в файле, чтобы параметры хранились в репозитории:

/srv/app/ecosystem.config.js
module.exports = {  apps: [    {      name: 'app',      script: 'server.js',      instances: 1,      env: { NODE_ENV: 'production', PORT: 3000, HOST: '127.0.0.1' },      max_memory_restart: '400M',    },  ],};
bash
$ pm2 start ecosystem.config.js$ pm2 logs app --lines 50

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

pm2 startup печатает команду для создания службы systemd — выполните её от root, как она подсказывает. Затем сохраните список процессов:

bash
$ pm2 startup systemd$ # выполните напечатанную команду вида: sudo env PATH=… pm2 startup systemd -u app --hp /home/app$ pm2 save

Публикация за Nginx

Приложение слушает 127.0.0.1:3000. Настройте проксирование по статье «Nginx как обратный прокси для приложения» и выпустите сертификат через certbot.

Проверьте результат

bash
$ curl -I http://127.0.0.1:3000$ sudo reboot$ # после перезагрузки$ pm2 status

Частые ошибки

  • После перезагрузки приложение не поднялось — не выполнена команда из pm2 startup или забыт pm2 save.
  • pm2 не найден в cron или systemd — при установке через nvm путь к node есть только в интерактивной оболочке. Указывайте полный путь.
  • Приложение слушает 0.0.0.0 — порт доступен снаружи в обход Nginx. Задайте HOST=127.0.0.1.

Read to the end and the article counts toward your learning progress.

  • Node.js
  • PM2
  • JavaScript
  • npm
  • Express

Was this article helpful?