ما هو PM2: دليل كامل لإدارة عمليات Node.js
المقدمة
إدارة العمليات هي جانب حاسم من تشغيل تطبيقات Node.js في بيئات الإنتاج، وقد برز PM2 كواحد من أقوى الحلول وأكثرها اعتمادًا في هذا المجال. كمدير عمليات قوي وبيئة تشغيل للإنتاج، أصبح PM2 أداة أساسية في نظام Node.js البيئي الحديث.
PM2 (مدير العمليات 2) هو مدير عمليات متقدم مصمم خصيصًا لتطبيقات Node.js، على الرغم من أنه يمكنه إدارة أنواع أخرى من التطبيقات أيضًا. يوفر مجموعة شاملة من الميزات التي تساعد المطورين وفرق العمليات على الحفاظ على تطبيقاتهم وتوسيعها بفعالية. من إدارة العمليات الأساسية إلى قدرات المراقبة المتقدمة، يعالج PM2 العديد من التحديات التي تواجه تشغيل تطبيقات Node.js في الإنتاج.
لا يمكن المبالغة في أهمية إدارة العمليات في تطبيقات Node.js. تعمل تطبيقات Node.js في خيط واحد بشكل افتراضي، مما يجعلها عرضة للاختراقات ويتطلب تدخلًا يدويًا لإعادة التشغيل. بالإضافة إلى ذلك، تحتاج التطبيقات الحديثة إلى التوسع عبر نوى المعالج المتعددة للتعامل مع الحمل المتزايد بكفاءة. هنا يأتي دور PM2، حيث يقدم إدارة عمليات تلقائية، وتوازن الحمل، وقدرات المراقبة التي تعتبر ضرورية للتطبيقات ذات الجودة الإنتاجية.
بالنسبة لبيئات الإنتاج، يعمل PM2 كعنصر بنية تحتية حاسم من خلال توفير:
- إعادة تشغيل التطبيق تلقائيًا بعد الأعطال
- توازن الحمل عبر نوى المعالج المتعددة
- مراقبة وتسجيل مدمجين
- تحديثات بدون توقف
- إدارة البيئة
- تجميع العمليات
فهم PM2
التعريف والميزات الأساسية
PM2 هو مدير عمليات مفتوح المصدر للإنتاج لتطبيقات Node.js، تم تطويره وصيانته من قبل فريق Keymetrics (الآن PM2). يعمل كمدير عمليات خادم يساعد المطورين على إدارة والحفاظ على تطبيقاتهم متاحة على مدار الساعة. في جوهره، يقوم PM2 بلف تطبيقات Node.js الخاصة بك في طبقة إدارة العمليات التي تتعامل مع العديد من الجوانب المعقدة لتشغيل التطبيقات في الإنتاج.
التاريخ والتطوير
تم إصدار PM2 لأول مرة في عام 2013، وتم إنشاؤه لتلبية الاحتياجات المتزايدة لتطبيقات Node.js في بيئات الإنتاج. منذ ذلك الحين، نمت المشروع ليصبح واحدًا من أكثر مديري العمليات شعبية في نظام Node.js البيئي، مع ملايين التنزيلات على npm ومجتمع قوي من المساهمين. يشير اسم "PM2" إلى أنه مدير عمليات من الجيل الثاني، يبني على الدروس المستفادة من الحلول السابقة.
لماذا تختار PM2؟
عند مقارنته بمديري العمليات الآخرين مثل Forever وNodemon أو SystemD، يتميز PM2 لعدة أسباب:
-
مجموعة ميزات شاملة: يقدم PM2 مجموعة كاملة من الميزات الجاهزة للإنتاج، من إدارة العمليات الأساسية إلى أدوات المراقبة والنشر المتقدمة.
-
تطوير نشط: مع تحديثات منتظمة ودعم قوي من المجتمع، يتطور PM2 باستمرار لتلبية متطلبات التطبيقات الحديثة.
-
تكامل سهل: يتكامل PM2 بسلاسة مع أدوات ومنصات التطوير الشائعة، مما يجعله خيارًا طبيعيًا لعمليات التطوير الحديثة.
-
جاهز للإنتاج: تم اختباره في المعارك ويستخدمه شركات من جميع الأحجام، من الشركات الناشئة إلى المؤسسات الكبيرة.
الفوائد الرئيسية
تقدم PM2 لفرق التطوير عدة مزايا كبيرة:
-
إدارة عمليات مبسطة: يمكن للمطورين التركيز على كتابة الكود بينما يتولى PM2 تعقيدات إدارة العمليات.
-
تحسين موثوقية التطبيق: تضمن قدرات إعادة التشغيل التلقائي والمراقبة الصحية بقاء التطبيقات متاحة.
-
أداء معزز: تساعد قدرات توازن الحمل والتجميع المدمجة التطبيقات على استخدام موارد الخادم بكفاءة.
-
رؤى مفصلة: توفر ميزات المراقبة والتسجيل الشاملة رؤية لسلوك التطبيق وأدائه.
-
تكامل سير العمل التطويري: يتناسب PM2 بشكل طبيعي مع سير العمل التطويري الحديث، داعمًا استراتيجيات ونشر بيئات متنوعة.
الميزات الأساسية والقدرات
إدارة العمليات
تشكل قدرات إدارة العمليات في PM2 أساس وظيفته. تشمل الميزات الرئيسية لإدارة العمليات:
-
تحويل التطبيق إلى خدمة: يقوم PM2 بتشغيل تطبيقاتك كعمليات خادم، مما يضمن استمرار تشغيلها في الخلفية حتى بعد تسجيل خروجك من الخادم.
-
إدارة دورة حياة العمليات: يتعامل تلقائيًا مع بدء وإيقاف وإعادة تشغيل وتحميل العمليات باستخدام أوامر بسيطة مثل
pm2 start
وpm2 stop
وpm2 restart
. -
إعادة التشغيل التلقائي: إذا تعطل تطبيقك أو توقف بشكل غير متوقع، يقوم PM2 بإعادة تشغيله تلقائيًا، مما يضمن أقصى وقت تشغيل.
توازن الحمل
يوفر PM2 قدرات توازن الحمل المدمجة التي تساعد في توزيع الحمل عبر نوى المعالج المتعددة:
-
وضع التجميع: أنشئ بسهولة عدة نسخ من تطبيقك باستخدام وحدة التجميع في Node.js بأمر واحد:
pm2 start app.js -i max
. -
توزيع الحمل الذكي: يقوم PM2 بتوازن الطلبات تلقائيًا عبر جميع نسخ تطبيقك، مما يزيد من استخدام موارد الخادم.
-
إدارة النسخ: قم بتوسيع عدد نسخ التطبيق ديناميكيًا بناءً على متطلبات الحمل.
إدارة السجلات
تساعد ميزات التسجيل الشاملة المطورين على تتبع سلوك التطبيق وحل المشكلات:
-
إدارة السجلات المركزية: يتم جمع جميع سجلات التطبيق تلقائيًا وتخزينها في موقع مركزي.
-
دوران السجلات: يدعم الدوران المدمج للسجلات لمنع استهلاك ملفات السجل لمساحة قرص مفرطة.
-
مراقبة السجلات في الوقت الحقيقي: عرض السجلات في الوقت الحقيقي باستخدام أوامر مثل
pm2 logs
مع خيارات تصفية متنوعة.
قدرات المراقبة
يوفر PM2 ميزات مراقبة قوية لمساعدة الفرق في الحفاظ على أداء التطبيق الأمثل:
-
مراقبة الموارد: تتبع استخدام وحدة المعالجة المركزية، واستهلاك الذاكرة، وغيرها من المقاييس الحيوية لكل عملية.
-
مقاييس الأداء: مراقبة معدلات الطلب، وأوقات الاستجابة، وغيرها من المقاييس الخاصة بالتطبيق.
-
فحوصات الصحة: تضمن الفحوصات الصحية المنتظمة استجابة تطبيقك بشكل صحيح.
إعادة التحميل بدون توقف
يمكن PM2 من تحديثات التطبيق بسلاسة دون انقطاع الخدمة:
-
إعادة تحميل سلسة: تحديث كود التطبيق دون قطع أي اتصالات مستخدم باستخدام
pm2 reload
. -
إعادة التشغيل المتدحرجة: عند تشغيل عدة نسخ، يقوم PM2 بإجراء إعادة تشغيل متدحرجة للحفاظ على توفر الخدمة.
-
إدارة الإصدارات: تتبع إصدارات التطبيق والعودة بسهولة إذا تم اكتشاف مشكلات.
البدء مع PM2
عملية التثبيت
تثبيت PM2 بسيط باستخدام مدير حزم Node (npm). يضمن التثبيت العالمي توفر PM2 على مستوى النظام:
npm install pm2 -g
بالنسبة للمستخدمين الذين يفضلون Yarn:
yarn global add pm2
الأوامر الأساسية والاستخدام
يوفر PM2 واجهة سطر أوامر بديهية لإدارة التطبيقات:
- بدء التطبيقات:
# بدء أساسي
pm2 start app.js
# بدء باسم محدد
pm2 start app.js --name "my-app"
# بدء في وضع التجميع
pm2 start app.js -i 4
- إدارة العمليات:
# قائمة بجميع العمليات
pm2 list
# إيقاف تطبيق
pm2 stop app-name
# إعادة تشغيل تطبيق
pm2 restart app-name
# حذف تطبيق
pm2 delete app-name
تكوين العمليات
يدعم PM2 ملفات التكوين (ملفات النظام البيئي) للنشر الأكثر تعقيدًا:
// ecosystem.config.js
module.exports = {
apps: [{
name: "my-app",
script: "./app.js",
instances: 4,
exec_mode: "cluster",
watch: true,
env: {
NODE_ENV: "development",
},
env_production: {
NODE_ENV: "production",
}
}]
}
ابدأ تطبيقك باستخدام ملف التكوين:
pm2 start ecosystem.config.js
إدارة البيئة
يجعل PM2 من السهل إدارة تكوينات البيئة المختلفة:
- المتغيرات البيئية:
- تعيين المتغيرات الخاصة بالبيئة في ملف النظام البيئي
- التبديل بين البيئات باستخدام علامة
--env
pm2 start ecosystem.config.js --env production
- ملفات التكوين:
- الحفاظ على ملفات تكوين منفصلة لبيئات مختلفة
- استخدام إعدادات خاصة بالبيئة لسيناريوهات النشر المختلفة
- تكوين وقت التشغيل:
- تعديل المتغيرات البيئية في الوقت الفعلي
- تحديث تكوين التطبيق دون إعادة التشغيل
الميزات المتقدمة
وضع التجميع
يمكن وضع التجميع في PM2 من تمكين قدرات توسيع التطبيقات المتطورة:
// تكوين وضع التجميع
module.exports = {
apps: [{
script: 'app.js',
instances: 'max', // أو عدد محدد
exec_mode: 'cluster',
instance_var: 'INSTANCE_ID',
wait_ready: true,
listen_timeout: 3000
}]
}
تشمل الميزات الرئيسية للتجميع:
- توازن الحمل التلقائي عبر النسخ
- إعادة تحميل بدون توقف
- استرداد فشل النسخ
- تحسين نوى المعالج
تكامل الحاويات
يعمل PM2 بسلاسة مع البيئات المعتمدة على الحاويات:
- تكامل Docker:
- صور Docker الرسمية متاحة
- إدارة عمليات معتمدة على الحاويات
- نقاط فحص الصحة
- مراقبة مدركة للحاويات
- دعم Kubernetes:
- إدارة العمليات داخل الحاويات
- تكامل دورة حياة الحاويات
- تحسين الموارد
سير عمل النشر
يوفر PM2 قدرات نشر قوية:
# إعداد تكوين النشر
pm2 ecosystem
# نشر إلى الإنتاج
pm2 deploy production
# التراجع إذا لزم الأمر
pm2 deploy production revert 1
تشمل ميزات النشر:
- نشر متعدد الخوادم
- نصوص نشر آلية
- إدارة الإصدارات
- قدرات التراجع
- خطافات قبل/بعد النشر
لوحة المراقبة
يقدم PM2 مراقبة شاملة من خلال واجهته الويب المدمجة:
- مقاييس في الوقت الحقيقي:
- استخدام وحدة المعالجة المركزية والذاكرة
- معدلات الطلب
- معدلات الأخطاء
- مقاييس مخصصة
- مراقبة النظام:
- فحوصات صحة الخادم
- استخدام الموارد
- إحصائيات الشبكة
- استخدام القرص
دوران السجلات
قدرات إدارة السجلات المتقدمة:
module.exports = {
apps: [{
name: "app",
script: "./app.js",
log_date_format: "YYYY-MM-DD HH:mm Z",
error_file: "./logs/error.log",
out_file: "./logs/out.log",
log_file: "./logs/combined.log",
max_size: "10M",
max_restarts: 10
}]
}
أفضل الممارسات
توصيات التكوين
عند استخدام PM2 في بيئات الإنتاج، من الضروري اتباع هذه الممارسات المثلى للتكوين:
- تكوين التطبيق:
- استخدم دائمًا ملفات تكوين النظام البيئي بدلاً من معلمات سطر الأوامر
- تعيين حدود الذاكرة المناسبة لتطبيقاتك
- تكوين معالجة الأخطاء والتسجيل بشكل صحيح
- استخدام أسماء ذات معنى لعملياتك
مثال على ملف نظام بيئي مُعد بشكل جيد:
module.exports = {
apps: [{
name: 'production-app',
script: './app.js',
instances: 'max',
max_memory_restart: '1G',
max_restarts: 10,
watch: false,
error_file: './logs/error.log',
out_file: './logs/output.log',
time: true
}]
}
اعتبارات الأمان
تنفيذ تدابير الأمان المناسبة أمر حيوي:
- أذونات العمليات:
- تشغيل العمليات بأقل الامتيازات المطلوبة
- استخدام حسابات مستخدمين منفصلة لتطبيقات مختلفة
- تنفيذ أذونات الملفات المناسبة
- المتغيرات البيئية:
- عدم الالتزام بالبيانات الحساسة في التحكم في الإصدار
- استخدام ملفات تكوين خاصة بالبيئة
- تنفيذ إدارة أسرار آمنة
- أمان الشبكة:
- تكوين قواعد جدار الحماية المناسبة
- تنفيذ تحديد المعدل
- استخدام بروتوكولات الاتصال الآمنة
تحسين الأداء
قم بتحسين إعداد PM2 الخاص بك لتحقيق أقصى أداء:
- إدارة الموارد:
- مراقبة وضبط حدود الذاكرة
- تحسين عدد النسخ بناءً على نوى المعالج
- تنفيذ استراتيجيات توازن الحمل المناسبة
- توسيع التطبيق:
- استخدام وضع التجميع بفعالية
- تنفيذ التوسع الأفقي عند الحاجة
- مراقبة وضبط بناءً على أنماط الحمل
الأخطاء الشائعة التي يجب تجنبها
- إدارة العمليات:
- لا تتجاهل سجلات التطبيق
- تجنب تشغيل عدد كبير جدًا من النسخ
- لا تتجاهل المراقبة والتنبيهات
- أخطاء التكوين:
- عدم تعيين المتغيرات البيئية المناسبة
- تكوين المسارات بشكل غير صحيح
- عدم وجود معالجة للأخطاء
- مشكلات النشر:
- عدم اختبار نصوص النشر
- تجاهل إجراءات التراجع
- عدم كفاية المراقبة أثناء النشر

