Настройка NGINX + NodeJS

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

Уста­нов­ка завер­ше­на. Про­ве­рить запуск и посмот­реть вер­сию мож­но командой:

node -v

Мож­но пере­хо­дить к пер­во­му запус­ку тесто­во­го веб-приложения.

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

Для при­ме­ра мы напи­шем малень­кое веб-при­ло­же­ние, кото­рое будет запус­кать­ся на пор­ту 3000 и выво­дить на экран «Hello, world!».

Созда­ем ката­лог, где пред­по­ла­га­ем хра­нить фай­лы наше­го приложения:

mkdir -p /var/www/app01

Созда­дим файл:

vi /var/www/app01/server.js

Если в нашей систе­ме исполь­зу­ет­ся бранд­мау­эр, откро­ем порт 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

* обра­ти­те вни­ма­ние на %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 вне­сем изме­не­ния, при­ве­дя его к виду:

* в нашем при­ме­ре мы упро­сти­ли настрой­ку, что­бы сосре­до­то­чить­ся на связ­ке 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

Нахо­дим строки:

И меня­ем их на:

* мы поме­ня­ли 0.0.0.0 на 127.0.0.1, что­бы наш сер­вер не слу­шал на всех интер­фей­сах — нам доста­точ­но толь­ко локаль­ной пет­ли. Это более без­опас­ный вари­ант работы.

Пере­за­пу­стим наше при­ло­же­ние node:

systemctl restart node@app01

Про­ве­рим, что наше при­ло­же­ние слу­ша­ет на пор­ту 3000 и уже на адре­се 127.0.0.1:

ss -tunlp | grep :3000

Мы долж­ны увидеть:

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.