Node.js aplikace jako Windows služba

Zápisník experimentátora

Hierarchy: Node.js

V tomto článku si ukážeme, jak nainstalovat Node.js aplikaci do Windows jako službu. To zajistí, že po zapnutí počítače bude aplikace spuštěna. Tento postup využívá balíček PM2.

Instalace Node.js

Ze stránky https://nodejs.org/ si stáhněte instalační program. Máte na výběr několik možností. Za běžných okolností se snažte instalovat tu verzi, při které vidíte upozornění Recommended For Most Users.

PM2

PM2 (https://pm2.keymetrics.io/) je proces manažer pro programy napsané v Node.js.

Nastavení proměnné prostředí

Při instalaci ve Windows je důležité nejprve nastavit proměnnou prostředí PM2_HOME do takového adresáře, který je viditelný pro všechny procesy. Je vhodné použít takový adresář, který se při správě automaticky spuštěných aplikací bude dobře hledat. Například pokud máte aplikaci apx nainstalovanou v d:\app\apx, nastavit tuto proměnnou na adresář d:\app\pm2. Nezapomeňte tento adresář vytvořit na disku.

  • d:
    • app
      • pm2
      • apx

Nastavování proměnné se bude lišit podle verze Windows na serveru. Zde je několik možných příkladů.

  • Windows 8 - Klikněte pravou myší na ikonu startu a vyberte možnost System. Potom Advanced system settings. Na záložce Advanced je tlačítko Enviroment variables. Položku PM2_HOME přidejte do System variables.
  • Windows Server 2016 - Klikněte pravou myší na ikonu startu a vyberte možnost System. Potom Advanced system settings. Na záložce Advanced je tlačítko Enviroment variables. Položku PM2_HOME přidejte do System variables.

Instalace

Spusťte si cmd.exe ako admin.

npm install pm2 -g
pm2 install pm2-logrotate

Po instalaci uvidíte v příkazovém řádku toto. Je spuštěn modul pm2-logrotate a seznam aplikací je prázdný.

V adresáři PM2_HOME vzniklo několik souborů. V souboru pm2.log najdete doplňující informace o startu. Když do PM2 přidáte nějaké aplikace, jejich seznam i s nastavením prostředí se zapíše do souboru dump.pm2. V adresáři logs se budou objevovat logy. Pokud vznikne nějaký problém, pak určitě zkontrolujte obsah tohoto adresáře.

V této chvíli máme nainstalované vše potřebné k používání PM2. Po restartu počítače se ale PM2 automaticky nenastartuje. Je třeba ještě doplnit Windows službu, která ho spustí při startu.

Windows služba

Oficiální dokumentace je v tomto bodě velmi stručná a nedočtete se v ní aktuální informace. Doporučený balíček je pm2-windows-service. Ten ale není dlouhodobě udržován a proto je třeba místo něj použít @innomizetech/pm2-windows-service. Původní balíček obsahuje odkazy na zastaralé balíčky a během instalace na novějších Windows se zasekne.

Program pm2-service-install se bude ptát několik otázek. Na všechny odpovídejte ne. Program to sice doporučuje, ale na správný běh vám stačí pouze nastavení proměnné PM2_HOME. To nastavení proměnných totiž ovlivňuje spouštění aplikací přes PM2 a je lepší všechny aplikace ovládat jen přes PM2. Během instalace se zobrazí i poměrně dlouhá cesta do adresáře. Je dobré, pokud si ji zapamatujete, protože v tom adresáři najdete další log, který obsahuje informace o tom, jak se služba Windows spustila. Obvykle ho nebudete potřebovat, ale někdy se stane, že se Windows restartují, případně si vynucují pouze restart služeb a pokud máte v aplikacích chyby a nejsou dobře navrženy pro zpracování restartů, pak můžete v tomto logu nalézt užitečné informace o restartech.

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

Nyní máte systém připraven tak, aby se i po restartu Windows Node.js aplikace spustila. Jednotlivé aplikace je vhodné do PM2 přidávat pomocí vygenerovaného souboru ecosystem.config.js. V tomto souboru si nastavíte všechny parametry pro aplikaci, které potřebujete. V adresáři, kde máte aplikaci nainstalovanou, si ji do PM2 přidáte příkazem.

pm2 start ecosystem.config.js
pm2 save

Příklad souboru, který používám na to, aby se aplikace sama restartovala při změnách, ignorovala změny v některých adresářích a nespouštěla se jako šílená v případě chyby je v následující ukázce.

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