15%

Economisește 15% la toate serviciile de găzduire

Testează-ți abilitățile și obține Reducere la orice plan de găzduire

Utilizați codul:

Skills
Începeți
09.10.2024

Cum să Instalezi Node.js și PM2 pe Ubuntu: Un Ghid Complet pentru Producție

Node.js este un runtime JavaScript asincron, bazat pe evenimente, construit pe motorul V8 al Chrome, conceput pentru a executa cod JavaScript pe server la un debit ridicat. PM2 este un manager de procese de nivel producție pentru aplicații Node.js, care oferă daemonizare, recuperare automată după căderi, agregare de jurnale, echilibrare de sarcină în modul cluster și generare de scripturi de pornire — toate dintr-o singură interfață CLI.

Acest ghid acoperă fiecare metodă de instalare, opțiune de configurare și model operațional de care aveți nevoie pentru a rula aplicații Node.js în mod fiabil pe Ubuntu 20.04, 22.04 sau 24.04 LTS într-un mediu de producție.

Cerințe preliminare

Înainte de a continua, confirmați următoarele:

  • Sistem de operare: Ubuntu 20.04, 22.04 sau 24.04 LTS (server sau desktop)
  • Privilegii utilizator: `sudo` sau acces root
  • Acces la rețea: HTTPS de ieșire pentru descărcarea pachetelor și scripturilor
  • curl instalat: Rulați `sudo apt install curl -y` dacă nu este deja prezent

Dacă rulați acest lucru pe un server cloud, un mediu de VPS Hosting este cea mai comună țintă de implementare pentru sarcinile de lucru Node.js, iar tot ce se află în acest ghid se aplică direct.

Pasul 1: Actualizați pachetele de sistem

Sincronizați întotdeauna indexul de pachete și aplicați actualizările în așteptare înainte de a instala software nou. Metadatele de pachete învechite sunt o sursă frecventă de conflicte de dependențe.

“`bash

sudo apt update

sudo apt upgrade -y

“`

După finalizarea actualizării, reporniți dacă kernel-ul a fost actualizat:

“`bash

sudo reboot

“`

Pasul 2: Instalați Node.js — Alegerea metodei potrivite

Există trei metode principale de instalare pentru Node.js pe Ubuntu. Fiecare are compromisuri distincte în ceea ce privește controlul versiunilor, izolarea și disponibilitatea la nivel de sistem.

Comparație metode

CaracteristicăNodeSource (apt)NVMSystem apt (universe)
Control versiuniO singură versiune majoră fixatăVersiuni multiple per utilizatorDe obicei LTS învechit
Instalare la nivel de sistemDaNu (per utilizator implicit)Da
Comutare versiuniNecesită re-rularea scriptului de configurare`nvm use <version>`Nesuportat
Cel mai bun pentruCI/CD, servere cu o singură versiuneDezvoltare, multi-proiectDoar testare rapidă
sudo necesar pentru globale npmDaNuDa
Potrivire pentru producțieRidicatăMedieScăzută

Metoda 1: Instalați Node.js prin NodeSource (Recomandat pentru servere)

NodeSource menține depozite Debian/Ubuntu actualizate pentru fiecare linie de lansare activă Node.js. Aceasta este abordarea preferată pentru serverele de producție unde este necesară o singură versiune stabilă la nivel de sistem.

Adăugați depozitul NodeSource pentru versiunea LTS curentă:

“`bash

curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash –

“`

Acest script efectuează mai multe acțiuni: detectează versiunea dvs. de Ubuntu, adaugă depozitul apt NodeSource corespunzător, importă cheia de semnare GPG și rulează `apt-get update`. Indicatorul `-E` păstrează variabilele de mediu la escaladarea la sudo, ceea ce contează dacă aveți setări proxy configurate.

Instalați Node.js și npm:

“`bash

sudo apt install nodejs -y

“`

Pachetul NodeSource include atât `node` cât și `npm` într-un singur pachet `nodejs`. Spre deosebire de pachetul Ubuntu universe, nu le separă.

Verificați instalarea:

“`bash

node -v

npm -v

“`

Exemplu de ieșire așteptată:

“`

v20.14.0

10.7.0

“`

Fixarea la o versiune majoră specifică: Dacă aveți nevoie de Node.js 18 în loc de LTS-ul curent, înlocuiți `setup_lts.x` cu `setup_18.x` în comanda curl. Fluxurile disponibile includ `setup_18.x`, `setup_20.x` și `setup_22.x`.

