Node.js veebirakendused nüüd Zone virtuaalserveris – kauba peale PM2, mod_proxy ja portide suunamine

Võimalus käsurealt Node.js rakenduste käivitamiseks tekkis Zone virtuaalserverites umbes aasta tagasi koos SSH-ligipääsu lubamisega – aga kuna kogu veebiliikluse võttis enda peale Apache, puudus võimalus neile internetist ligi pääseda. Ekstreemsemad kasutajad aga leidsid omal käel lahendusi – passiivse FTP jaoks on mingi pordivahemik ikkagi avatud, mod_proxy abil saab liiklust suunata ja cron’i saab panna skripti, mis tagab rakenduse käigushoidmise. Katsetamiseks “intellektuaalselt huvitav nipp”, aga selle abil kaugele ei purjeta.

Kui aga hakkasime kasutajate huvist tulenevalt Node.js veebirakenduste jaoks head lahendust otsima – algselt plaanitud kiire nädalavahetuse-häkatonina – jõudsime oluliselt laiemat kasutust omavate komponentideni virtuaalserveri halduses:

  • Erinevate rakenduste seadistamise ja serveri restardil automaatse käivitamise võimalus (seda kasutab juba meie Redis-vahemälu lahendus.)
  • PM2 protsessihaldur, mille abil saab käivitada ja hallata Node.js rakendusi (aga ka näiteks PHP või shelli skripte).
  • Apache mod_proxy seadistus, mis võimaldab suunata veebiliikluse (ehk port 80 ja HTTPS puhul ka 443) kasutaja rakenduse poolt kuulatavasse porti.
  • Portide suunamine (port forwarding), mis võimaldab virtuaalserverile eraldatud IP kasutamisel avada ja suunata väliseid porte (>1024) ja sobib mh WebSocket’it implementeerivate rakenduste jaoks.

Kuidas seda kõike kohe omal nahal järgi proovida?

Sellest videost leiab “Hello world” rakenduse käivitamise näite – keerulisemad juhud nagu tuntumate raamistike kasutamine, Websockets’i tugi jms saavad oma videoõpetused veidi hiljem.

Meetod 1 – mod_proxy

Alustaks ühest väga lihtsast Node.js “Hello World!” rakendusest – teen testimise tarbeks virtuaalserveri halduses uue alamdomeeni node.miljonivaade.eu ja määran sinna lisandunud parameetri mod_proxy sihtpordi väärtuseks 8080. Selle tulemusel hakkab Apache toimima reverse proxy‘na ehk kõik porti 80 tulevad HTTP päringud suunatakse edasi localhost’i porti 8080.

node-subdomain-dip

Kui domeenil või alamdomeenil on lubatud ka HTTPS, saab selle seadistada samamoodi (või kasutada HTTP seadeid) – seejuures on oluline arvestada, et nagu reverse proxy puhul sageli tavaks, toimub turvaline SSL ühendus kasutaja ja Apache vahel, sealt edasi Node.js rakenduseni liigub lahtine HTTP päring.

Seejärel laen üles app.js koodi (asukohaks ei pea olema alamdomeeni kodukataloog):

var http = require("http");

http.createServer(function (request, response) {
 response.writeHead(200, {'Content-Type': 'text/plain'});
 response.end('Hello World! I am a Node.js app :-)\n');
}).listen(8080);

Nagu näha, tekitab see porti 8080 kuulava veebiserveri ning tagamaks selle käivitamise ka pärast tõrget või füüsilise serveri restarti, on vaja see lisada PM2 protsessihaldurisse (Veebiserver › Node.js ja PM2):

node-add-app

Rakendusi saab lisada nii .js kui PM2 rakenduse deklaratsiooni .json või .yml failina, mis lubab seadistada kõiki PM2 parameetreid, käivitada korraga mitut rakendust jpm.

Kasutada olev summaarne mälukogus sõltub virtuaalserveri paketist ning seda saab jagada mitme rakenduse vahel omal äranägemisel.

Protsessi lisamise järel võib minna kuni 3 minutit selle tegeliku käivitumiseni, olekut näeb lehe uuestilaadimisel (tulevikus loodetavasti ka ilma laadimiseta). Ja kui see on “Käivitatud”, siis võib testima asuda:

hello-there

Edaspidi saab rakendust samast kohast virtuaalserveri halduses peatada, muuta, kustutada ja restartida.

Meetod 2 – port forwarding

Selle lihtsa mod_proxy lahenduse puhul ei toimi aga WebSocket ühendused, nende jaoks oleks vaja kogu välisesse porti tulev liiklus rakendusele suunata.

