Node.js, Raspberry Pi a nginx - viac webov na jednom porte

Publikoval Michal Kočí dňa 14.7.2015 o 11:00 v kategóriach Node.js a Raspberry Pi

Už viete ako nainštalovať Node.js na Raspberry Pi a tiež ako nainštalovať Node.js aplikáciu ako službu. A dnes si ukážeme, ako na Raspberry nainštalovať reverznú proxy nginx, ktorá vám pomôže bežať na jednom porte viacero webov.

Prečo používať reverznú proxy nginx?

Ak chcete na jednom Raspberry viac Node.js webov veľmi rýchlo narazíte na problém - akonáhle niektorý port začne používať vaša aplikácia, ďalšiu sa na tom istom porte už spustiť nepodarí (iba ak na inej IP adrese).

Ak je vám jedno, na akom porte aplikácia beží, tak si každú nakonfigurujete pre iný port a nginx vôbec nepotrebujete. Lenže potom iba jedna bude môcť bežať na porte 80, ďalšie na iných portoch a teda tie bežiace na iných portoch budete musieť v prehliadači otvárať aj s definovaním portu, lebo štandardný port pre HTTP je 80. Čo je nepekné, ale nemusí vám to vadiť.

Ak vám to vadí, môžete toto obmedzenie ľahko odstrániť práve použitím reverznej proxy. Fungovať to potom bude nasledovne:

  • Nainštalujete si reverznú proxy (napríklad nginx) a spustíte ju na porte 80
  • Spustíte si vaše Node.js aplikácie, každú na inom porte (napr. 8101, 8102, ...)
  • Nakonfigurujete nginx tak, aby prichádzajúce požiadavky interne smeroval na jednu z vašich aplikácií. Na ktorú? Obvykle sa smeruje podľa doménového mena.

Pre účely tohto článku predpokladajme, že máte dva weby. Oba sú Node.js aplikácie (v zásade je však jedno, môžu byť aj v PHP, ...) a jedna beží na porte 8101 a druhá na porte 8102. Obe ste si nainštalovali ako službu podľa predchádzajúceho príspevku.

Chceli by ste sa rýchlo a ľahko naučiť programovať webové aplikácie v Javascripte a bežať ich na Node.js? Jednoduché. Rád vás to naučím na mojom školení Node.js - serverových aplikácií v Javascripte.

A predpokladajme, že ste si kúpili dve domény, na ktorých chcete aplikácie bežať - www.mojaprvadomena.sk a www.mojadruhadomena.sk. Obe v DNS nasmerujete práve na vaše Raspberry PI.

Inštalácia nginx

Inštalácia nginx je veľmi jednoduchá. Nainštalujte si ho a hneď si ho môžete aj manuálne spustiť (v budúcnosti sa bude spúšťať automaticky pri boote zariadenia):

sudo apt-get install nginx
sudo /etc/init.d/nginx start

Super, nainštalované a spustené. Teraz musíte nakonfigurovať jednotlivé weby.

Konfigurácia prvého webu

nginx sa konfiguruje v adresári /etc/nginx a v ňom budete pracovať s dvomi základnými podadresármi - v prvom (sites-available) budete konfigurovať jednotlivé weby. V druhom (sites-enabled) potom vytvoríte symbolický link na tie weby z prvého adresára, ktoré chcete povoliť.

Poďme teda nakonfigurovať prvý web. Prepnite sa do adresára dostupných webov:

cd /etc/nginx/sites-available

A vytvorte v ňom konfiguračný súbor pre váš prvý web, pomenujeme si ho mojaprvadomena:

nano mojaprvadomena

A zeditujte (nakonfigurujte) ho takto:

server {
  listen 80;
  server_name mojaprvadomena.sk www.mojaprvadomena.sk;
  access_log /var/log/nginx/mojaprvadomena.log;

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_pass http://localhost:8101/;
    proxy_redirect off;
  }
}

Preložené do ľudskej reči - chcete aby nginx počúval na porte 80 a použil práve túto konfiguráciu ak požiadavka došla na web mojaprvadomena.sk, čo rozpozná z Host HTTP hlavičky. A chcete si logovať všetky prístupy do log súboru.

Proxy nastavíte tak, že bude všetky požiadavky preposielať ďalej na vašu Node.js aplikáciu bežiacu na tomto istom počítači (localhost) na porte 8101. A okrem preposlania celého HTTP requestu vám nginx do requestu pridá niekoľko ďalších hlavičiek, aby ste, ak chcete, v aplikácii vedeli napríklad zistiť reálnu IP adresu užívateľa.

Dobre, súbor ste uložili, čiže nginx už vie o vašom webe, ale tento ešte nie je povolený. Aby ste ho povolili, musí byť rovnaký súbor v adresári sites-enabled. No a najšikovnejšie to zabezpečíte vytvorením symbolického odkazu - tak budete mať konfiguráciu iba v adresári sites-available a nebudete ju manuálne duplikovať:

cd /etc/nginx/sites-enabled/ 
ln -s /etc/nginx/sites-available/mojaprvadomena mojaprvadomena

Akonáhle máte web povolený, musíte ešte zreštartovať nginx aby si znovu načítal novú konfiguráciu:

sudo /etc/init.d/nginx restart

Hotovo, prvý web nakonfigurovaný, môžete vyskúšať.

Konfigurácia druhého webu

Druhý web nakonfigurujete obdobne, zmena bude v názve domény a samozrejme v porte, na ktorý bude nginx smerovať dotazy:

server {
  listen 80;
  server_name mojadruhadomena.sk www.mojadruhadomena.sk;
  access_log /var/log/nginx/mojadruhadomena.log;

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_pass http://localhost:8102/;
    proxy_redirect off;
  }
}

Túto konfiguráciu uložte do súboru /etc/nginx/sites-available/mojadruhadomena a následne web povoľte a znovu reštartujte nginx:

cd /etc/nginx/sites-enabled/ 
ln -s /etc/nginx/sites-available/mojadruhadomena mojadruhadomena
sudo /etc/init.d/nginx restart

Gratulujem, ak ste si správne nastavili DNS záznamy, tie ukazujú na vaše Raspberry Pi, potom pri prístupe na mojaprvadomena.sk a mojadruhadomena.sk sa vám načíta správny web.

Nabudúce nasadenie/deployment

V tomto momente máme weby, ktoré nám bežia na Raspberry Pi, čo je super. A viete, čo by ešte bolo super? Robiť deployment webov jednoducho rovno z vášho vývojového prostredia. Ako na to sa pozrieme v ďalšom príspevku. Takže, ostaňte naladení...

Mohlo by ťa tiež zaujímať

Páčil sa ti príspevok?

Zdieľaj príspevok alebo si ho odlož na neskôr

Sleduj ma

Ak nechceš premeškať príspevky ako je tento, sleduj ma na Twitteri, alebo ak máš RSS čítačku, môžeš sledovať môj RSS kanál.

Komentáre

K tomuto článku nie su pridané žiadne komentáre.

Pridať komentár

Máš niečo zaujímavé povedať k článku? Pridaj to k článku ako komentár. Spam, reklamu alebo inak nerelevantné komentáre okamžite mažem.