Metoda 2: Instalați Node.js prin NVM (Recomandat pentru dezvoltare și medii cu versiuni multiple)

NVM (Node Version Manager) instalează Node.js în directorul dvs. home, fără a necesita privilegii root nici pentru Node.js în sine, nici pentru pachetele npm instalate global. Aceasta elimină problemele de permisiuni care apar frecvent la rularea `npm install -g` pe Node.js instalat la nivel de sistem.

Instalați NVM:

“`bash

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

“`

Verificați depozitul oficial NVM pentru cel mai recent tag de lansare înainte de a rula această comandă — numărul versiunii din URL se schimbă cu fiecare lansare.

Reîncărcați mediul shell:

“`bash

source ~/.bashrc

“`

Dacă utilizați Zsh, folosiți sursa `~/.zshrc` în schimb. Programul de instalare NVM adaugă blocul său de inițializare la fișierul de configurare shell pe care îl detectează.

Instalați cea mai recentă versiune LTS a Node.js:

“`bash

nvm install –lts

“`

Instalați o versiune specifică alături de LTS:

“`bash

nvm install 18

nvm install 20

“`

Comutați între versiunile instalate:

“`bash

nvm use 20

nvm alias default 20

“`

Comanda `alias default` setează versiunea care se activează în sesiunile shell noi, ceea ce este esențial pentru scripturile și sarcinile cron care nu folosesc profilul shell interactiv.

Verificați:

“`bash

node -v

npm -v

“`

Capcană critică NVM pentru producție: Deoarece NVM este limitat la utilizator, scripturile de pornire PM2 și unitățile systemd nu vor avea acces la binarul Node.js gestionat de NVM dacă nu configurați explicit calea. Consultați Pasul 5 pentru a gestiona corect acest lucru.

Pasul 3: Instalați PM2

PM2 este distribuit ca pachet npm și ar trebui instalat global astfel încât CLI-ul său să fie disponibil la nivel de sistem.

Instalați PM2:

“`bash

sudo npm install -g pm2

“`

Dacă ați instalat Node.js prin NVM, omiteți `sudo`:

“`bash

npm install -g pm2

“`

Verificați instalarea:

“`bash

pm2 -v

“`

Instalați o versiune specifică PM2 (utilă la fixarea infrastructurii):

“`bash

sudo npm install -g pm2@5.3.1

“`

PM2 versiunea 5.x este linia stabilă curentă. A introdus îmbunătățiri semnificative la tabloul de bord web (pm2 plus), rotația jurnalelor și sistemul de module față de v4.

Pasul 4: Gestionarea aplicațiilor Node.js cu PM2

Pornirea unei aplicații

Navigați la directorul aplicației dvs. și porniți-o:

“`bash

cd /var/www/my-app

pm2 start app.js –name "my-app"

“`

Atribuiți întotdeauna un indicator `–name`. Fără acesta, PM2 folosește numele fișierului ca nume de proces, ceea ce devine ambiguu când aveți mai multe servicii.

Pornire cu opțiuni suplimentare:

“`bash

pm2 start app.js –name "my-app" –watch –max-memory-restart 300M

“`

  • `–watch`: Repornește procesul când fișierele sursă se modifică (util în staging, nu recomandat în producție)
  • `–max-memory-restart 300M`: Repornește automat procesul dacă depășește 300 MB de memorie RSS — o măsură de protecție critică împotriva scurgerilor de memorie

Vizualizarea proceselor în execuție

“`bash

pm2 list

“`

Aceasta afișează un tabel cu ID-ul procesului, numele, modul (fork/cluster), PID, starea, utilizarea CPU, consumul de memorie și numărul de reporniri.

Pentru un tablou de bord în timp real:

“`bash

pm2 monit

“`

Controlul proceselor

“`bash

pm2 restart my-app # Graceful restart

pm2 reload my-app # Zero-downtime reload (cluster mode only)

pm2 stop my-app # Stop without removing from process list

pm2 delete my-app # Stop and remove from process list

“`

Diferența dintre `restart` și `reload`: `restart` oprește procesul și pornește unul nou, cauzând o scurtă întrerupere. `reload` (disponibil doar în modul cluster) ciclează lucrătorii unul câte unul, menținând disponibilitatea pe tot parcursul. Utilizați întotdeauna `reload` în implementările cluster de producție.

Gestionarea jurnalelor

“`bash

pm2 logs # Stream logs from all processes

pm2 logs my-app # Stream logs for a specific process

pm2 logs my-app –lines 200 # Show last 200 lines

pm2 flush # Clear all log files

“`

