Настройка 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.0vs127.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.