PM2 — process boshqarish, cluster mode, monitoring

~20 daq · Node.js · Amaliy

Muammodan boshlaylik

Siz serveringizni ishga tushirdingiz:

node app.js

Ishlaydi. Lekin:

  • Terminal yopilsa — server to'xtaydi
  • Server crash bo'lsa — qayta ishga tushmaydi
  • Kompyuter qayta yoqilsa — server o'zi ishga tushmaydi
  • 8 yadroli serverda faqat 1 ta yadroni ishlatayapsiz

Bularning hammasi production da jiddiy muammo. PM2 shu muammolarni hal qiladi.


PM2 nima?

PM2 — Node.js jarayonlarini boshqaruvchi dastur. Xuddi operatsion tizimning service menejeri kabi — jarayonlarni ishga tushiradi, kuzatadi, crash bo'lsa qayta tiklaydi.

Hayotiy o'xshatma: siz restoran egasisiz. Oshpaz (Node.js jarayoni) ishga keldi. Lekin oshpaz kasal bo'lib qolsa — restoran yopilmasligi kerak. PM2 — bu menejer. Oshpaz ketsa, darhol o'rniga yangisini topadi.


O'rnatish

npm install -g pm2

Global o'rnatiladi — bir marta, hamma loyihalarda ishlatiladi.


Asosiy buyruqlar

# Ishga tushirish:
pm2 start app.js

# Ro'yxat ko'rish:
pm2 list

# Log ko'rish:
pm2 logs

# To'xtatish:
pm2 stop app.js

# Qayta ishga tushirish:
pm2 restart app.js

# O'chirish (ro'yxatdan):
pm2 delete app.js

pm2 list natijasi:

┌─────┬──────────┬─────────┬──────┬───────────┬──────────┬──────────┐
│ id  │ name     │ mode    │ ↺    │ status    │ cpu      │ memory   │
├─────┼──────────┼─────────┼──────┼───────────┼──────────┼──────────┤
│ 0   │ app      │ fork    │ 0    │ online    │ 0%       │ 45.2mb   │
└─────┴──────────┴─────────┴──────┴───────────┴──────────┴──────────┘

Avtomatik qayta tiklash

PM2 ning asosiy kuchi — jarayon crash bo'lsa, avtomatik qayta ishga tushiradi.

pm2 start app.js

Endi app.js ichida throw new Error() bo'lsa — PM2 darhol qayta ishga tushiradi. pm2 list da ↺ ustuni necha marta qayta tiklangani ko'rsatadi.


Cluster mode — ko'p yadroli server

22-darsda cluster modulini o'rgandik — ko'p jarayon yaratish uchun. PM2 buni bir buyruq bilan qiladi:

pm2 start app.js -i max

-i max — CPU core soni qadar jarayon yaratadi. 8 yadroli server → 8 ta jarayon.

pm2 start app.js -i 4   # aniq 4 ta jarayon
pm2 start app.js -i max # core soni qadar
pm2 start app.js -i 0   # max bilan bir xil

pm2 list natijasi:

┌─────┬──────────┬─────────┬──────┬───────────┬──────────┬──────────┐
│ id  │ name     │ mode    │ ↺    │ status    │ cpu      │ memory   │
├─────┼──────────┼─────────┼──────┼───────────┼──────────┼──────────┤
│ 0   │ app      │ cluster │ 0    │ online    │ 0%       │ 45.2mb   │
│ 1   │ app      │ cluster │ 0    │ online    │ 0%       │ 44.8mb   │
│ 2   │ app      │ cluster │ 0    │ online    │ 0%       │ 45.1mb   │
│ 3   │ app      │ cluster │ 0    │ online    │ 0%       │ 44.9mb   │
└─────┴──────────┴─────────┴──────┴───────────┴──────────┴──────────┘

4 ta jarayon, hammasi bir portda — PM2 so'rovlarni taqsimlaydi.


ecosystem.config.js — sozlamalar fayli

Buyruq qatori o'rniga sozlamalarni faylda saqlash — yaxshi amaliyot:

