Как запустить приложение 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.04 | 22 | до 30 апреля 2027 года |
| Ubuntu 24.04 | 18 | завершена 30 апреля 2025 года |
| Debian 13 | 20 | завершена 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 myappNode.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 nodejsnginx устанавливается командой dnf install nginx и запускается командой systemctl enable --now nginx. Настройки сайта размещаются в файле /etc/nginx/conf.d/example.ru.conf, ссылку в sites-enabled создавать не нужно. SELinux по умолчанию не позволяет nginx подключаться к приложению, поэтому разрешите это:
setsebool -P httpd_can_network_connect 1certbot в AlmaLinux устанавливается из репозитория EPEL. Межсетевого экрана в образе AlmaLinux нет.
Не нашли ответ? Напишите в поддержку — подскажем.