PM2 stochează jurnalele implicit la `~/.pm2/logs/`. Pentru serverele de producție, instalați modulul de rotație a jurnalelor pentru a preveni epuizarea discului:

“`bash

pm2 install pm2-logrotate

pm2 set pm2-logrotate:max_size 50M

pm2 set pm2-logrotate:retain 10

pm2 set pm2-logrotate:compress true

“`

Aceasta rotește jurnalele când ating 50 MB, păstrează 10 arhive comprimate și previne creșterea necontrolată a jurnalelor — o problemă comună pe serverele cu funcționare îndelungată care este frecvent trecută cu vederea până când spațiul pe disc se epuizează.

Pasul 5: Configurați PM2 să pornească la boot-ul sistemului

PM2 trebuie configurat să supraviețuiască repornirilor serverului. Aceasta se realizează printr-o unitate de serviciu systemd generată de PM2 însuși.

Generați comanda de pornire:

“`bash

pm2 startup

“`

PM2 va afișa o comandă adaptată sistemului dvs. de inițializare și utilizatorului curent. Arată astfel:

“`

[PM2] Init System found: systemd

[PM2] To setup the Startup Script, copy/paste the following command:

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

“`

Copiați și executați exact acea comandă. Nu o modificați — calea către binarul PM2 și directorul home trebuie să corespundă configurației sistemului dvs.

Configurare pornire specifică NVM: Dacă ați instalat Node.js prin NVM, calea din comanda generată va indica binarul gestionat de NVM. Aceasta este corectă, dar trebuie să vă asigurați că versiunea NVM este setată ca implicită înainte de a rula `pm2 startup`:

“`bash

nvm alias default 20

pm2 startup

“`

Salvați lista curentă de procese:

“`bash

pm2 save

“`

Aceasta scrie lista de procese în `~/.pm2/dump.pm2`. La repornire, unitatea systemd citește acest fișier și restaurează toate procesele salvate. Dacă adăugați sau eliminați aplicații ulterior, rulați din nou `pm2 save` pentru a actualiza instantaneul.

Verificați că unitatea systemd este activă:

“`bash

systemctl status pm2-ubuntu

“`

Înlocuiți `ubuntu` cu numele dvs. de utilizator real.

Pasul 6: Implementare în producție cu fișiere Ecosystem PM2

Pentru orice aplicație mai complexă decât un script simplu, utilizați fișierul de configurare ecosystem al PM2. Acesta oferă definiții de procese reproductibile, controlate prin versiuni, și elimină necesitatea de a memora indicatori CLI lungi.

Generarea fișierului Ecosystem

“`bash

pm2 ecosystem

“`

Aceasta creează `ecosystem.config.js` în directorul curent.

O configurație Ecosystem pregătită pentru producție

“`javascript

module.exports = {

apps: [

{

name: 'api-server',

script: './src/server.js',

instances: 'max',

exec_mode: 'cluster',

watch: false,

max_memory_restart: '500M',

log_date_format: 'YYYY-MM-DD HH:mm:ss Z',

error_file: '/var/log/pm2/api-server-error.log',

out_file: '/var/log/pm2/api-server-out.log',

merge_logs: true,

env: {

NODE_ENV: 'development',

PORT: 3000

},

env_production: {

NODE_ENV: 'production',

PORT: 8080

}

},

{

name: 'worker',

script: './src/worker.js',

instances: 2,

exec_mode: 'fork',

cron_restart: '0 2 * * *',

env_production: {

NODE_ENV: 'production'

}

}

]

};

“`

Decizii cheie de configurare explicate:

  • `instances: 'max'`: PM2 generează automat câte un lucrător per nucleu CPU logic. Pe un server cu 4 nuclee, aceasta creează 4 procese Node.js, utilizând complet hardware-ul.
  • `exec_mode: 'cluster'`: Folosește modulul cluster nativ al Node.js. Toate instanțele partajează același port prin echilibrarea de sarcină a socket-ului sistemului de operare.
  • `exec_mode: 'fork'`: Rulează procesul ca un proces copil independent. Necesar pentru aplicații care nu sunt servere HTTP (lucrători de coadă, sarcini programate, servere WebSocket cu sesiuni sticky).
  • `merge_logs: true`: Combină stdout din toate instanțele cluster într-un singur fișier jurnal, facilitând semnificativ analiza jurnalelor.
  • `cron_restart`: Programează reporniri automate folosind sintaxa cron. Util pentru lucrătorii care acumulează stare sau pentru aplicarea modificărilor de configurare nocturne.

Pornire cu fișierul Ecosystem