// ecosystem.config.js
module.exports = {
  apps: [
    {
      name:         'my-api',
      script:       './src/main.js',
      instances:    'max',          // cluster mode
      exec_mode:    'cluster',
      watch:        false,          // fayl o'zgarganda qayta ishga tushirma
      max_memory_restart: '500M',   // 500 MB dan oshsa qayta tiklash
      env: {
        NODE_ENV: 'development',
        PORT:     3000,
      },
      env_production: {
        NODE_ENV: 'production',
        PORT:     8080,
      },
      error_file: './logs/error.log',
      out_file:   './logs/out.log',
      log_date_format: 'YYYY-MM-DD HH:mm:ss',
    },
  ],
};

Ishga tushirish:

pm2 start ecosystem.config.js
pm2 start ecosystem.config.js --env production  # production sozlamalari bilan

Tizim ishga tushganda avtomatik start

Server qayta yoqilganda PM2 va jarayonlar avtomatik ishga tushishi uchun:

# Tizim uchun startup skript yaratish:
pm2 startup

# Bu buyruq biror narsa chiqaradi, masalan:
# sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u user --hp /home/user
# O'sha buyruqni nusxalab ishga tushiring

# Hozirgi holatni saqlash:
pm2 save

Endi server qayta yoqilsa — PM2 va barcha jarayonlar avtomatik ishga tushadi.


Monitoring

pm2 monit

Real vaqtda CPU, xotira, log — barchasi bir ekranda:

┌─ Process List ──────────────────────────────────────────────────────────────┐
│ App name  │ id │ mode    │ pid   │ status │ ↺ │ cpu │ mem     │ user  │     │
│ my-api    │ 0  │ cluster │ 12345 │ online │ 0 │ 2%  │ 45.2 MB │ user  │     │
│ my-api    │ 1  │ cluster │ 12346 │ online │ 0 │ 1%  │ 44.8 MB │ user  │     │
└─────────────────────────────────────────────────────────────────────────────┘
┌─ my-api Logs ───────────────────────────────────────────────────────────────┐
│ [2026-05-07 10:00:01] GET /api/users 200 12ms                               │
│ [2026-05-07 10:00:02] POST /api/orders 201 45ms                             │
└─────────────────────────────────────────────────────────────────────────────┘

Zero-downtime reload

Cluster mode da kod yangilanishini server to'xtatmasdan qilish mumkin:

pm2 reload my-api

restart — barcha jarayonlarni bir vaqtda to'xtatib, qayta ishga tushiradi. Bir necha soniya server ishlamaydi.

reload — jarayonlarni birin-ketin yangilaydi. Biri yangilanayotganda qolganlar ishlaydi. Server hech qachon to'xtamaydi.

Production da har doim reload ishlatiladi.


Tez-tez uchraydigan xatolar

Cluster mode da session saqlash:

// Xato — har jarayon alohida xotira:
const sessions = new Map(); // jarayon 1 da saqlangan session
                             // jarayon 2 ko'rmaydi!

// To'g'ri — Redis da saqlash:
// connect-redis yoki ioredis bilan

watch: true production da:

// Xato — production da fayllar o'zgarsa qayta ishga tushadi:
{ watch: true }

// To'g'ri — production da o'chirish:
{ watch: false }
// Yangilash uchun: pm2 reload

Log fayllarini tozalamaslik:

# Log fayllari to'lib ketishi mumkin
pm2 flush          # loglarni tozalash
pm2 install pm2-logrotate  # avtomatik aylantirish

Xulosa

PM2 — production da Node.js jarayonlarini boshqarish uchun standart vosita. Crash bo'lsa qayta tiklaydi, cluster mode bilan ko'p yadroli serverdan foydalanadi, tizim ishga tushganda avtomatik start qiladi.

Buyruq Nima qiladi
pm2 start app.js Ishga tushirish
pm2 start app.js -i max Cluster mode
pm2 list Jarayonlar ro'yxati
pm2 logs Loglar
pm2 monit Real vaqt monitoring
pm2 reload Zero-downtime yangilash
pm2 startup && pm2 save Tizim ishga tushganda avtomatik start

Node.js kursi tugadi 🎉

Siz Node.js ning asosiy tushunchalarini o'rgandingiz:

  • Event Loop va asinxron dasturlash
  • Core modullar: path, os, fs, crypto, EventEmitter
  • Stream va Buffer
  • Process boshqarish: process, child_process, worker_threads, cluster
  • Amaliy: Memory Leak va PM2

Keyingi qadam — Express.js yoki NestJS bilan real API yozish.