سأل أحد الأصدقاء بالأمس عن كيفية نشر المشروع السريع. لذلك قمت بتجميع هذه المقالة، والتي تتحدث بشكل أساسي عن كيفية نشر برنامج خادم تم تطويره بناءً على Nodejs كمرجع للأصدقاء المحتاجين.
تحتوي المقالة على عدة أجزاء:
(العملية) هي الكمبيوتر. تخصيص نظام التشغيل والوحدة الأساسية لجدولة المهام . افتح مدير المهام ويمكنك أن ترى أن هناك بالفعل العديد من البرامج التي تعمل في خلفية الكمبيوتر، وكل برنامج عبارة عن عملية.
تتمتع المتصفحات الحديثة بشكل أساسي ببنية متعددة العمليات. خذ متصفح Chrome كمثال، افتح "المزيد من الأدوات" - "مدير المهام" ويمكنك رؤية معلومات العملية الخاصة بالمتصفح الحالي، باستثناء بالإضافة إلى ذلك، هناك عمليات الشبكة وعمليات GPU وما إلى ذلك.
تضمن البنية متعددة العمليات تشغيلًا أكثر استقرارًا للتطبيق. لنأخذ المتصفح كمثال، إذا تم تشغيل جميع البرامج في عملية واحدة، أو إذا كان هناك فشل في الشبكة أو خطأ في عرض الصفحة، فسيؤدي ذلك إلى تعطل المتصفح بأكمله. من خلال البنية متعددة العمليات، حتى لو تعطلت عملية الشبكة، فلن يؤثر ذلك على عرض الصفحات الموجودة، وفي أسوأ الأحوال، لن تتمكن مؤقتًا من الوصول إلى الشبكة.
مؤشر الترابط هو أصغر وحدة يمكن لنظام التشغيل القيام بها لجدولة الحوسبة . يتم تضمينه في العملية وهو وحدة التشغيل الفعلية في العملية. على سبيل المثال، يشبه البرنامج شركة ذات أقسام متعددة، وهي عمليات؛ وتعاون كل قسم يسمح للشركة بالعمل بشكل طبيعي، والخيوط هي الموظفون، والأشخاص الذين يقومون بعمل محدد.
نعلم جميعًا أن JavaScript هي لغة ذات خيط واحد. يرجع هذا التصميم إلى أنه في الأيام الأولى، تم استخدام JS بشكل أساسي لكتابة البرامج النصية وكان مسؤولاً عن تحقيق التأثيرات التفاعلية للصفحة. إذا تم تصميمها كلغة متعددة الخيوط، أولاً، فهي ليست ضرورية، وثانيًا، تعمل الخيوط المتعددة بشكل مشترك على عقدة DOM، فمن الذي يجب أن يستمع المتصفح إلى نصيحته؟ بالطبع، مع تطور التكنولوجيا، يدعم JS الآن أيضًا تعدد الخيوط، ولكنه يستخدم فقط للتعامل مع بعض المنطق غير المرتبط بعمليات DOM.
تؤدي الخيوط المفردة والعمليات الفردية إلى حدوث مشكلة خطيرة بمجرد تعليق الخيط الرئيسي لبرنامج Node.js قيد التشغيل، سيتم أيضًا تعليق العملية، وسيتم أيضًا تعليق التطبيق بأكمله. علاوة على ذلك، تحتوي معظم أجهزة الكمبيوتر الحديثة على وحدات معالجة مركزية متعددة النواة، بأربعة أنوية وثمانية خيوط، وثمانية نوى وستة عشر سلسلة، وهي أجهزة شائعة جدًا. باعتباره برنامجًا أحادي العملية، فإن Node.js يهدر أداء وحدات المعالجة المركزية متعددة النواة.
استجابة لهذا الموقف، نحتاج إلى نموذج مناسب متعدد العمليات لتحويل برنامج Node.js ذو العملية الواحدة إلى بنية متعددة العمليات.
هناك حلان شائعان لتنفيذ بنية متعددة العمليات في Node.js، وكلاهما يستخدم وحدات أصلية، وهي وحدة child_process
ووحدة cluster
.
child_process
هي وحدة نمطية مضمنة في Node.js، ويمكنك تخمين من الاسم أنها مسؤولة عن الأشياء المتعلقة بالعمليات الفرعية.
لن نتناول الاستخدام المحدد لهذه الوحدة في الواقع، فهي تحتوي فقط على حوالي ست أو سبع طرق، والتي لا تزال سهلة الفهم. نستخدم إحدى طرق fork
لتوضيح كيفية تنفيذ عمليات متعددة والتواصل بين عمليات متعددة.
دعونا نلقي نظرة أولاً على بنية الدليل لحالة العرض التوضيحي المعدة:
نستخدم وحدة http
لإنشاء خادم http. عندما يأتي طلب /sum
، سيتم إنشاء عملية فرعية من خلال وحدة child_process
وسيتم إخطار العملية الفرعية بتنفيذ منطق الحساب في نفس الوقت، العملية الأصلية يجب أيضًا الاستماع إلى الرسائل المرسلة بواسطة العملية الفرعية:
//child_process.js ثابت http = يتطلب ('http') const { fork } = require('child_process') خادم const = http.createServer((req, res) => { إذا (req.url == '/ مجموع') { // يتلقى أسلوب الشوكة مسار الوحدة، ثم يبدأ عملية فرعية، ويقوم بتشغيل الوحدة في العملية الفرعية // يمثل ChildProcess العملية الفرعية التي تم إنشاؤها Let ChildProcess = fork('./sum.js') // أرسل رسالة إلى العملية الفرعية ChildProcess.send("تبدأ العملية الفرعية في الحساب") // مراقبة رسائل العملية الفرعية في العملية الأصلية ChildProcess.on('message', (data) => { res.end(بيانات + '') }) // استمع إلى الحدث الختامي للعملية الفرعية ChildProcess.on('Close', () => { // إذا خرجت العملية الفرعية بشكل طبيعي أو أبلغت عن خطأ وتوقفت عن العمل، فستنتقل هنا console.log('تغلق العملية الفرعية') ChildProcess.kill() }) // استمع إلى حدث الخطأ الخاص بالعملية الفرعية ChildProcess.on('error', () => { console.log ("خطأ في العملية الفرعية") ChildProcess.kill() }) } إذا (req.url == '/مرحبا') { نهاية ('مرحبا') } // محاكاة العملية الرئيسية للإبلاغ عن خطأ if (req.url == '/error') { رمي خطأ جديد ("خطأ في العملية الأصلية") نهاية ('مرحبا') } }) server.listen(3000, () => { console.log("الخادم يعمل على 3000") })
يتم استخدام sum.js
لمحاكاة المهام التي ستؤديها العملية الفرعية. تستمع العملية الفرعية إلى الرسائل المرسلة من العملية الأم، وتعالج المهام الحسابية، ثم ترسل النتائج إلى العملية الأم:
// sum.js الدالة getSum() { دع المبلغ = 0 لـ (دع i = 0; i < 10000 * 1000 * 100; i++) { المجموع += 1 } مبلغ الإرجاع } // العملية هي كائن عام في Node.js، يمثل العملية الحالية. هنا هي عملية الطفل. // استمع للرسائل المرسلة بواسطة العملية الرئيسيةprocess.on('message', (data) => { console.log ("رسالة من العملية الرئيسية:"، البيانات) نتيجة ثابتة = getSum () // أرسل نتائج الحساب إلى العملية الأصليةprocess.send(result) })
افتح الجهاز وقم بتشغيل node 1.child_process
:
زيارة المتصفح:
بعد ذلك، قم بمحاكاة الموقف الذي أبلغت فيه العملية الفرعية عن خطأ:
// sum.js الدالة getSum() { // .... } // بعد تشغيل العملية الفرعية لمدة 5 ثوانٍ، تتوقف عملية المحاكاة setTimeout(() => { رمي خطأ جديد ("تقرير الخطأ") }, 1000*5) عملية.on('رسالة', (بيانات) => { // ... })
قم بزيارة المتصفح مرة أخرى ولاحظ وحدة التحكم بعد 5 ثوانٍ:
انتهت العملية الفرعية، ثم تصل إلى عنوان url آخر: /hello
،
يمكن ملاحظة أن العملية الأصلية لا تزال قادرة على التعامل مع الطلب بشكل صحيح، مما يشير إلى أن الخطأ الذي أبلغت عنه العملية الفرعية لن يؤثر على تشغيل العملية الأصلية .
بعد ذلك، سنقوم بمحاكاة السيناريو حيث تبلغ العملية الرئيسية عن خطأ، ونعلق على تقرير الخطأ المحاكى للوحدة sum.js
، ثم نعيد تشغيل الخدمة، ونصل إلى /error
باستخدام المتصفح:
بعد اكتشاف تعليق العملية الأصلية، يتم الخروج من برنامج Node.js بأكمله تلقائيًا، وتنهار الخدمة تمامًا، دون ترك أي مجال للتعافي.
يمكن ملاحظة أن تنفيذ البنية متعددة العمليات لـ Node.js من خلال طريقة fork
الخاصة بـ child_process
ليس أمرًا معقدًا. يتم الاتصال بين العمليات بشكل أساسي من خلال طرق send
on
، ومن هذه التسمية، يمكننا أيضًا معرفة أن الطبقة السفلية يجب أن تكون نموذجًا للنشر والاشتراك.
ولكن لديها مشكلة خطيرة، على الرغم من أن العملية الفرعية لا تؤثر على العملية الأصلية، بمجرد حدوث خطأ في العملية الأصلية وتوقفها، سيتم "قتل" جميع العمليات الفرعية في وعاء واحد. ولذلك، فإن هذا الحل مناسب لتقسيم بعض العمليات المعقدة والمستهلكة للوقت إلى عملية فرعية منفصلة . لنكون أكثر دقة، يتم استخدام هذا الاستخدام ليحل محل تنفيذ مؤشرات الترابط المتعددة، وليس المعالجة المتعددة.
تستخدمالوحدة child_process
لتنفيذ عمليات متعددة، والتي تبدو عديمة الفائدة. لذلك، يوصى عمومًا باستخدام وحدة cluster
لتنفيذ نموذج العمليات المتعددة لـnode.js.
cluster
تعني الكتلة وأعتقد أن الجميع على دراية بهذا المصطلح. على سبيل المثال، في الماضي، كان لدى الشركة مكتب استقبال واحد فقط، وفي بعض الأحيان كان مشغولاً للغاية بحيث لا يتمكن من استقبال الزوار في الوقت المناسب. الآن خصصت الشركة أربعة مكاتب استقبال، حتى لو كانت ثلاثة منها مشغولة، فلا يزال هناك مكتب واحد يمكنه استقبال الزوار الجدد. التجميع يعني هذا تقريبًا بالنسبة لنفس الشيء، يتم تعيينه بشكل معقول لأشخاص مختلفين للقيام بذلك، وذلك لضمان إمكانية القيام بالشيء على أفضل وجه.
استخدام وحدة cluster
بسيط نسبيًا أيضًا. إذا كانت العملية الحالية هي العملية الرئيسية، فقم بإنشاء عدد مناسب من العمليات الفرعية بناءً على عدد مراكز وحدة المعالجة المركزية، واستمع إلى حدث exit
للعملية الفرعية. إذا خرجت عملية فرعية، فأعد تقسيم العملية الفرعية الجديدة -عملية. إذا لم تكن عملية فرعية، فستتم معالجة العمل الفعلي.
ثابت http = يتطلب ('http') كتلة ثابتة = تتطلب ("الكتلة") const cpus = require('os').cpus() إذا (cluster.isMaster) { // عندما يبدأ البرنامج، فإنه ينتقل أولاً إلى هنا ويقوم بإنشاء عمليات فرعية متعددة وفقًا لعدد مراكز وحدة المعالجة المركزية for (let i = 0; i < cpus.length; i++) { // إنشاء عملية فرعية Clust.fork() } // عندما يتم تعليق أي عملية فرعية، ستُصدر وحدة المجموعة حدث "الخروج". عند هذه النقطة، يتم إعادة تشغيل العملية عن طريق استدعاء الشوكة مرة أخرى. العنقودية.on('خروج', () => { الكتلة. شوكة () }) } آخر { // يتم تنفيذ طريقة الشوكة لإنشاء عملية فرعية، وسيتم تنفيذ الوحدة مرة أخرى في هذا الوقت، سيأتي المنطق هنا const server = http.createServer((req, res) => { console.log(process.pid) نهاية ('موافق') }) server.listen(3000, () => { console.log ("الخادم يعمل على 3000"، "pid:" +process.pid) }) }
ابدأ الخدمة:
كما ترون، أنشأت وحدة cluster
الكثير من العمليات الفرعية، ويبدو أن كل عملية فرعية تقوم بتشغيل نفس خدمة الويب.
تجدر الإشارة إلى أن هذه العمليات الفرعية لا تستمع إلى نفس المنفذ في الوقت الحالي. لا يزال الخادم الذي تم إنشاؤه بواسطة طريقة createServer مسؤولاً عن مراقبة المنافذ وإعادة توجيه الطلبات إلى كل عملية فرعية.
لنكتب نصًا طلبًا لطلب الخدمة المذكورة أعلاه ونرى التأثير.
// request.js ثابت http = يتطلب ('http') لـ (دع i = 0; i < 1000; i++) { http.get('http://localhost:3000') }
لا تستطيع وحدة http إنشاء خادم http فحسب، بل يمكن استخدامها أيضًا لإرسال طلبات http. يدعم Axios بيئات المتصفح والخادم. على جانب الخادم، يتم استخدام وحدة http لإرسال طلبات http.
استخدم أمر node
لتنفيذ الملف وإلقاء نظرة على وحدة التحكم الأصلية:
تتم طباعة معرفات العمليات الخاصة بالعمليات الفرعية المختلفة التي تتعامل مع الطلب على وجه التحديد.
هذه هي البنية متعددة العمليات لـ nodd.js التي يتم تنفيذها من خلال وحدة cluster
.
بالطبع، عندما ننشر مشاريع Node.js، لن نكتب ونستخدم وحدة cluster
بهذه الجفاف. هناك أداة مفيدة جدًا تسمى PM2 ، وهي أداة لإدارة العمليات تعتمد على وحدة المجموعة. سيتم تقديم الاستخدام الأساسي له في الفصول اللاحقة.
لقد أمضينا حتى الآن جزءًا من المقالة في التعريف بمعرفة العمليات المتعددة في Node.js. في الواقع، نريد فقط توضيح سبب حاجتنا إلى استخدام PM2 لإدارة تطبيقات Node.js. نظرًا للمساحة المحدودة لهذه المقالة وعدم وجود وصف دقيق/مفصل، فإن هذه المقالة تقدم فقط مقدمة مختصرة. إذا كانت هذه هي المرة الأولى التي تتواصل فيها مع هذا المحتوى، فقد لا تفهمه جيدًا، لذا لا تقلق، سيكون هناك مقال أكثر تفصيلاً لاحقًا.
أعدت هذه المقالة نموذجًا لبرنامج تم تطويره باستخدام Express، انقر هنا للوصول إليه.
وهي تنفذ بشكل أساسي خدمة واجهة عند الوصول إلى /api/users
، يتم استخدام mockjs
لمحاكاة 10 أجزاء من بيانات المستخدم وإرجاع قائمة المستخدمين. في الوقت نفسه، سيتم تشغيل مؤقت لمحاكاة حالة الخطأ:
const Express = require('express') const Mock = require('mockjs') تطبيق ثابت = صريح () app.get("/api/users", (req, res) => { قائمة المستخدم الثابتة = Mock.mock({ 'قائمة المستخدمين|10': [{ 'المعرف|+1': 1، "الاسم": "@cname"، "البريد الإلكتروني": "@البريد الإلكتروني" }] }) setTimeout(()=> { رمي خطأ جديد ("فشل الخادم") }، 5000) حالة الدقة(200) res.json(قائمة المستخدمين) }) app.listen(3000, () => { console.log("بدء الخدمة: 3000") })
اختبره محليًا وقم بتنفيذ الأمر في الوحدة الطرفية:
Node server.js
افتح المتصفح وقم بالوصول إلى واجهة قائمة المستخدمين:
بعد خمس ثوان، سيتوقف الخادم:
يمكننا حل هذه المشكلة لاحقًا عندما نستخدم PM2 لإدارة التطبيقات.
عادةً بعد الانتهاء من مشروع vue/react، سنقوم بتعبئته أولاً ثم نشره. في الواقع، تحتاج مشاريع الواجهة الأمامية إلى الحزم بشكل أساسي لأن بيئة التشغيل النهائية للبرنامج هي المتصفح، ويعاني المتصفح من مشكلات توافق مختلفة ومشكلات في الأداء، مثل:
.vue
و .jsx
و .ts
لا تحتوي المشاريع التي تم تطويرها باستخدام Express.js أو koa.js على هذه المشاكل. علاوة على ذلك، يعتمد Node.js المواصفات المعيارية CommonJS ولديه آلية تخزين مؤقت، وفي الوقت نفسه، لن يتم استيراد الوحدة إلا عند استخدامها . إذا قمت بتجميعها في ملف، فسيتم إهدار هذه الميزة بالفعل. لذلك بالنسبة لمشاريع Node.js، ليست هناك حاجة إلى الحزم.
تستخدم هذه المقالة نظام CentOS كمثال لتوضيح
لتسهيل تبديل إصدارات العقدة، نستخدم nvm لإدارة العقد.
Nvm (Node Version Manager) هي أداة إدارة إصدار Node.js. ومن خلاله، يمكن تبديل العقد بشكل تعسفي بين إصدارات متعددة، وتجنب عمليات التنزيل والتثبيت المتكررة عندما يكون تبديل الإصدارات مطلوبًا.
المستودع الرسمي لـ Nvm هو github.com/nvm-sh/nvm. نظرًا لأنه يتم تخزين البرنامج النصي للتثبيت على موقع githubusercontent
، فغالبًا ما لا يمكن الوصول إليه. لذلك قمت بإنشاء مستودع مرآة جديد له على gitee، حتى أتمكن من الوصول إلى البرنامج النصي للتثبيت من gitee.
قم بتنزيل البرنامج النصي للتثبيت من خلال أمر curl
واستخدم bash
لتنفيذ البرنامج النصي، والذي سيكمل تثبيت nvm تلقائيًا:
# curl -o- https://gitee.com/hsyq/nvm/raw/master/install.sh | bash
عند انتهاء التثبيت بعد ذلك نفتح نافذة جديدة لاستخدام nvm:
[root@ecs-221238 ~]# nvm -v0.39.1
يمكنه طباعة رقم الإصدار بشكل طبيعي، مما يشير إلى أنه تم تثبيت nvm بنجاح.
الآن يمكنك استخدام nvm لتثبيت العقدة وإدارتها.
عرض إصدارات العقدة المتاحة:
# nvm ls-remote
عقدة التثبيت:
# nvm install 18.0.0
عرض إصدارات العقدة المثبتة:
[root@ecs-221238 ~]# قائمة nvm -> الإصدار 18.0.0 الافتراضي -> 18.0.0 (-> الإصدار 18.0.0) iojs -> غير متاح (افتراضي) غير مستقر -> غير متاح (افتراضي) العقدة -> مستقرة (-> الإصدار 18.0.0) (افتراضي) مستقر -> 18.0 (-> v18.0.0) (افتراضي)
حدد الإصدار الذي تريد استخدامه:
# nvm use 18.0.0
هناك شيء واحد يجب ملاحظته وهو أنه عند استخدام nvm على Windows، تحتاج إلى استخدام حقوق المسؤول لتنفيذ أمر nvm. في نظام CentOS، أقوم بتسجيل الدخول كمستخدم أساسي افتراضيًا، لذلك لا توجد مشكلة. إذا واجهت أخطاء غير معروفة عند استخدامه، يمكنك البحث عن حلول أو محاولة معرفة ما إذا كانت المشكلة بسبب الأذونات.
عند تثبيت العقدة، سيتم تثبيت npm تلقائيًا. تحقق من أرقام إصدارات العقدة وnpm:
[root@ecs-221238 ~]#node -v v18.0.0 [root@ecs-221238 ~]# npm -v
مصدر صورة npm الافتراضي
في الإصدار 8.6.0هو العنوان الرسمي:
[root@ecs-221238 ~]# npm config get Registration https://registry.npmjs.org/
قم بالتبديل إلى مصدر مرآة تاوباو المحلي:
[root@ecs-221238 ~]# سجل مجموعة تكوين npm https://registry.npmmirror.com
عند هذه النقطة، قام الخادم بتثبيت العقدة تم تكوين البيئة وnpm.
هناك العديد من الطرق، إما التنزيل إلى الخادم من مستودع Github/GitLab/Gitee، أو التحميل محليًا من خلال أداة ftp. الخطوات بسيطة جدًا ولن يتم توضيحها مرة أخرى.
يتم وضع المشروع التجريبي في الدليل /www
:
بشكل عام، تفتح الخوادم السحابية المنفذ 22 فقط لتسجيل الدخول عن بعد. المنافذ شائعة الاستخدام مثل 80 و443 ليست مفتوحة. بالإضافة إلى ذلك، فإن المشروع السريع الذي أعددناه يعمل على المنفذ 3000. لذلك عليك أولاً الانتقال إلى وحدة التحكم الخاصة بالخادم السحابي، والعثور على مجموعة الأمان، وإضافة بعض القواعد، وفتح المنافذ 80 و3000.
أثناء مرحلة التطوير، يمكننا استخدام nodemon
للمراقبة في الوقت الفعلي وإعادة التشغيل التلقائي لتحسين كفاءة التطوير. في بيئة الإنتاج، تحتاج إلى استخدام القاتل الأكبر — PM2.
قم أولاً بتثبيت PM2 عالميًا:
# npm i -gpm2
قم بتنفيذ الأمر pm2 -v
للتحقق من نجاح التثبيت:
[root@ecs-221238 ~]#pm2 -v5.2.0
قم بالتبديل إلى دليل المشروع وقم بتثبيت التبعيات أولاً:
cd /www/express-demo قم بتثبيت npm
ثم استخدم الأمر pm2
لبدء التطبيق.
PM2 بدء تشغيل app.js -i max // أو بدء تشغيل PM2 server.js -i 2
يحتوي تطبيق إدارة PM2 على وضعين: الشوكة والكتل. عند بدء تشغيل التطبيق، باستخدام المعلمة -i لتحديد عدد المثيلات، سيتم تشغيل وضع المجموعة تلقائيًا. عند هذه النقطة، تتوفر إمكانيات موازنة التحميل.
-i: المثال، عدد الحالات. يمكنك كتابة رقم محدد أو تهيئته إلى الحد الأقصى وسيقوم
PM2
تلقائيًا بالتحقق من عدد وحدات المعالجة المركزية المتاحة ثم بدء أكبر عدد ممكن من العمليات.
بدأ التطبيق الآن. سيقوم PM2 بإدارة التطبيق في شكل عملية خفية. يعرض هذا الجدول بعض المعلومات حول التطبيق قيد التشغيل، مثل حالة التشغيل واستخدام وحدة المعالجة المركزية واستخدام الذاكرة وما إلى ذلك.
الوصول إلى الواجهة في متصفح محلي:
وضع المجموعة هو نموذج متعدد العمليات ومتعدد المثيلات . عندما يأتي الطلب، سيتم تعيينه لإحدى العمليات للمعالجة. تمامًا مثل استخدام وحدة cluster
التي رأيناها من قبل، نظرًا لحماية PM2، حتى إذا ماتت العملية، فسيتم إعادة تشغيل العملية على الفور.
ارجع إلى محطة الخادم وقم بتنفيذ أمر pm2 logs
لعرض سجلات PM2:
يمكن ملاحظة أن مثيل التطبيق ذو المعرف 1 قد توقف عن العمل، وسيقوم PM2 بإعادة تشغيل المثيل على الفور. لاحظ أن المعرف هنا هو معرف مثيل التطبيق، وليس معرف العملية.
عند هذه النقطة، اكتمل النشر البسيط لمشروع سريع. باستخدام أداة PM2، يمكننا التأكد من أن مشروعنا يمكن تشغيله بشكل مستقر وموثوق.
فيما يلي ملخص لبعض الأوامر شائعة الاستخدام لأداة PM2 كمرجع.
# وضع الشوكة PM2 start app.js --name app # اضبط اسم التطبيق على app #وضع الكتلة# استخدم موازنة التحميل لبدء 4 عمليات PM2 start app.js -i 4 # سيبدأ 4 عمليات باستخدام موازنة التحميل، اعتمادًا على وحدة المعالجة المركزية المتاحة PM2 بدء تشغيل app.js -i 0 # يعادل تأثير الأمر أعلاهpm2 start app.js -i max # قم بتوسيع التطبيق من خلال 3 عمليات إضافية لتطبيق مقياس PM2 +3 # قم بتوسيع التطبيق أو تقليصه إلى عمليتين تطبيق مقياس PM2 2 # عرض حالة التطبيق # عرض حالة جميع العمليات في قائمة PM2 # اطبع قائمة بجميع العمليات بتنسيق JSON الخام PM2 jlist # استخدم JSON المجمل لطباعة قائمة بجميع العمليات PM2 Prettylist # عرض كافة المعلومات حول عملية محددة وصفها PM2 0 # استخدم لوحة القيادة لمراقبة جميع العمليات PM2 monit # إدارة السجل # عرض جميع سجلات التطبيق (سجلات PM2) في الوقت الحقيقي # عرض سجلات تطبيق التطبيق في الوقت الحقيقي تطبيق سجلات PM2 # استخدم تنسيق json لعرض السجلات في الوقت الفعلي، ولا تقم بإخراج السجلات القديمة، بل قم فقط بإخراج السجلات التي تم إنشاؤها حديثًا سجلات PM2 --json #إدارة التطبيقات# إيقاف جميع العمليات PM2 إيقاف الكل # أعد تشغيل كافة العمليات PM2 أعد تشغيل الكل # أوقف العملية بالمعرف المحدد PM2 stop 0 # أعد تشغيل العملية بالمعرف المحدد PM2 Restart 0 # حذف العملية PM2 بالمعرف 0 حذف 0 # حذف جميع العمليات PM2 حذف الكل
يمكنك تجربة كل أمر بنفسك لترى التأثير.
فيما يلي عرض توضيحي خاص لأمر monit
، الذي يمكنه تشغيل لوحة في الجهاز لعرض حالة تشغيل التطبيق في الوقت الفعلي، ويمكن تبديل جميع التطبيقات التي يديرها PM2 من خلال الأسهم لأعلى ولأسفل:
يحتوي PM2 على وظائف قوية جدًا، أكثر بكثير من الأوامر المذكورة أعلاه. في النشر الحقيقي للمشروع، قد تحتاج أيضًا إلى تكوين ملفات السجل ووضع المراقبة ومتغيرات البيئة وما إلى ذلك. سيكون من الممل جدًا كتابة الأوامر يدويًا في كل مرة، لذلك يوفر PM2 ملفات التكوين لإدارة التطبيقات ونشرها.
يمكنك إنشاء ملف التكوين من خلال الأمر التالي:
[root@ecs-221238 Express-demo]#pm2 init simpleسيؤدي
الملف /www/express-demo/ecosystem.config.js الذي تم إنشاؤه
إلى إنشاء ملف ecosystem.config.js
:
Module.exports = { التطبيقات : [{ الاسم: "التطبيق 1"، البرنامج النصي: "./app.js" }] }
يمكنك أيضًا إنشاء ملف تكوين بنفسك، مثل app.config.js
:
const path = require('path') وحدة التصدير = { // يمكن لملف تكوين واحد إدارة تطبيقات Node.js المتعددة في نفس الوقت // التطبيقات عبارة عن مصفوفة، وكل عنصر هو تكوين لتطبيق ما: [{ // اسم التطبيق: "express-demo"، // البرنامج النصي لملف إدخال التطبيق: "./server.js"، // هناك وضعان لبدء التطبيق: الكتلة والشوكة. exec_mode: "الكتلة"، // عدد مثيلات التطبيق المراد إنشاء مثيلاتها: "الحد الأقصى"، // قم بتشغيل المراقبة وأعد تشغيل التطبيق تلقائيًا عندما يتغير الملف شاهد: صحيح، // تجاهل التغييرات في بعض ملفات الدليل. // نظرًا لأنه تم وضع دليل السجل في مسار المشروع، فيجب تجاهله، وإلا فسيقوم التطبيق بإنشاء سجلات عند بدء تشغيله، وسيتم إعادة تشغيل PM2 عندما يراقب التغييرات حلقة تجاهل_المراقبة: [ "وحدات_العقدة"، "سجلات" ]، // مسار تخزين سجل الأخطاء err_file: path.resolve(__dirname, 'logs/error.log'), // مسار تخزين سجل الطباعة out_file: path.resolve(__dirname, 'logs/out.log'), // قم بتعيين تنسيق التاريخ أمام كل سجل في ملف السجل log_date_format: "YYYY-MM-DD HH:mm:ss"، }] }
اسمح لـpm2 باستخدام ملفات التكوين لإدارة تطبيقات العقدة:
بدء تشغيل PM2 app.config.js
الآن، ستضع التطبيقات التي تديرها PM2 السجلات في دليل المشروع (السجل الافتراضي موجود في دليل تثبيت PM2)، ويمكنها مراقبة تغييرات الملف. ، قم بإعادة تشغيل الخدمة تلقائيًا.