Перейти к содержимому

Node.js на сервере: PM2 и nginx

Облачные серверы5 мин чтения

Как запустить приложение Node.js на облачном сервере VDS/VPS: установка Node.js LTS, запуск и автозапуск через PM2, nginx как обратный прокси-сервер, HTTPS и журналы приложения.

Содержание

Приложение на Node.js, будь то сайт, API или бот, на сервере обычно запускают под управлением диспетчера процессов PM2. Он перезапускает приложение после сбоя, восстанавливает его после перезагрузки сервера и собирает журналы. Запросы из интернета принимает веб-сервер nginx: он передаёт их приложению и обслуживает HTTPS.

Команды приведены для Ubuntu 26.04 и 24.04 и Debian 13; отличия AlmaLinux описаны в конце статьи. Вход на наши серверы выполняется под учётной записью root (подробнее — в статье Как подключиться к серверу по SSH), поэтому sudo в командах не указан.

Какую версию Node.js установить

Для рабочих приложений выбирайте выпуск с долгосрочной поддержкой (LTS). В ноябре 2026 года это Node.js 26: ветка получила статус LTS 28 октября 2026 года и будет поддерживаться до 30 апреля 2029-го. Предыдущая ветка, Node.js 24, поддерживается до 30 апреля 2028 года.

В репозиториях систем Node.js заметно отстаёт от актуальных выпусков:

СистемаNode.js в репозиторииПоддержка разработчиками
Ubuntu 26.0422до 30 апреля 2027 года
Ubuntu 24.0418завершена 30 апреля 2025 года
Debian 1320завершена 30 апреля 2026 года

Поэтому рекомендуем устанавливать Node.js из репозитория NodeSource. В нём есть актуальные выпуски каждой ветки LTS, а исправления приходят вместе с обновлениями системы.

Установка Node.js и PM2

curl -fsSL https://deb.nodesource.com/setup_26.x -o nodesource_setup.sh
bash nodesource_setup.sh
apt install nodejs
node -v
npm install -g pm2@latest

Сценарий NodeSource подключает репозиторий и ключ, которым подписаны пакеты. Пакет nodejs из этого репозитория уже содержит npm, поэтому отдельный пакет npm устанавливать не нужно. Если приложение рассчитано на Node.js 24, укажите в адресе setup_24.x вместо setup_26.x.

Пользователь и приложение

Запускать приложение от имени root небезопасно: ошибка в коде или уязвимость в зависимостях открыла бы доступ ко всему серверу. Создайте для него отдельного пользователя:

useradd --create-home --shell /bin/bash app

Код приложения разместите в папке /home/app/myapp, например клонировав репозиторий под пользователем app, и установите зависимости командой npm install. Если вы копировали файлы под root, передайте их пользователю командой chown -R app:app /home/app/myapp. Для проверки можно создать пробное приложение:

su - app
mkdir myapp && cd myapp
cat > server.js <<'EOF'
const http = require('node:http');

http.createServer((req, res) => {
  res.end('Hello from Node.js\n');
}).listen(3000, '127.0.0.1');
EOF
exit

Приложение должно принимать подключения только на адресе 127.0.0.1. Тогда к порту 3000 нельзя обратиться из интернета напрямую, в обход nginx. В Express этот адрес указывают вторым аргументом метода app.listen.

Запуск через PM2

Запустите приложение под управлением PM2 от имени пользователя app и сохраните список процессов:

su - app
cd myapp
pm2 start server.js --name myapp
pm2 save
exit

Если приложение запускается командой npm, передайте её PM2 целиком: pm2 start "npm run start" --name myapp.

Чтобы PM2 запускался при загрузке сервера, выполните под root:

pm2 startup systemd -u app --hp /home/app
systemctl is-enabled pm2-app

Команда создаёт и включает службу systemd pm2-app, которая при загрузке сервера восстанавливает список приложений, сохранённый командой pm2 save. Поэтому после добавления или удаления приложения снова выполняйте pm2 save. Проверить автозапуск можно перезагрузкой: после неё приложение должно быть в состоянии online в выводе pm2 list.

Остальные команды PM2 также выполняются под пользователем app:

pm2 listсостояние приложений
pm2 restart myappперезапуск приложения
pm2 stop myapp, pm2 delete myappостановка и удаление из списка
pm2 monitнагрузка и журналы в реальном времени

nginx как обратный прокси-сервер

Установите nginx командой apt install nginx и создайте файл /etc/nginx/sites-available/example.ru, указав вместо example.ru свой домен:

server {
    listen 80;
    server_name example.ru www.example.ru;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Заголовки Upgrade и Connection нужны приложениям, которые используют WebSocket, например через Socket.IO. Включите сайт и проверьте настройки:

ln -s /etc/nginx/sites-available/example.ru /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx

Домен должен указывать на IP-адрес сервера (A-запись). Адрес посетителя приложение получает в заголовке X-Forwarded-For; чтобы в Express он попадал в req.ip, включите настройку app.set('trust proxy', 'loopback').

Межсетевой экран ufw в образе Ubuntu выключен. Если вы его включите, разрешите SSH и веб-порты командами ufw allow OpenSSH и ufw allow 80,443/tcp (подробнее — в статье Как открыть порт на сервере).

HTTPS

Когда сайт откроется по HTTP, выпустите бесплатный сертификат Let's Encrypt. certbot добавит настройки HTTPS в конфигурацию nginx и будет продлевать сертификат автоматически:

apt install certbot python3-certbot-nginx
certbot --nginx -d example.ru -d www.example.ru

Подробности и решение возможных ошибок описаны в статье о сертификатах certbot, настройка перенаправления с HTTP на HTTPS — в статье о переадресации на HTTPS.

Журналы

Вывод приложений PM2 сохраняет в файлы в папке /home/app/.pm2/logs. Просматривать их удобно под пользователем app:

pm2 logs myapp
pm2 logs myapp --lines 200

Со временем эти файлы занимают всё больше места. Чтобы PM2 разбивал их на части и ограничивал их общий объём, установите модуль ротации журналов: pm2 install pm2-logrotate.

Если сайт отвечает ошибкой 502 Bad Gateway, nginx не может подключиться к приложению: проверьте вывод pm2 list и журнал приложения. Журналы nginx находятся в файлах /var/log/nginx/access.log и /var/log/nginx/error.log, а журнал службы PM2 выводит команда journalctl -u pm2-app.

Обновление приложения

Получите новую версию кода, например командой git pull, установите зависимости и перезапустите приложение:

su - app
cd myapp
git pull
npm install
pm2 restart myapp

Node.js из NodeSource обновляется вместе с системой командами apt update и apt upgrade в пределах выбранной ветки. Работающие приложения продолжают использовать прежнюю версию, пока вы их не перезапустите командой pm2 restart all.

Отличия AlmaLinux

В AlmaLinux 9 и 10 Node.js устанавливается из RPM-репозитория NodeSource:

curl -fsSL https://rpm.nodesource.com/setup_26.x -o nodesource_setup.sh
bash nodesource_setup.sh
dnf install nodejs

nginx устанавливается командой dnf install nginx и запускается командой systemctl enable --now nginx. Настройки сайта размещаются в файле /etc/nginx/conf.d/example.ru.conf, ссылку в sites-enabled создавать не нужно. SELinux по умолчанию не позволяет nginx подключаться к приложению, поэтому разрешите это:

setsebool -P httpd_can_network_connect 1

certbot в AlmaLinux устанавливается из репозитория EPEL. Межсетевого экрана в образе AlmaLinux нет.

Не нашли ответ? Напишите в поддержку — подскажем.