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) | NVM | System apt (universe) |
|---|
| — | — | — | — |
|---|
| Control versiuni | O singură versiune majoră fixată | Versiuni multiple per utilizator | De obicei LTS învechit |
|---|
| Instalare la nivel de sistem | Da | Nu (per utilizator implicit) | Da |
|---|
| Comutare versiuni | Necesită re-rularea scriptului de configurare | `nvm use <version>` | Nesuportat |
|---|
| Cel mai bun pentru | CI/CD, servere cu o singură versiune | Dezvoltare, multi-proiect | Doar testare rapidă |
|---|
| sudo necesar pentru globale npm | Da | Nu | Da |
|---|
| Potrivire pentru producție | Ridicată | Medie | Scă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 lucru | Mediu recomandat | Raț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ă.
