Node.js aplikácia ako Windows služba

Zápisník experimentátora

Hierarchy: Node.js

V tomto článku si ukážeme, ako nainštalovať Node.js aplikáciu do Windows ako službu. To zabezpečí, že po zapnutí počítača bude aplikácia spustená. Tento postup využíva balíček PM2.

Inštalácia Node.js

Zo stránky https://nodejs.org/ si stiahnite inštalačný program. Máte na výber niekoľko možností. Za bežných okolností sa snažte inštalovať tú verziu, pri ktorej vidíte upozornenie Recommended For Most Users.

PM2

PM2 (https://pm2.keymetrics.io/) je proces manažér pre programy napísané v Node.js.

Nastavenie premennej prostredia

Pri inštalácii vo Windows je dôležité najprv nastaviť premennú prostredia PM2_HOME do takého adresára, ktorý je viditeľný pre všetky procesy. Je vhodné použiť taký adresár, ktorý sa pri správe automaticky spustených aplikácií bude dobre hľadať. Napríklad ak máte aplikáciu apx nainštalovanú v d:\app\apx, nastaviť túto premennú na adresár d:\app\pm2. Nezabudnite tento adresár vytvoriť na disku.

  • d:
    • app
      • pm2
      • apx

Nastavovanie premennej sa bude líšiť podľa verzie Windows na serveri. Tu je niekoľko možných príkladov.

  • Windows 8 - Kliknite pravou myškou na ikonu štartu a vyberte položku System. Potom Advanced system settings. Na záložke Advanced je tlačidlo Enviroment variables. Položku PM2_HOME pridajte do System variables.
  • Windows Server 2016 - Kliknite pravou myškou na ikonu štartu a vyberte položku System. Potom Advanced system settings. Na záložke Advanced je tlačidlo Enviroment variables. Položku PM2_HOME pridajte do System variables.

Inštalácia

Spustite si cmd.exe ako admin.

npm install pm2 -g
pm2 install pm2-logrotate

Po inštalácii uvidíte v príkazovom riadku toto. Je spustený modul pm2-logrotate a zoznam aplikácií je prázdny.

V adresári PM2_HOME vzniklo niekoľko súborov. V súbore pm2.log nájdete doplňujúce informácie o štarte. Keď do PM2 pridáte nejaké aplikácie, ich zoznam aj s nastavením prostredia sa zapíše do súboru dump.pm2. V adresári logs sa budú objavovať logy. Ak vznikne nejaký problém, potom určite skontrolujte obsah tohoto adresára.

V tejto chvíli máme nainštalované všetko potrebné na používanie PM2. Po reštarte počítača sa ale PM2 automaticky nenaštartuje. Treba ešte doplniť Windows službu, ktorá ho spustí pri štarte.

Windows služba

Oficiálna dokumentácia je v tomto bode veľmi stručná a nedočítate sa v nej aktuálne informácie. Odporúčaný balíček je pm2-windows-service. Ten ale nie je dlhodobo udržiavaný a preto treba namiesto neho použiť @innomizetech/pm2-windows-service. Pôvodný balíček obsahuje odkazy na zastarané balíčky a počas inštalácie na novších Windows sa zasekne.

Program pm2-service-install sa bude pýtať niekoľko otázok. Na všetky odpovedajte nie. Program to síce odporúča, ale na správny beh vám stačí len nastavenie premennej PM2_HOME. To nastavenie premenných totiž ovplyvňuje spúšťanie aplikácií cez PM2 a je lepšie všetky aplikácie ovládať len cez PM2. Počas inštalácie sa zobrazí aj pomerne dlhá cesta do adresára. Je dobré, ak si ju zapamätáte, pretože v tom adresári nájdete ďalší log, ktorý obsahuje informácie o tom, ako sa služba Windows spustila. Obvykle ho nebudete potrebovať, ale niekedy sa stane, že sa Windows reštartujú, prípadne si vynucujú iba reštart služieb a ak máte v aplikáciách chyby a nie sú dobre navrhnuté na spracovanie reštartov, potom môžete v tomto logu nájsť užitočné informácie o reštartoch.

npm i @innomizetech/pm2-windows-service -g
pm2-service-install

Teraz máte systém pripravený tak, aby sa aj po reštarte Windows Node.js aplikácia spustila. Jednotlivé aplikácie je vhodné do PM2 pridávať pomocou vygenerovaného súboru ecosystem.config.js. V tomto súbore si nastavíte všetky parametre pre aplikáciu, ktoré potrebujete. V adresári, kde máte aplikáciu nainštalovanú, si ju do PM2 pridáte príkazom.

pm2 start ecosystem.config.js
pm2 save

Príklad súboru, ktorý používam na to, aby sa aplikácia sama reštartovala pri zmenách, ignorovala zmeny v niektorých adresároch a nespúšťala sa ako šialená v prípade chyby je v nasledujúcej ukážke.

module.exports = {
  apps: [{
    name: 'optivusapi',
    script: './bin/www',
    watch: true,
    watch_delay: 30000,
    ignore_watch: ["node_modules", "logs", "log"],
    restart_delay: 6000,
    max_memory_restart: '300M',
    env: {
      NODE_ENV: 'production'
    }
  }]
};

 


03.04.2020


Menu