
- 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.
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 savepēc procesu pievienošanas vai maiņas, lai stāvoklis saglabātos pāri restartiem. - Klastera režīmā izmanto
pm2 reload, nevispm2 restart, lai sasniegtu nulles pārtraukuma atjauninājumus. - Izvairīties no
--watchražošanā — tas paredzēts tikai izstrādei. - Saglabā
ecosystem.config.cjsversiju kontrolē, lai PM2 iestatīšana būtu reproducējama. - Izmanto
pm2-logrotatejebkurā 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