اذهب إلى المحتوى

السؤال

نشر

أرغب بجعل خادم node.js قيد العمل دوماً حتى في حال إغلاق الاتصال مع الخادم، أي بمعنى آخر عندما أقوم حالياً بإغلاق الـ terminal، يتم أيضاً إيقاف خادم node.js ويتوقف عن استقبال الطلبات من طرف المستخدم.

هل يوجد طريقة لجعل الخادم يعمل بشكل دائم حتى في حال الإغلاق؟ وما هو الحل في نظام Unix دون استخدام حزم إضافية مثل pm2 وغيرها؟

Recommended Posts

  • 1
نشر

إن تنفيذ أي برنامج يعني عمله ضمن إجرائية معينة يقوم نظام التشغيل بتحديد الموارد المتاحة لها وإدارة دورة حياتها،
ويمكن لأي اجرائية تنفيذ برامج أخرى وسيقوم نظام التشغيل بتنفيذ البرنامج ضمن إجرائية جديدة تكون إبنًا للإجرائية التي استدعت تنفيذ البرنامج

دورة حياة الإجرائية الإبن مرتبطة بالإجرائية التي نشأت منها أي بإغلاق الإجرائية الأب ينتهي عمل الإجرائيات الأبناء  

الطرفية terminal بحد ذاتها تعمل ضمن إجرائية وعند تنفيذك اي أمر داخلها (npm start مثلا) سيولد اجرائية إبن يعمل ضمنها تطبيقك لذلك عند إغلاقك للطرفية ينتهي عمل تطبيقك فورا

أحد الحلول هو استخدام برامج مثل pm2 حيث يتم تشغيله كإجرائية مستقلة وبإعطاء الأوامر له بالتشغيل والمراقبة يدير كافة الإجرائيات ويبقيها تعمل دوما (فهو غير مرتبط بالطرفية نستخدم الطرفية فقط للتواصل وارسال الأوامر)

الحل الوحيد هو تنفيذ مشروعك كإجرائية مستقلة مرتبطة مباشرة بنظام التشغيل أو ما يعرف بالخدمات، تكتب مواصفات الخدمة في ملف myapp.service داخل المسار /etc/systemd/system

[Unit]
# اسم لتطبيقك لتسهل إدارته
Description=My app

[Service]
# ملف بداية التنفيذ
ExecStart=/var/www/myapp/app.js
Restart=always
User=nobody
Group=nobody
# متحولات البيئة
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
# مسار العمل كما لو أنك تنفذ الأمر من الطرفية عند هذا المسار
WorkingDirectory=/var/www/myapp

[Install]
WantedBy=multi-user.target

  ملاحظة: ملف بداية التنفيذ يجب أن يبدأ بالسطر التالي لنحددبرنامج البيئة الذي سينفذ الملف وهو node في حالتنا

#!/usr/bin/env node

تنفذ الأمر التالي ليقوم نظام التشغيل باستكشاف الخدمة الجديدة

systemctl daemon-reload

وتبدأ عمل الخدمة عبر الأمر التالي حيث myapp هو اسم ملف إعدادات الخدمة بدون اللاحقة

systemctl start myapp

وفي حال أردت تشغيل هذه الخدمة تلقائيا عند إقلاع الخادم نفذ الأمر

systemctl enable myapp

 

  • 1
نشر

يوجد حل بدائي ولا يوصى به وهو استعمال nohup

nohup node server.js &

لكن لا أظن أن هناك أي سبب يدفعك لاستعماله كبديل للحلول الموصي بها الأخرى وأعتقد أنك على معرفة ب pm2 ولكن يوجد بدائل له ك forever

$ npm install forever -g
$ forever start app.js

أو يمكنك تشغيل الخادم في حاوية docker

FROM node:argon


RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app


COPY package.json /usr/src/app/
RUN npm install


COPY . /usr/src/app

EXPOSE 8080
CMD [ "npm", "start" ]
$ docker build -t <your username>/node-web-app .
$ docker run -p 49160:8080 -d <your username>/node-web-app

 

  • 1
نشر

يمكنك أيضاً استخدام npm كالتالي:

var daemon = require('daemon');

daemon.daemonize({
    stdout: './log.log'
  , stderr: './log.error.log'
  }
, './node.pid'
, function (err, pid) {
  if (err) {
    console.log('Error starting daemon: \n', err);
    return process.exit(-1);
  }
  console.log('Daemonized successfully with pid: ' + pid);

  // تطبيقك هنا
});

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...