“`bash

pm2 start ecosystem.config.js –env production

pm2 save

“`

Flux de lucru pentru implementare fără întreruperi

La implementarea unei noi versiuni a aplicației dvs.:

“`bash

git pull origin main

npm install –production

pm2 reload ecosystem.config.js –env production

“`

`pm2 reload` trimite un `SIGINT` fiecărui lucrător pe rând, așteaptă ca noul lucrător să devină pregătit, apoi îl termină pe cel vechi. Aplicația dvs. trebuie să gestioneze `SIGINT` în mod grațios și să semnaleze disponibilitatea folosind `process.send('ready')` pentru ca aceasta să funcționeze corect.

Handler de oprire grațioasă în aplicația dvs.:

“`javascript

process.on('SIGINT', () => {

server.close(() => {

console.log('HTTP server closed');

process.exit(0);

});

});

“`

Pasul 7: Monitorizare și observabilitate PM2

Monitorizare încorporată

“`bash

pm2 monit

“`

Afișează grafice CPU și memorie în timp real pentru fiecare proces în terminal.

Informații despre procese

“`bash

pm2 show my-app

“`

Afișează metadate detaliate: timp de funcționare, număr de reporniri, versionare, cale interpret, variabile de mediu și locații ale fișierelor jurnal.

Tablou de bord web PM2 (PM2 Plus)

PM2 oferă un tablou de bord de monitorizare găzduit la pm2.io. Conectați serverul dvs.:

“`bash

pm2 link <secret_key> <public_key>

“`

Aceasta oferă metrici istorice, alertare și gestionare remotă a proceselor — deosebit de valoroasă la gestionarea mai multor servere sau când aveți nevoie de vizibilitate fără acces SSH.

Pasul 8: Actualizarea Node.js și PM2

Actualizarea PM2

“`bash

sudo npm install -g pm2@latest

pm2 update

“`

`pm2 update` este esențial după actualizarea binarului PM2 — actualizează daemonul PM2 din memorie fără a întrerupe procesele în execuție.

Actualizarea Node.js prin NodeSource

Re-rulați scriptul de configurare pentru noua versiune majoră:

“`bash

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash –

sudo apt install nodejs -y

“`

După actualizarea Node.js, reporniți PM2 pentru a vă asigura că folosește noul binar:

“`bash

pm2 restart all

“`

Actualizarea Node.js prin NVM

“`bash

nvm install 22

nvm alias default 22

nvm use 22

pm2 restart all

“`

Dacă ați schimbat versiunea implicită NVM, regenerați scriptul de pornire PM2 pentru a actualiza calea binarului în unitatea systemd:

“`bash

pm2 unstartup

pm2 startup

pm2 save

“`

Considerații de securizare

Rularea aplicațiilor Node.js în producție necesită atenție dincolo de gestionarea proceselor:

  • Rulați ca utilizator non-root: Nu rulați niciodată PM2 sau Node.js ca root. Creați un utilizator de sistem dedicat (`adduser –system –group nodeapp`) și rulați PM2 sub acel cont.
  • Gestionarea variabilelor de mediu: Nu codificați hard secretele în `ecosystem.config.js`. Utilizați un fișier `.env` încărcat prin `dotenv`, sau injectați secretele prin pipeline-ul dvs. de implementare. Fișierul ecosystem este de obicei comis în controlul versiunilor.
  • Proxy invers: Plasați Nginx sau Caddy în fața aplicației dvs. Node.js. Aceasta gestionează terminarea TLS, servirea fișierelor statice, limitarea ratei și bufferizarea cererilor. Combinați aceasta cu o soluție de Certificate SSL pentru a impune HTTPS.
  • Reguli firewall: Blocați accesul direct la portul dvs. Node.js (ex., 3000, 8080) de pe internetul public. Doar proxy-ul invers ar trebui să comunice cu Node.js.
  • Limite de resurse: Setați `max_memory_restart` în PM2 și configurați valorile `ulimit` la nivel de sistem pentru a preveni ca un singur proces scăpat de sub control să destabilizeze serverul.

Pentru implementările de producție cu trafic ridicat unde izolarea resurselor este critică, un mediu de Servere Dedicate oferă control complet al hardware-ului și elimină problema vecinului zgomotos inerentă infrastructurii partajate.

Alegerea mediului de hosting potrivit pentru Node.js

