Visi raksti
PM2 Node.js process manager dashboard with terminal
  • PM2
  • Node.js
  • Deployment
  • Process Management
  • VPS

PM2 Node.js procesu pārvaldības rokasgrāmata

Pilnīga rokasgrāmata PM2 izmantošanai ar Node.js lietotnēm — palaišana, apturēšana, uzraudzība, klasterizācija, žurnālu pārvaldība, ekosistēmas konfigurācijas faili un izdzīvošana pēc servera restartiem.

3 min lasīšana

PM2 ir standarta procesu pārvaldnieks Node.js lietotnēm ražošanā. Tas uztur lietotni aktīvu pēc avārijām, restartē to pēc servera pārstartēšanas, nodrošina iebūvētu žurnālu pārvaldību un atbalsta klastera režīmu daudzserdeņu veiktspējai. Šī rokasgrāmata aptver visu, kas nepieciešams ražošanas iestatīšanai.

Instalēšana

Instalē PM2 globāli ar npm:

sudo npm install -g pm2

Pārbaudi instalēšanu:

pm2 --version

Lietotņu palaišana

Skriptu palaišana tieši

pm2 start app.js --name "mana-lietotne"

npm skripta palaišana

pm2 start npm --name "mana-lietotne" -- start

Konkrēta ieejas punkta palaišana

Astro (Node adapterim), Next.js standalone vai jebkuram pielāgotam servera failam:

# Astro (Node adapteris)
pm2 start dist/server/entry.mjs --name "astro-app"

# Next.js standalone
pm2 start .next/standalone/server.js --name "next-app"

# Pielāgots Express serveris
pm2 start server.js --name "api-server"

Vides mainīgo nodošana startā

pm2 start app.js --name "mana-lietotne" --env production
# vai tieši:
PORT=8080 NODE_ENV=production pm2 start app.js --name "mana-lietotne"

Pamata procesu komandas

pm2 list                    # Uzskaitīt visus darbojošos procesus
pm2 status                  # Tāpat kā pm2 list
pm2 show mana-lietotne      # Detalizēta informācija par vienu procesu

pm2 stop mana-lietotne      # Apturēt (paliek sarakstā)
pm2 start mana-lietotne     # Palaist apturētu procesu
pm2 restart mana-lietotne   # Restartēt (īsa pārtraukšana)
pm2 reload mana-lietotne    # Nulles pārtraukuma restartēšana (klastera režīms)
pm2 delete mana-lietotne    # Noņemt no saraksta pilnībā

pm2 stop all                # Apturēt visus procesus
pm2 restart all             # Restartēt visus procesus
pm2 delete all              # Noņemt visus procesus

Procesus var atsaukties pēc nosaukuma vai numeriskā ID no pm2 list.


Izdzīvošana pēc servera restartiem

Šis ir vissvarīgākais solis ražošanā. Bez tā lietotne netiks restartēta pēc restarta.

1. Ģenerē startup skriptu

pm2 startup

PM2 izvada komandu, kas pielāgota tavai sistēmai. Nokopē un izpildi to — tā izskatās šādi:

sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u ubuntu --hp /home/ubuntu

2. Saglabā pašreizējo procesu sarakstu

pm2 save

Tas saglabā darbojošos procesu sarakstu failā ~/.pm2/dump.pm2. Pēc restarta PM2 tos automātiski atjauno.

Palaid pm2 save atkārtoti ikreiz, kad pievieno, noņem vai maina procesu.

3. Pārbaudi startup reģistrāciju

pm2 ls          # Pārliecinies, ka procesi ir uzskaitīti
sudo systemctl status pm2-$(whoami)

Ekosistēmas konfigurācijas fails

Jebkam, kas pārsniedz vienkāršu vienas rindas komandu, izmanto ekosistēmas failu. Tas saglabā visu PM2 konfigurāciju versiju kontrolē.

Izveido ecosystem.config.cjs projekta saknē:

// ecosystem.config.cjs
module.exports = {
  apps: [
    {
      name: 'mana-lietotne',
      script: 'dist/server/entry.mjs',

      // Instanču skaits — 'max' izmanto visus CPU serdeņus
      instances: 1,

      // Automātiski restartēt pēc avārijas
      autorestart: true,

      // Vērot failus un restartēt pie izmaiņām (tikai izstrādē)
      watch: false,

      // Atmiņas limits — restartēt, ja pārsniegts
      max_memory_restart: '512M',

      // Vides mainīgie katram režīmam
      env: {
        NODE_ENV: 'development',
        PORT: 4321,
      },
      env_production: {
        NODE_ENV: 'production',
        PORT: 4321,
      },
    },
  ],
};

Palaid ar ekosistēmas failu:

# Izstrādes vide
pm2 start ecosystem.config.cjs

# Ražošanas vide
pm2 start ecosystem.config.cjs --env production

Citas komandas darbojas tāpat:

pm2 restart ecosystem.config.cjs --env production
pm2 reload ecosystem.config.cjs --env production   # nulles pārtraukuma
pm2 stop ecosystem.config.cjs
pm2 delete ecosystem.config.cjs

Klastera režīms

Klastera režīms palaiž vienu procesu katrā CPU serdenim un slodzes balanso ienākošos savienojumus starp tiem. Tas ir ātrākais veids, kā izmantot visus serdeņus daudzserdeņu VPS, nemainot lietotnes kodu.

// ecosystem.config.cjs
module.exports = {
  apps: [
    {
      name: 'mana-lietotne',
      script: 'server.js',
      instances: 'max',     // viens katrā CPU serdenim
      exec_mode: 'cluster', // nepieciešams slodzes balansošanai
      autorestart: true,
      env_production: {
        NODE_ENV: 'production',
        PORT: 3000,
      },
    },
  ],
};

Klastera režīmā izmanto pm2 reload, nevis pm2 restart, lai sasniegtu nulles pārtraukuma atjauninājumus — PM2 maina darbiniekus pa vienam.

Uzmanību: Klastera režīmam nepieciešama bezstāvokļa lietotne. Atmiņā saglabātas sesijas, WebSocket savienojumi un viss, kas saglabāts globālā mainīgajā, netiks koplietots starp darbiniekiem. Izmanto Redis vai datu bāzi koplietotam stāvoklim.


Žurnālu pārvaldība

Žurnālu skatīšana

pm2 logs                        # Straumēt visus žurnālus
pm2 logs mana-lietotne          # Straumēt vienas lietotnes žurnālus
pm2 logs mana-lietotne --lines 100  # Rādīt pēdējās 100 rindas

Žurnālu failu atrašanās vietas

Žurnāli tiek saglabāti ~/.pm2/logs/:

~/.pm2/logs/mana-lietotne-out.log   # stdout
~/.pm2/logs/mana-lietotne-error.log # stderr

Žurnālu tīrīšana

pm2 flush                    # Dzēst visus žurnālu failus
pm2 flush mana-lietotne      # Dzēst vienas lietotnes žurnālus

Žurnālu rotācija

Instalē PM2 žurnālu rotācijas moduli, lai novērstu žurnālu diska aizpildīšanu:

pm2 install pm2-logrotate

Konfigurē:

pm2 set pm2-logrotate:max_size 50M      # rotēt, kad fails pārsniedz 50 MB
pm2 set pm2-logrotate:retain 14         # saglabāt 14 rotētos failus
pm2 set pm2-logrotate:compress true     # gzip rotētos failus
pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-ss

Uzraudzība

Iebūvētais termināļa panelis

pm2 monit

Rāda CPU un atmiņas izmantojumu katram procesam reāllaikā.

Procesa metrikas

pm2 show mana-lietotne

Rāda darblaiku, restartēšanas skaitu, atmiņu, CPU, žurnālu ceļus un vairāk.

Tīmekļa panelis (PM2 Plus)

PM2 piedāvā mitinātu tīmekļa paneli app.pm2.io. Pieejams bezmaksas līmenis. Savienojies ar:

pm2 link <secret_key> <public_key>

Izvietošanas darbplūsma

Tipiska izvietošana pēc koda atjaunināšanas:

# 1. Iegūt jaunāko kodu serverī
git pull

# 2. Instalēt jaunas atkarības
npm install --omit=dev

# 3. Pārbūvēt (ja nepieciešams)
npm run build

# 4. Pārlādēt procesu (nulles pārtraukums klastera režīmā, īss restarts citādi)
pm2 reload mana-lietotne

# 5. Saglabāt procesu sarakstu, ja kaut kas mainījies
pm2 save

Novērošanas režīms (tikai izstrādei)

PM2 var vērot failus un automātiski restartēt procesu pie izmaiņām. Nekad neizmanto ražošanā — tas restartē pie katra faila izmaiņām un izraisa pārmērīgu CPU izmantojumu.

pm2 start app.js --name "dev-app" --watch
pm2 start app.js --name "dev-app" --watch --ignore-watch="node_modules logs"

Svarīgas piezīmes

  • Vienmēr palaid pm2 save pēc procesu pievienošanas vai maiņas, lai stāvoklis saglabātos pāri restartiem.
  • Klastera režīmā izmanto pm2 reload, nevis pm2 restart, lai sasniegtu nulles pārtraukuma atjauninājumus.
  • Izvairīties no --watch ražošanā — tas paredzēts tikai izstrādei.
  • Saglabā ecosystem.config.cjs versiju kontrolē, lai PM2 iestatīšana būtu reproducējama.
  • Izmanto pm2-logrotate jebkurā ilgtermiņa serverī, lai novērstu žurnālu diska aizpildīšanu.

Bieži uzdotie jautājumi

Kāda ir atšķirība starp pm2 restart un pm2 reload?

restart aptur procesu un palaiž jaunu — ir īss pārtraukuma moments. reload (tikai klastera režīmā) aizvieto darbiniekus pa vienam, kamēr pārējie turpina apstrādāt pieprasījumus, sasniedzot nulles pārtraukumu.

Mana lietotne netiek restartēta pēc servera restarta. Kas ir nepareizi?

Visticamāk tika izlaists viens no diviem soļiem: pm2 startup komandas palaišana (ieskaitot sudo env ... komandu, ko tā izvada) un pm2 save palaišana. Abi ir nepieciešami.

Kā palaist vairākas lietotnes vienā serverī?

Uzskaitīt tās visas ekosistēmas faila apps masīvā vai palaist katru atsevišķi ar unikālu --name. Katrai lietotnei piešķirt atšķirīgu portu un katrai domēnam izveidot atsevišķu Nginx servera bloku.

Kā droši iestatīt vides mainīgos?

Neglabāt noslēpumus ecosystem.config.cjs, ja tas ir versiju kontrolē. Tā vietā iestatīt tos .env failā serverī un ielādēt startā, vai eksportēt čaulā pirms PM2 palaišanas. Alternatīvi izmantot env_production bloku ekosistēmas failā tikai nejutīgai konfigurācijai.

Vai PM2 var pārvaldīt procesus, kas nav Node.js?

Jā — PM2 var pārvaldīt jebkuru izpildāmo failu. Izmanto interpreter: 'python3' vai interpreter: 'none' ekosistēmas failā. Tomēr PM2 tika izstrādāts Node.js vajadzībām un tā valodai specifiskās funkcijas (klastera režīms, --harmony karodziņi u.c.) attiecas tikai uz Node.js procesiem.

Kā pilnībā atinstalēt PM2?

pm2 delete all
pm2 unstartup
sudo npm uninstall -g pm2
rm -rf ~/.pm2