Thank you for reading this post, don't forget to subscribe!
Приложение NodeJS может запускаться в качестве веб-сервера и самостоятельно отвечать на http-запросы. Но в связки с NGINX его работу можно сделать быстрее и надежнее. Мы рассмотрим установку всех необходимых компонентов, настройку запуска приложения NodeJS в качестве сервиса systemd, а также приведем пример развертывания типового приложения. В инструкции используются:
- Ubuntu Server 18.04.
- NGINX 1.14.
- NodeJS 16.13.2.
Все действия будут пошаговыми — сначала мы развернем сервис на NodeJS, затем подключим NGINX и, на конец, рассмотрим установку веб-приложения.
Установка NodeJS
Установка может быть выполнена из репозитория:
apt install nodejs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
во встроенном репозитории версия NodeJS может быть очень старой, и наше приложение может работать неправильно. Для продуктивной среды необходимо уточнить у разработчика, какая версия нужна и установить ее. Чтобы получить другую версию NodeJS, установим curl: apt install curl Настроим репозиторий: curl -sL https://deb.nodesource.com/setup_16.x | sudo bash - * в данном примере мы настроим репозиторий для 16-й версии приложения. Теперь можно установить пакет nodejs нужной нам версии (в данном примере, 16): apt install nodejs |
Установка завершена. Проверить запуск и посмотреть версию можно командой:
node -v
Можно переходить к первому запуску тестового веб-приложения.
Запуск тестового приложения NodeJS
Для примера мы напишем маленькое веб-приложение, которое будет запускаться на порту 3000 и выводить на экран «Hello, world!».
Создаем каталог, где предполагаем хранить файлы нашего приложения:
mkdir -p /var/www/app01
Создадим файл:
vi /var/www/app01/server.js
1 2 3 4 5 6 7 8 9 10 11 12 |
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/'); }); |
Если в нашей системе используется брандмауэр, откроем порт 3000:
iptables -I INPUT -p tcp --dport 3000 -j ACCEPT
Запустим приложение:
node /var/www/app01/server.js
На экране должно появиться:
Start NodeJS Server on http://0.0.0.0:3000/
Открываем браузер на любом компьютере в сети и переходим по адресу http://<IP-адрес сервер>:3000 — мы должны увидеть:
hello world
Наше приложение работает. Идем дальше.
Настройка автозапуска (systemd)
Мы запустили вручную наше приложение. Давайте теперь настроим его автозапуск. Для этого мы создадим юнит в systemd. Мы создадим юнит с @ — это позволит нам передавать имя приложения и папку при запуске.
И так, прерываем работу нашего приложения, которое мы запустили на предыдущем шаге (CTRL + C) и создаем файл:
vi /etc/systemd/system/node@.service
1 2 3 4 5 6 7 8 9 10 11 12 |
[Unit] Description=NodeJS Service After=network.target [Service] Type=simple ExecStart=/usr/bin/node /var/www/%i/server.js ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure [Install] WantedBy=multi-user.target |
* обратите внимание на %i — это переменная, которой мы будем передавать имя нашего приложения, которое соответствует названию каталога, где оно лежит.
Перечитываем конфигурацию systemd:
systemctl daemon-reload
Разрешаем и запускаем наше приложение:
systemctl enable node@app01 --now
* снова повторимся. app01 — имя приложения в нашем примере и ему соответствует каталог /var/www/app01.
Посмотреть состояние службы можно командой:
systemctl status node@app01
Переходим по адресу http://<IP-адрес сервер>:3000 — мы, снова, должны увидеть:
hello world
Наше приложение запускается как сервис.
Установка и настройка NGINX
Приступим к добавлению веб-сервера nginx. Его можно установить из репозитория командой:
apt install nginx
Сразу разрешим автозапуск:
systemctl enable nginx
Разрешим 80 порт в брандмауэре (если в нашей системе он используется):
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
Переходим по адресу http://<IP-адрес сервер> (без указания порта) — мы увидим приветствие от веб-сервера:
Открываем файл:
vi /etc/nginx/sites-enabled/default
В разделе location внесем изменения, приведя его к виду:
1 2 3 4 5 6 |
... location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; } ... |
* в нашем примере мы упростили настройку, чтобы сосредоточиться на связке NGINX + NodeJS. В продуктивной среде стоит использовать виртуальные домены
Проверяем корректность настройки nginx:
nginx -t
Мы должны получить что-то на подобие:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Перезапускаем веб-сервер:
systemctl reload nginx
Переходим по адресу http://<IP-адрес сервер> (без порта 3000) и видим:
hello world
Наше приложение открывается через nginx.
Удаляем лишнее
1. Так как мы настроили запросы через nginx, нужно поменять некоторые настройки. Открываем файл:
vi /var/www/app01/server.js
Находим строки:
1 2 3 |
server.listen(3000, '0.0.0.0', () => { console.log('Start NodeJS Server on http://0.0.0.0:3000/'); }); |
И меняем их на:
1 2 3 |
server.listen(3000, '127.0.0.1', () => { console.log('Start NodeJS Server on http://127.0.0.1:3000/'); }); |
* мы поменяли 0.0.0.0 на 127.0.0.1, чтобы наш сервер не слушал на всех интерфейсах — нам достаточно только локальной петли. Это более безопасный вариант работы.
Перезапустим наше приложение node:
systemctl restart node@app01
Проверим, что наше приложение слушает на порту 3000 и уже на адресе 127.0.0.1:
ss -tunlp | grep :3000
Мы должны увидеть:
1 |
tcp LISTEN 0 128 127.0.0.1:3000 0.0.0.0:* users:(("node",pid=2503,fd=10)) |
2. Теперь удалим лишнее правило в брандмауэре (открытый порт 3000, если мы его создавали). Смотрим список добавленных правил:
iptables -L --line-numbers
Находим правило с открытым портом 3000:
2 ACCEPT tcp -- anywhere anywhere tcp dpt:3000
* в данном примере оно имеет порядковый номер 2.
Удалим его:
iptables -D INPUT 2
Сохраним правила:
apt install iptables-persistent
netfilter-persistent save
Установка приложения
В установке приложений есть множество нюансов, но мы опишем типовой подход.
Нам нужен будет менеджер пакетов node. Ставим его командой:
apt install npm
Получаем проект от разработчика и копируем его в наш каталог app01. После переходим в каталог:
cd /var/www/app01/
Как правило, разработчик поставляет приложение с файлом package.json. В этом файле описаны пакеты, необходимые для работы приложения. Установим их:
npm install
npm прочитает файл package.json и выполнит установку — после в нашем каталоге с приложением появятся папка node_modules и файл package-lock.json.
Также обратите внимание, что файл для запуска сервиса node может иметь другое имя. Уточните это у разработчика и, при необходимости, отредактируйте systemd.