Sarcină de lucruMediu recomandatRațiune
Proiecte personale, staging[VPS Hosting](https://alexhost.com/ro/vps/)Rentabil, acces root complet, scalabil
API-uri cu trafic ridicat[Dedicated Servers](https://alexhost.com/ro/dedicated-servers/)Performanță previzibilă, fără contention de resurse
Inferență ML + Node.js[GPU Hosting](https://alexhost.com/ro/gpu-hosting/)Descărcați sarcinile intensive de calcul către lucrătorii GPU
Panou de control gestionat[VPS with cPanel](https://alexhost.com/ro/vps/control-panels/cpanel-vps/)Gestionare procese și fișiere bazată pe GUI

Listă de verificare pentru decizii tehnice

Utilizați această listă de verificare înainte de a implementa Node.js și PM2 în producție:

  • [ ] Node.js instalat prin NodeSource (server) sau NVM (dezvoltare) — nu pachetul Ubuntu universe
  • [ ] PM2 instalat global cu permisiunile corecte pentru metoda dvs. de instalare
  • [ ] Aplicație pornită cu indicatorul `–name` și un prag `–max-memory-restart` definit
  • [ ] Modul cluster activat pentru serverele HTTP; modul fork utilizat pentru lucrătorii de fundal
  • [ ] `pm2 startup` executat și comanda generată rulată cu sudo
  • [ ] `pm2 save` rulat după configurarea tuturor proceselor
  • [ ] Modulul de rotație a jurnalelor instalat și configurat
  • [ ] Nginx sau Caddy configurat ca proxy invers cu TLS
  • [ ] Aplicația gestionează `SIGINT` în mod grațios pentru reîncărcări fără întreruperi
  • [ ] Secretele gestionate în afara `ecosystem.config.js`
  • [ ] Unitatea systemd PM2 verificată cu `systemctl status pm2-<username>`
  • [ ] Firewall-ul blochează accesul direct la porturile Node.js de pe internetul public

Întrebări frecvente

Care este diferența dintre modul fork și modul cluster în PM2?

Modul fork generează aplicația ca un singur proces copil — o instanță, un nucleu CPU utilizat. Modul cluster folosește modulul cluster nativ al Node.js pentru a genera mai multe procese lucrător care partajează același port TCP, permițând utilizarea adevărată a mai multor nuclee și reîncărcări fără întreruperi. Utilizați modul cluster pentru serverele HTTP/HTTPS și modul fork pentru lucrători, sarcini cron sau aplicații care mențin stare internă incompatibilă cu partajarea multi-proces.

De ce PM2 nu repornește după o repornire a serverului chiar dacă am rulat `pm2 startup`?

Cea mai frecventă cauză este că `pm2 save` nu a fost rulat după configurarea proceselor, deci fișierul dump este gol sau lipsește. A doua cauză cea mai frecventă este o nepotrivire a căii NVM: dacă versiunea implicită NVM a fost schimbată după generarea scriptului de pornire, unitatea systemd indică un binar inexistent. Rezolvați aceasta rulând `pm2 unstartup`, setând valoarea implicită NVM corectă, apoi re-rulând `pm2 startup` și `pm2 save`.

Poate PM2 gestiona procese non-Node.js?

Da. PM2 poate gestiona orice executabil specificând interpretorul. De exemplu: `pm2 start script.py –interpreter python3`. Aceasta face PM2 util ca supervizor de procese de uz general pentru arhitecturi de microservicii cu limbaje mixte.

Cum rulez mai multe aplicații Node.js pe porturi diferite în spatele unui singur server?

Definiți fiecare aplicație ca o intrare separată în `ecosystem.config.js` cu variabile de mediu `PORT` distincte. Configurați Nginx ca proxy invers cu blocuri `server` separate sau directive `location` care rutează către fiecare port. Toate aplicațiile partajează același daemon PM2 și sunt gestionate printr-o singură vizualizare `pm2 list`.

Ar trebui să folosesc NVM sau NodeSource pentru un VPS de producție?

NodeSource este în general preferabil pentru serverele de producție. Instalează Node.js ca pachet de sistem, făcându-l disponibil tuturor utilizatorilor și serviciilor de sistem fără dependențe de inițializare shell. Modelul de activare per utilizator, per shell al NVM introduce moduri subtile de eșec în unitățile systemd, sarcinile cron și pipeline-urile CI/CD care rulează în afara unei sesiuni shell interactive. Rezervați NVM pentru mașinile de dezvoltare locale unde gestionarea simultană a mai multor versiuni Node.js este o cerință reală.

15%

Economisește 15% la toate serviciile de găzduire

Testează-ți abilitățile și obține Reducere la orice plan de găzduire

Utilizați codul:

Skills
Începeți