الأسئلة الشائعة (FAQ)
1. كيف يمكنني إعادة تشغيل تطبيقي عند تغيير الملفات؟
ج: يمكنك استخدام ميزة المراقبة في PM2:
# باستخدام سطر الأوامر
pm2 start app.js --watch
# أو في ecosystem.config.js
module.exports = {
apps: [{
script: 'app.js',
watch: true,
ignore_watch: ['node_modules', 'logs']
}]
}
2. كيف يمكنني عرض السجلات لتطبيق معين؟
ج: يوفر PM2 عدة أوامر تسجيل:
# عرض جميع السجلات
pm2 logs
# عرض السجلات لتطبيق معين
pm2 logs app-name
# عرض آخر N سطر
pm2 logs --lines 100
3. لماذا يستخدم تطبيقي ذاكرة أكثر مما هو متوقع؟
ج: قد يكون ذلك بسبب عدة أسباب:
- تسرب الذاكرة في تطبيقك
- تشغيل عدد كبير جدًا من النسخ
- جمع القمامة غير المناسب
الحل: استخدم ميزة حد الذاكرة في PM2:
{
"name": "app",
"script": "app.js",
"max_memory_restart": "1G"
}
4. كيف يمكنني تشغيل تكوينات مختلفة في التطوير والإنتاج؟
ج: استخدم تكوينات خاصة بالبيئة:
module.exports = {
apps: [{
script: 'app.js',
env: {
NODE_ENV: 'development',
PORT: 3000
},
env_production: {
NODE_ENV: 'production',
PORT: 80
}
}]
}
5. كيف يمكنني بدء PM2 تلقائيًا بعد إعادة تشغيل النظام؟
ج: استخدم أمر بدء التشغيل:
# إنشاء نص بدء التشغيل
pm2 startup
# حفظ قائمة العمليات الحالية
pm2 save
6. كيف يمكنني تحديث PM2 نفسه؟
ج: اتبع هذه الخطوات:
# تثبيت أحدث إصدار من PM2
npm install pm2@latest -g
# تحديث PM2 في الذاكرة
pm2 update
7. لماذا لا يستخدم تطبيقي Node.js جميع نوى المعالج؟
ج: Node.js يعمل بخيط واحد بشكل افتراضي. استخدم وضع التجميع في PM2:
# باستخدام سطر الأوامر
pm2 start app.js -i max
# أو في ecosystem.config.js
module.exports = {
apps: [{
script: 'app.js',
instances: 'max',
exec_mode: 'cluster'
}]
}
8. كيف يمكنني مراقبة أداء تطبيقي؟
ج: استخدم أدوات المراقبة في PM2:
# مراقبة أساسية
pm2 monit
# لوحة تحكم قائمة على الويب
pm2 plus
# نظرة عامة على الحالة
pm2 status
9. كيف يمكنني التعامل مع أعطال التطبيقات؟
ج: يقوم PM2 بإعادة تشغيل التطبيقات المعطلة تلقائيًا، ولكن يمكنك تكوين سلوكيات محددة:
module.exports = {
apps: [{
script: 'app.js',
max_restarts: 10,
min_uptime: "1m",
restart_delay: 5000
}]
}
10. كيف يمكنني تدوير ملفات السجل لمنع مشكلات مساحة القرص؟
ج: قم بتكوين دوران السجلات في ملف النظام البيئي الخاص بك:
module.exports = {
apps: [{
script: 'app.js',
max_size: "10M",
out_file: "./logs/out.log",
error_file: "./logs/error.log",
merge_logs: true,
time: true
}]
}