Node.js caur nvm un aplikācijas palaišana ar pm2

Palaist serverī ar vienu komandu (vispirms pārbaudiet skripta saturu zemāk):

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

…vai ar wget:

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

Skripta saturs ustanovit-nodejs-pm2.sh:

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

APP_DIR=/var/www/myapp

# 1. nvm uzstādīšana un ielāde pašreizējā sesijā
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 pēc noklusējuma
nvm install --lts
nvm use --lts
nvm alias default 'lts/*'

# 3. Aplikācijas atkarības (precīzas versijas no lock faila)
cd "$APP_DIR"
npm ci --omit=dev

# 4. pm2 uzstādīšana un aplikācijas palaišana
npm install -g pm2
pm2 start app.js --name myapp

# 5. Automātiskais starts pēc servera pārstartēšanas
sudo env PATH=$PATH:$(dirname "$(command -v node)") \
  pm2 startup systemd -u "$USER" --hp "$HOME"
pm2 save

pm2 status
echo "Node.js aplikācija myapp palaista zem pm2."

Lai Node.js aplikācija ražošanā strādātu stabili, to nevar vienkārši palaist ar komandu node app.js SSH sesijā — tā apstāsies, tiklīdz sesija beigsies. Vajadzīgs procesu pārvaldnieks pm2: tas uztur aplikāciju dzīvu, pārstartē to pēc kritiena un palaiž pēc servera pārstartēšanas. Bet pašu Node.js ērti uzstādīt caur nvm — tad viegli pārslēgt versijas.

1. solis. nvm uzstādīšana

nvm (Node Version Manager) uzstāda Node.js bez root tiesībām un ļauj turēt vairākas versijas:

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

Pārbaudiet:

nvm --version

2. solis. Node.js LTS uzstādīšana

Uzstādiet LTS versiju — tā ir stabila un saņem ilgu atbalstu:

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

Pārbaudiet versijas:

node -v
npm -v

3. solis. Aplikācijas sagatavošana

Ielādējiet kodu (ar git clone vai rsync) un uzstādiet atkarības ražošanas režīmā:

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

npm ci uzstāda precīzas versijas no package-lock.json — tas ir paredzamāk nekā npm install. Pārbaudiet, vai aplikācija startē:

node app.js

Ja redzējāt «server listening on port 3000», apturiet to (Ctrl+C) un pārejiet pie pm2.

4. solis. pm2 uzstādīšana un palaišana

Uzstādiet pm2 globāli un palaidiet aplikāciju:

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

Aplikācijām ar ieejas punktu failā package.json:

pm2 start npm --name myapp -- run start

Pārbaudiet statusu:

pm2 status
pm2 logs myapp

5. solis. Automātiskais starts pēc pārstartēšanas

Lai pm2 paceltu aplikācijas servera startā, ģenerējiet systemd servisu un saglabājiet procesu sarakstu:

pm2 startup systemd
# izpildiet komandu, ko pm2 izvadīs (sākas ar sudo env ...)
pm2 save

pm2 save fiksē pašreizējo procesu kopumu, bet pm2 resurrect tos automātiski atjaunos pēc pārstartēšanas.

6. solis. Klastera režīms (pēc izvēles)

Ja aplikācija atbalsta vairākus darbiniekus, pm2 var palaist procesu uz visiem CPU kodoliem:

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

Tas balansē slodzi starp kodoliem bez ārēja slodzes balansētāja.

Noderīgas pm2 komandas

Uzdevums Komanda
Procesu saraksts pm2 list
Pārstartēšana pm2 restart myapp
Plūstoša pārlāde pm2 reload myapp
Apturēt pm2 stop myapp
Dzēst no pm2 pm2 delete myapp
Monitorings pm2 monit

Biežākie jautājumi

Kāpēc vajadzīgs nvm, ja Node.js ir pieejams apt repozitorijā? Ubuntu repozitorija versija bieži ir novecojusi. nvm uzstāda jebkuru vajadzīgo versiju un ļauj ātri pārslēgties starp projektiem ar atšķirīgām prasībām.

Ar ko pm2 restart atšķiras no reload? restart pilnībā pārstartē procesu (ar īsu dīkstāvi), bet reload klastera režīmā pārstartē darbiniekus pēc kārtas bez dīkstāves (zero-downtime).

Aplikācija krīt — vai pm2 to pacels? Jā, pm2 automātiski pārstartē kritušu procesu. Iestatiet --max-restarts un sekojiet žurnāliem, lai pastāvīgas kļūdas gadījumā pārstartēšana nesāktu ciklu.

Kā ierobežot procesa atmiņu? Karogs --max-memory-restart 300M pārstartēs aplikāciju, kad limits būs pārsniegts — tā ir aizsardzība pret atmiņas noplūdēm.

Node.js aplikācijas iegūst no ātra CPU un pietiekamas atmiņas. Serveri var izvēlēties lapā VPS serveru noma, bet konteinerizētiem būvējumiem noderēs Docker VPS.

Edgars Kalējs