2026-09-18
Настройка NGINX + NodeJS на Ubuntu Server

Настройка NGINX + NodeJS на Ubuntu Server

NodeJS может отвечать на HTTP-запросы самостоятельно, но за NGINX его работа быстрее и надёжнее: NGINX берёт на себя статику, TLS и балансировку, а приложение обслуживает динамику. Разберём установку NodeJS, запуск приложения как сервиса и связку с NGINX.


Установка NodeJS

Нативная версия

apt search --names-only '^nodejs$'
apt install nodejs

В репозитории Ubuntu версия может быть устаревшей.

Репозиторий NodeSource

apt install curl
export NODE_VER=24
curl -sL https://deb.nodesource.com/setup_${NODE_VER}.x | bash -
apt install nodejs

В примере — LTS-версия 24. Актуальная LTS-линейка на сентябрь 2026 — 24.x.

Конкретная версия:

apt install nodejs=24.11.1
node -v

Запуск тестового приложения

mkdir -p /var/www/app01
vi /var/www/app01/server.js
const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, {
    'Content-Type': 'text/plain; charset=UTF-8'
  });
  res.end('Hello, world!');
});

server.listen(3000, '0.0.0.0', () => {
  console.log('Start NodeJS Server on http://0.0.0.0:3000/');
});
iptables -I INPUT -p tcp --dport 3000 -j ACCEPT
node /var/www/app01/server.js

Открываем http://<IP>:3000 — увидим «Hello, world!».


Автозапуск

pm2

npm install -g pm2
cd /var/www/app01
pm2 server.js

Для приложений, запускаемых через npm run start:

pm2 start --name my-app 'npm run start'
pm2 list
pm2 save
pm2 startup

Если запуск не от root, утилита выведет команду вида:

sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u dmosk --hp /home/dmosk

Выполните её от root.

Кластерный режим pm2

NodeJS однопоточный — на многоядерном сервере используйте кластерный режим (-i):

pm2 start dist/main.js --name back -i max -- --port 3000 --max-old-space-size=4096

где:

  • dist/main.js — исполняющий скрипт;
  • back — имя процесса;
  • max — число ядер (все доступные).

Важно запускать с путём до главного файла, а не с npm run start — иначе процессы не работают как единое целое.

systemd

vi /etc/systemd/system/node@.service
[Unit]
Description=NodeJS Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/node ./server.js
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
WorkingDirectory=/var/www/%i

[Install]
WantedBy=multi-user.target

%i — переменная, в которую передаётся имя приложения (совпадает с именем каталога).

systemctl daemon-reload
systemctl enable node@app01 --now
systemctl status node@app01

Установка и настройка NGINX

apt install nginx
systemctl enable nginx
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 443 -j ACCEPT
apt install iptables-persistent
netfilter-persistent save
vi /etc/nginx/sites-enabled/default
location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header Host $host;
}

Для продакшена используйте отдельный виртуальный домен вместо правки default.

nginx -t
systemctl reload nginx

Приложение открывается через NGINX (порт 80).


Убираем лишнее

Меняем привязку приложения на локальную петлю:

vi /var/www/app01/server.js
server.listen(3000, '127.0.0.1', () => {
  console.log('Start NodeJS Server on http://127.0.0.1:3000/');
});

127.0.0.1 вместо 0.0.0.0 — приложение слушает только локально, что безопаснее.

systemctl restart node@app01
ss -tunlp | grep :3000
tcp LISTEN 0 128 127.0.0.1:3000 0.0.0.0:* users:(("node",pid=2503,fd=10))

Удаляем правило для порта 3000:

iptables -L --line-numbers
2    ACCEPT     tcp  --  anywhere     anywhere     tcp dpt:3000
iptables -D INPUT 2
netfilter-persistent save

Установка приложения

apt install npm
cd /var/www/app01/
npm install

npm прочитает package.json, установит зависимости и создаст node_modules и package-lock.json.

Уточните у разработчика имя стартового файла — при необходимости отредактируйте юнит systemd.


Обновление NodeJS

Пример перехода с 22 на 24 через NodeSource:

node -v
export NODE_VER=24
curl -sL https://deb.nodesource.com/setup_${NODE_VER}.x | bash -
apt install nodejs
node -v

Скрипт переключит apt-репозиторий NodeSource на нужную major-версию и выполнит apt update.

Перезапускаем приложение:

systemctl restart node@app01    # systemd
pm2 restart all                 # pm2

Тонкости и подводные камни

  • Версия NodeJS — уточняйте требования приложения; LTS-ветки — чётные (24, 26).
  • 0.0.0.0 vs 127.0.0.1 — за прокси приложение должно слушать только локально.
  • pm2 cluster — запускайте с путём до main.js, а не через npm run start.
  • pm2 startup — команду для автозапуска нужно выполнить от root.
  • systemd %i — имя юнита соответствует каталогу в /var/www.
  • --max-old-space-size — поднимайте лимит heap для крупных приложений.
  • NGINX default — для нескольких приложений используйте отдельные vhost.
  • Зависимостиnpm ci воспроизводит установку строго по package-lock.json.

Шпаргалка

export NODE_VER=24
curl -sL https://deb.nodesource.com/setup_${NODE_VER}.x | bash -
apt install nodejs
mkdir -p /var/www/app01 && vi /var/www/app01/server.js

# systemd
vi /etc/systemd/system/node@.service     # WorkingDirectory=/var/www/%i
systemctl enable node@app01 --now

# nginx
vi /etc/nginx/sites-enabled/default      # proxy_pass http://127.0.0.1:3000;
nginx -t && systemctl reload nginx

Проверено на: Ubuntu Server 22.04/24.04 + NodeJS 24 LTS, NGINX 1.31.
Дата: Сентябрь 2026.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *