- Vaša košarica je trenutno prazna
Node.js: opravila v ozadju, cron in upravitelj procesov PM2
Pošiljanje e-pošte, izdelava poročil, uvoz podatkov, Discord ali Telegram bot, ki ves čas posluša: skoraj vsaka aplikacija ima opravila, ki tečejo v ozadju, neodvisno od obiskovalcev spletne strani.
V tem prispevku boste izvedeli, kdaj zadošča običajna Node.js aplikacija, kdaj uporabiti cron in kdaj upravitelja procesov PM2. Vse smo preizkusili na paketih Zeleni in Turbo.
Kazalo
- Ali sploh potrebujete PM2?
- Izberite pravo rešitev
- Cron: opravila ob določenem času
- PM2: proces, ki teče ves čas
- Spletna aplikacija s PM2 (napredno)
- Na kaj morate paziti?
- Pogosta vprašanja
Ali sploh potrebujete PM2?
Pogosto ne. Aplikacija, ustvarjena v Setup Node.js App:
- se ob neaktivnosti ne zaustavi, temveč teče naprej,
- se po sesutju ob naslednjem obisku samodejno znova zažene,
- porabi manj sredstev kot PM2 (PM2 sam zaseda okoli 70 MB pomnilnika in 11 niti).
PM2 aplikacij iz Setup Node.js App ne pospeši in jih ne ohranja aktivnih, saj jih upravlja spletni strežnik.
Izberite pravo rešitev
| Potrebujete | Rešitev |
|---|---|
| Spletno stran ali API | Setup Node.js App |
| Opravilo ob določenem času (poročilo, čiščenje, uvoz) | cron |
| Opravilo, ki se sproži ob obisku in traja nekaj sekund | v aplikaciji, asinhrono |
| Proces, ki teče ves čas brez obiskov (bot, delavec, ki obdeluje vrsto nalog) | PM2 |
Cron: opravila ob določenem času
V cPanel odprite Cron Jobs in dodajte opravilo. Za zagon uporabite node iz virtualnega okolja aplikacije, tako ima skripta na voljo nameščene pakete in spremenljivke okolja aplikacije:
/home/uporabnik/nodevenv/mojaapi/22/bin/node /home/uporabnik/mojaapi/opravila/porocilo.js
V skladu s pogoji uporabe se cron opravilo lahko izvaja največ enkrat na 30 minut.
PM2: proces, ki teče ves čas
PM2 omogoča upravljanje procesov Node.js, ki morajo neprekinjeno teči v ozadju, tudi ko aplikacije nihče ne obiskuje. V nadaljevanju je opisan postopek namestitve in nastavitve.
1. korak: namestite PM2
Prek SSH ali aplikacije Terminal v cPanel:
export PATH=/opt/alt/alt-nodejs22/root/usr/bin:$PATH
mkdir -p ~/pm2 && cd ~/pm2
npm install pm2
Ukaz pm2 se ne doda med sistemske ukaze, zato ga v nadaljevanju kličete s polno potjo ~/pm2/node_modules/.bin/pm2.
2. korak: zaženite proces
export PATH=/opt/alt/alt-nodejs22/root/usr/bin:$PATH
export PM2_HOME=~/pm2/.pm2
~/pm2/node_modules/.bin/pm2 start ~/mojbot/bot.js --name mojbot --cwd ~/mojbot
~/pm2/node_modules/.bin/pm2 save
Pakete za ~/mojbot namestite z istim export PATH=... in npm install v mapi ~/mojbot.
Uporabni ukazi (z enakima vrsticama export kot zgoraj):
~/pm2/node_modules/.bin/pm2 list # seznam procesov
~/pm2/node_modules/.bin/pm2 logs mojbot # dnevnik
~/pm2/node_modules/.bin/pm2 restart mojbot
~/pm2/node_modules/.bin/pm2 delete mojbot
Procesi, zagnani s PM2, tečejo naprej tudi, ko zaprete SSH.
3. korak: samodejni zagon po ponovnem zagonu strežnika
Ob vzdrževanju strežnika se procesi zaustavijo. Da jih PM2 znova zažene, pripravite skripto ~/pm2/zagon.sh:
#!/bin/bash
export PATH=/opt/alt/alt-nodejs22/root/usr/bin:$PATH
export PM2_HOME=$HOME/pm2/.pm2
PM2=$HOME/pm2/node_modules/.bin/pm2
# če ne teče noben proces, obnovi shranjeno stanje (pm2 save)
$PM2 jlist | grep -q '"status":"online"' || $PM2 resurrect
in dodajte dve cron opravili:
@reboot /bin/bash $HOME/pm2/zagon.sh >/dev/null 2>&1
*/30 * * * * /bin/bash $HOME/pm2/zagon.sh >/dev/null 2>&1
Prvo opravilo procese zažene ob zagonu strežnika, drugo pa vsakih 30 minut preveri, ali tečejo. Ob vsaki spremembi procesov ne pozabite na pm2 save. Skripto ustvarite v urejevalniku datotek v cPanel ali jo naložite kot datoteko.
Opomba: preverjanje z ukazom ps ... | grep node, ki ga boste našli na spletu, na našem gostovanju ni zanesljivo, saj ujame tudi aplikacije iz Setup Node.js App. Namesto tega za preverjanje delovanja procesa uporabite zgornjo skripto.
Spletna aplikacija s PM2 (napredno)
Če aplikacijo s PM2 poganjate kot spletni strežnik (npr. ker potrebujete več kot 12 hkratnih dolgih zahtevkov), mora poslušati na naslovu 127.0.0.1 in na vratih, dodeljenih vašemu računu:
echo $((20000 + $(id -u)))
Uporabljajte samo ta vrata in vedno naslov 127.0.0.1, nikoli 0.0.0.0:
app.listen(Number(process.env.PORT), '127.0.0.1');
PORT=$((20000 + $(id -u))) ~/pm2/node_modules/.bin/pm2 start ~/mojaapp/server.js --name mojaapp --cwd ~/mojaapp
~/pm2/node_modules/.bin/pm2 save
Zahtevke z domene na proces preusmerite z datoteko .htaccess v mapi, na kateri bo aplikacija dostopna (npr. public_html/app/ ali koren poddomene). Zamenjajte vrata s svojimi:
RewriteEngine On
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteRule ^(.*)$ ws://127.0.0.1:21073/$1 [P,L]
RewriteRule ^(.*)$ http://127.0.0.1:21073/$1 [P,L]
Prvo pravilo je obvezno za WebSocket. Če proces ne teče, obiskovalci dobijo napako 503.
Na kaj morate paziti?
Pri izvajanju opravil v ozadju upoštevajte naslednja priporočila:
- Proces, ki teče neprekinjeno, ves čas porablja pomnilnik vašega paketa gostovanja (pri paketu Zeleni je na voljo 1 GB) in šteje v omejitev procesov in niti (100 pri paketu Zeleni). Za stalno delujoče procese priporočamo Turbo gostovanje z več pomnilnika in procesorskih jeder.
- Delavec naj ne obremenjuje procesorja v zanki. Med preverjanji naj čaka (
setTimeout,setInterval), naloge pa naj obdela, ko se pojavijo. - V skladu s pogoji uporabe spletno gostovanje ni namenjeno aplikacijam z neprekinjeno porabo sistemskih sredstev (obdelava in zbiranje podatkov, analitika). Za take aplikacije priporočamo VPS strežnik.
Pogosta vprašanja
Spoznajte odgovore na nekaj pogostih vprašanj o uporabi crona in PM2.
Ali lahko uporabim BullMQ ali drugo vrsto nalog z Redisom?
Za to potrebujete strežnik Redis, ki ga spletno gostovanje ne ponuja. Za manjše aplikacije je preprostejša rešitev vrsta nalog v bazi MySQL in cron. Za večje sisteme priporočamo VPS gostovanje.
Ali se proces, zagnan z nohup node ... &, zaustavi, ko zaprem SSH?
Ne, proces teče naprej. Vendar ga ob napaki ali ponovnem zagonu strežnika nihče ne zažene znova, zato priporočamo PM2.
Kako vem, da cron deluje?
Preusmerite izpis v datoteko (>> ~/cron.log 2>&1) ali v cPanel → Cron Jobs vpišite e-poštni naslov, na katerega dobite izpis vsakega izvajanja.
Če potrebujete pomoč pri nastavitvi opravil v ozadju, smo vam na voljo.
KOMENTIRAJTE OBJAVO
Vaš komentar je bil uspešno oddan
Komentar bo viden na strani, ko ga naši moderatorji potrdijo.