Selleks lisasime virtuaalserveri haldusesse pordi suunamise võimaluse – tõsi, selle kasutamiseks on vaja eraldi IP-aadressi, mida pakub Pakett III (üks aadress sisaldub hinnas, selle aktiveerimiseks tuleb saata kiri klienditoele). Olgu siinkohal mainitud, et portide suunamine kasutamine torrenti- või mänguserveri, proxy vms teenuse jaoks on rangelt keelatud seoses võimalike juriidiliste ja serveri koormuse küsimustega. Kui kahtled plaanitava kasutuse lubatavuses, siis kirjuta palun meie kasutajatoele ning kirjelda oma rakendust ja eeldatavat kasutajate hulka.

Demoks sobib kenasti socket.io näidis-chat, mille paigaldan serveris vabalt valitud asukohta, tehes SSH abil vajalikud npm install’id ja seadistan seejärel PM2 abil käivitatavaks:

node-app-list

Kui nüüd ülevalpool olevat alamdomeeni seadistust uuesti vaadata, hakkab loodetavasti silma, et seal on alamdomeenile eraldi IP-aadress juba määratud (217.146.71.171) ning mul pole vaja teha muud, kui lisada vastav pordi suunamine näidis-chatis kasutusel oleva port 3000 jaoks:

node-port-forward

Pordi suunamise rakendumine võib aega võtta kuni 10 minutit. Selle ajaga jõuab teha väikse kohvipausi ja minnes seejärel aadressile node.miljonivaade.eu:3000 … on tulemuseks toimiv chat:

weirdo-chat

Mis edasi?

Edasi võiks proovida näiteks rakenduse käivitamist mitte .js, vaid .json abil – kui lisada sama “Hello, World” rakenduse kataloogi selline app.json, muuta vastavalt PM2 seadistuses rakenduse asukoht ja see taaskäivitada …

{
 "apps" : [{
 "name" : "hello-world",
 "script" : "app.js",
 "watch" : true,
 "cwd" : "/data02/virt33390/domeenid/www.miljonivaade.eu/nodetest",
 }]
}

… siis hakkab PM2 jälgima parameeteriga cwd määratud kataloogis toimuvaid failimuutusi ja restardib rakenduse automaatselt. Mugav harjutamise või arenduse käigus, aga ilmselt tasuks production’is mitte peale unustada. Samuti “te ei usu, mis juhtub”, kui watch’iga rakendus midagi ise enda kataloogi kirjutab, näiteks logifaili: rakendus ‘retarditakse’ ehk PM2 proovib kümmekond korda restartida ja loeb siis asja lootusetuks.

Kui PM2 käivitusprotsessis miski nihu läheb – või on soov katsetada ilma virtuaalserveri haldust mängu segamata – siis saab sellele ligi ka SSH abil. Olulisemad käsud leiab PM2 spikrist, samas on kirjas ka kataloogistruktuur, mille PM2 tekitab virtuaalserveri kodukataloogi alla (sealt leiab nii rakenduste kui PM2 logid).

pm2-list

Ja kuna PM2 on tehtud Keymetrics’i poolt … siis saab ühe käsuga lisada ka nende monitooringu (lihtsam vaade tasuta, paremad tööriistad ja teavitused raha eest):

pm2-keymetrics

Ja edasi edasi?

Uuri, proovi, katseta – ilmselt on paslik seda lahendust hetkel beetaks lugeda ning anda meile teada sellest, mis ei toimi oodatud viisil, vajaks muutmist või lisamist. Või siis mis toimib väga hästi ja lahendab tegelikke probleeme 🙂

Teada võib anda otse siinsamas kommentaari-sabas, meie FB-lehel, kirjutades peeter@zone.ee või liitudes Skype grupi-chatiga.

Korduma Kippuvad Küsimused

Mis Node.js versiooni kasutate? Hetkel on selleks 6.3.0, edaspidi hakkame hoidma kõiki servereid värskeima LTS peal.

Palju mälu kasutada saab? Sõltub paketist – I, II ja III vastavalt 512MB, 768MB ja 1024MB. Mälupiir on hetkel soft limit ehk toimub “proaktiivne monitooring” ja piiritundetud kasutajad kutsutakse küberneetiliselt korrale.

Ma saan selle PM2 ju ise kah SSHs käima tõmmata? Tõsi, aga siis ei ole tagatud rakenduste taaskäivitumine serveri restardi puhul.

Miks te PM2 valisite, xyz on palju parem? Sellepärast, et.

Kas Node.js binaarsed moodulid ei olegi toetatud? Kuna oleme otsustanud kompilaatoreid virtuaalserverites mitte pakkuda, puudub ka võimalus binaarseid mooduleid paigaldamise käigus kompileerida. Meie hinnangul saab suurem osa Node.js rakendustest ilma hakkama.

Rohkem küsimusi ei ole? Hakkame siis tööle!
(kui on küsimusi – võid liituda Skype grupi-chatiga)