Node.js ilovani serverda node server.js bilan ishga tushirish sinov uchun yetarli, lekin real loyihada bu yo'l tez orada muammoga olib keladi. Kod ichidagi kutilmagan xato butun jarayonni to'xtatadi, SSH ulanish uzilganda ilova ham o'chadi, server qayta yuklanganda esa uni kimdir qo'lda qayta ishga tushirishi kerak bo'ladi. PM2 aynan shu vazifalarni o'z zimmasiga oladigan jarayon menejeri. U ilovani fonda ushlaydi, yiqilsa darhol qayta ko'taradi va barcha chiqishni log fayllarga yozib boradi.
PM2 o'rnatish va birinchi ishga tushirish
PM2 npm orqali global paket sifatida o'rnatiladi. Buning uchun serverda Node.js allaqachon o'rnatilgan bo'lishi kerak. O'rnatgandan keyin ilovani bitta buyruq bilan ishga tushirish va unga tushunarli nom berish mumkin, shunda keyinchalik uni nomi orqali boshqarasiz.
npm install -g pm2
cd /var/www/misol-app
pm2 start server.js --name misol-app
pm2 list
pm2 list jadvali har bir jarayonning holati, necha marta qayta ishga tushgani, ishlatayotgan protsessor va xotira miqdorini ko'rsatadi. Agar "restart" ustunidagi son tez o'sib borayotgan bo'lsa, demak ilova ishga tushishi bilan xato berib yiqilyapti va loglarni tekshirish vaqti keldi.
Ecosystem fayli: sozlamalarni bir joyda saqlash
Buyruq qatoriga har safar o'nlab parametr yozish noqulay va xatoga olib keladi. PM2 buning o'rniga ecosystem faylidan foydalanishni taklif qiladi. Bu fayl loyiha papkasida turadi, Git'da saqlanadi va jamoaning har bir a'zosi ilovani bir xil sozlamalar bilan ishga tushiradi. Quyidagi misolda port, muhit o'zgaruvchilari va xotira chegarasi ko'rsatilgan.
// ecosystem.config.js
module.exports = {
apps: [{
name: "misol-app",
script: "server.js",
cwd: "/var/www/misol-app",
instances: 1,
max_memory_restart: "300M",
env: {
NODE_ENV: "production",
PORT: 3000
}
}]
};
pm2 start ecosystem.config.js
pm2 restart ecosystem.config.js --update-env
max_memory_restart parametri ilova belgilangan xotira miqdoridan oshib ketsa, uni avtomatik qayta ishga tushiradi. Bu xotira oqishi bor ilovalarda serverni to'liq cho'kib qolishdan saqlaydi, lekin muammoning o'zini hal qilmaydi, shuning uchun sababini kodda izlash kerak. --update-env esa o'zgartirilgan muhit o'zgaruvchilarini qayta o'qishga majbur qiladi.
Loglar bilan ishlash
PM2 har bir ilova uchun ikki xil log yuritadi: oddiy chiqish va xatolar. Ular standart holatda foydalanuvchining ~/.pm2/logs papkasida saqlanadi. Jonli kuzatish uchun pm2 logs buyrug'i qulay, oxirgi bir necha yuz qatorni ko'rish uchun esa --lines parametri ishlatiladi.
pm2 logs misol-app
pm2 logs misol-app --lines 200
pm2 flush misol-app
Vaqt o'tishi bilan log fayllar katta hajmga yetib, diskni to'ldirib qo'yishi mumkin. Buning oldini olish uchun log aylanishini sozlaydigan modulni o'rnatish tavsiya etiladi. U eski loglarni siqib, belgilangan sondan ortiqlarini o'chirib boradi.
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
Klaster rejim: barcha yadrolardan foydalanish
Node.js bitta jarayonda asosan bitta protsessor yadrosidan foydalanadi. Serverda bir nechta yadro bo'lsa, PM2 klaster rejimi ilovaning bir nechta nusxasini ishga tushirib, kiruvchi so'rovlarni ular orasida taqsimlaydi. Bu rejim faqat holatini xotirada saqlamaydigan ilovalarga mos keladi: sessiyalar Redis yoki bazada saqlanishi kerak, aks holda foydalanuvchi har safar boshqa nusxaga tushib, tizimdan chiqib ketadi.
pm2 start server.js --name misol-app -i max
pm2 reload misol-app
reload buyrug'i nusxalarni birma-bir yangilaydi, shuning uchun yangi kodni joylashda saytingiz bir lahza ham o'chmaydi. Oddiy restart esa barcha nusxalarni birdaniga to'xtatib qayta yoqadi.
Server qayta yuklanganda avtomatik ishga tushish
PM2 o'zi ham tizim yuklanganda ishga tushishi kerak, aks holda server qayta yuklangandan keyin hech bir ilova ishlamaydi. Buning uchun ikki qadam bajariladi: avval startup skripti yaratiladi, keyin joriy jarayonlar ro'yxati saqlanadi.
pm2 startup
# ekranda chiqqan sudo env PATH=... buyrug'ini nusxalab bajaring
pm2 save
Keyinchalik yangi ilova qo'shsangiz yoki birortasini o'chirsangiz, pm2 save ni qayta bajarishni unutmang. Aks holda server qayta yuklanganda eski ro'yxat tiklanadi.
Amaliy misol: xususiy maktab sayti va API
Toshkentdagi xususiy maktab example.uz domenida ikkita Node.js xizmatiga ega: ota-onalar uchun baholar API'si va Telegram orqali xabar yuboruvchi kichik ishchi. Ikkalasi ham bitta ecosystem faylida yozilgan, API klaster rejimda ikki nusxada, ishchi esa bitta nusxada ishlaydi. Choraklik baholar chiqqan kuni so'rovlar ko'payganda API nusxalari yukni bo'lishib oladi, xotira chegarasi esa xotira oqishi bo'lsa ham serverni himoya qiladi. Dasturchi yangi versiyani joylashda faqat git pull va pm2 reload ecosystem.config.js bajaradi.
Nginx bilan birga ishlatish
PM2 ilovani ishlatadi, lekin uni internetga to'g'ridan-to'g'ri ochish o'rniga oldiga Nginx qo'yish yaxshiroq. Nginx 80 va 443 portlarni qabul qiladi, SSL sertifikatini ulaydi va so'rovlarni ichkaridagi 3000 portga uzatadi. Quyida eng oddiy proksi sozlamasi keltirilgan.
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
Bunday sozlash uchun root huquqi bor server kerak bo'ladi. sayt.uz kabinetidan VPS olib, unga Node.js, PM2 va Nginx o'rnatsangiz, yuqoridagi barcha qadamlarni to'liq nazorat bilan bajarishingiz mumkin.