Node.js diegimas su nvm ir paleidimas su pm2

Paleiskite serveryje viena komanda (pirmiausia patikrinkite skripto turinį žemiau):

curl -sSL https://cp.lv/scripts/ustanovit-nodejs-pm2.sh | sudo bash

…arba su wget:

wget -qO- https://cp.lv/scripts/ustanovit-nodejs-pm2.sh | sudo bash

Skripto turinys ustanovit-nodejs-pm2.sh:

#!/usr/bin/env bash
set -e

APP_DIR=/var/www/myapp

# 1. Install nvm and load it into the current shell
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

# 2. Node.js LTS as the default version
nvm install --lts
nvm use --lts
nvm alias default 'lts/*'

# 3. Application dependencies (exact versions from the lock file)
cd "$APP_DIR"
npm ci --omit=dev

# 4. Install pm2 and start the application
npm install -g pm2
pm2 start app.js --name myapp

# 5. Start automatically after a server reboot
sudo env PATH=$PATH:$(dirname "$(command -v node)") \
  pm2 startup systemd -u "$USER" --hp "$HOME"
pm2 save

pm2 status
echo "Node.js application myapp is running under pm2."

Kad Node.js programa gamybinėje aplinkoje veiktų stabiliai, jos negalima tiesiog paleisti komanda node app.js SSH sesijoje — ji sustos jums atsijungus. Reikia procesų valdiklio pm2: jis palaiko programą gyvą, perkrauna ją nukritus ir paleidžia po serverio perkrovimo. O patį Node.js patogu diegti per nvm — tada lengva perjungti versijas.

1 žingsnis. nvm diegimas

nvm (Node Version Manager) įdiegia Node.js be root teisių ir leidžia laikyti kelias versijas:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
source ~/.bashrc

Patikrinkite:

nvm --version

2 žingsnis. Node.js LTS diegimas

Diekite LTS versiją — ji stabili ir ilgai palaikoma:

nvm install --lts
nvm use --lts
nvm alias default lts/*

Patikrinkite versijas:

node -v
npm -v

3 žingsnis. Programos paruošimas

Įkelkite kodą (per git clone arba rsync) ir įdiekite priklausomybes gamybiniu režimu:

cd /var/www/myapp
npm ci --omit=dev

npm ci įdiegia tikslias versijas iš package-lock.json — tai nuspėjamiau nei npm install. Patikrinkite, ar programa pasileidžia:

node app.js

Jei pamatėte „server listening on port 3000“ — sustabdykite (Ctrl+C) ir pereikite prie pm2.

4 žingsnis. pm2 diegimas ir paleidimas

Įdiekite pm2 globaliai ir paleiskite programą:

npm install -g pm2
pm2 start app.js --name myapp

Programoms, kurių įėjimo taškas nurodytas package.json faile:

pm2 start npm --name myapp -- run start

Patikrinkite būseną:

pm2 status
pm2 logs myapp

5 žingsnis. Automatinis paleidimas po perkrovimo

Kad pm2 keltų programas serveriui startuojant, sugeneruokite systemd servisą ir išsaugokite procesų sąrašą:

pm2 startup systemd
# įvykdykite komandą, kurią pm2 išves (prasideda nuo sudo env ...)
pm2 save

pm2 save užfiksuoja esamą procesų rinkinį, o pm2 resurrect automatiškai atkuria juos po perkrovimo.

6 žingsnis. Klasterio režimas (pasirinktinai)

Jei programa palaiko kelis darbininkus, pm2 gali paleisti procesą visuose CPU branduoliuose:

pm2 start app.js --name myapp -i max

Tai paskirsto krūvį tarp branduolių be išorinio apkrovos balansuoklio.

Naudingos pm2 komandos

Užduotis Komanda
Procesų sąrašas pm2 list
Perkrauti pm2 restart myapp
Sklandus perkrovimas pm2 reload myapp
Sustabdyti pm2 stop myapp
Pašalinti iš pm2 pm2 delete myapp
Stebėsena pm2 monit

Dažni klausimai

Kam reikalingas nvm, jei Node.js yra apt saugykloje? Ubuntu saugyklos versija dažnai pasenusi. nvm įdiegia bet kurią reikiamą versiją ir leidžia greitai perjungti tarp projektų su skirtingais reikalavimais.

Kuo pm2 restart skiriasi nuo reload? restart visiškai perkrauna procesą (su trumpa prastova), o reload klasterio režime perkrauna darbininkus paeiliui be prastovos (zero-downtime).

Programa nukrinta — ar pm2 ją pakels? Taip, pm2 automatiškai perkrauna nukritusį procesą. Sukonfigūruokite --max-restarts ir stebėkite žurnalus, kad esant nuolatinei klaidai perkrovimas neįsisuktų į ciklą.

Kaip apriboti proceso atmintį? Vėliavėlė --max-memory-restart 300M perkraus programą viršijus limitą — tai apsauga nuo atminties nutekėjimų.

Node.js programoms naudingas greitas CPU ir pakankamai atminties. Serverį galite išsirinkti puslapyje VPS serverio nuoma, o konteinerinėms sąrankoms pravers Docker VPS.

Edgars Kalējs