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

تعد إدراة السجلات جزءًا أساسيًا من إدارة الخوادم، ولتفادي ظهور المشاكل في خادم الويب، ينصح بإعداد السجلات Logging لتوثيق الأحداث والأنشطة المهمة على الخادم إذ إن معلومات السجلات الموجودة على خادمك تزوّدك بالبيانات اللازمة لاستكشاف الأخطاء وإصلاحها وتقييم المشاكل عند ظهورها.

سنلقي في هذا المقال نظرةً على إمكانات سجلات خادم Nginx ونتعلم كيفية ضبطها لتخدم احتياجاتك على أفضل وجه، وذلك باستخدام خادم افتراضي خاص VPS يعمل بنظام تشغيل أوبنتو Ubuntu 22.04، ولكن يمكنك استخدام أي توزيعة حديثة لنظام لينكس.

المتطلبات:

لإكمال هذا المقال بنجاح، ستحتاج إلى تجهيز بيئة العمل المكونة من:

  • خادم أوبنتو 22.04 يحتوي على مستخدم غير جذري non-root user ذي صلاحيات sudo و مثبت عليه جدار حماية. يمكنك اعداده بالعودة إلى دليل إعداد الخادم الأولي

  • تثبيت Nginx على خادمك. يمكنك الاستعانة بالمقال التالي لتثبيته على خادمك. أصبحت جاهزًا لبدء العمل بعد أن ثبّتَ Nginx على خادم أوبنتو 22.04.

فهم آلية عمل سجل الأخطاء Error_log

يستخدم خادم Nginx عدة سجلات للتحكم في سجلات النظام. ويسمى السجل المستخدم في الوحدة الأساسية بسجل الأخطاء أو Error_log

صياغة سجل الأخطاء Error_log

يُستخدم سجل الأخطاء Error_log لتسجيل رسائل الخطأ العادية. إن استخدمت خادم أباتشي Apache ستجد أن هذا السجل مشابه لسجل أخطاء أباتشي ErrorLog. يعتمد سجل الأخطاء Error_log على الصياغة التالية:

/etc/nginx/nginx.conf
error_log log_file log_level

يحدد log_file الملف الذي ستُحفظ فيه السجلات، أما log_level فيحدد أدنى مستوى تسجيل ترغب في تسجيله.

مستويات التسجيل

يمكن ضبط سجل الأخطاء Error_log لتسجيل معلومات وفق ما تحتاجه. أما مستوى التسجيل فهو أحد المستويات التالية:

  • emerg: يظهر في حالات الطوارئ حيث يكون النظام في حالة غير مستقرة
  • alert: يظهر في المواقف الخطيرة التي تتطلب اتخاذ إجراء فورًا
  • crit: يظهر عند حدوث المشاكل المهمة التي تحتاج إلى معالجة
  • error: يظهر عند حدوث خطأ ما وفشل عملية ما
  • warn: يظهر عند حدوث أمر غير مألوف، لكنه لا يدعو للقلق
  • notice: يظهر عند حدوث أمر عادي، لكن يجب التنبيه عليه
  • info: رسالة توضيحية
  • debug: معلومات عن تصحيح الأخطاء تفيد في تحديد مكان حدوث المشكلة

تعتبر المستويات الأعلى في القائمة السابقة ذات أولوية أعلى، فإذا حددت مستوىً ما، فإن السجل سيلتقط هذا المستوى، والمستويات الأعلى منه. على سبيل المثال، إذا حددت المستوى error فإن السجل سوف يجلب الرسائل التالية errorو crit و alert و emerg، وتجد مثالًا على هذا السجل في ملف الإعدادات الرئيسي.استخدم محرر النصوص الذي تفضله للوصول إلى ملف الإعدادات التالي، سوف نستخدم في مثالنا محرر النصوص نانو nano:

sudo nano /etc/nginx/nginx.conf

اذهب إلى أسفل الملف، إلى قسم إعدادات التسجيل Logging Settings # ولاحظ السجلات التالية:

/etc/nginx/nginx.conf
. . .
##
# Logging Settings
##

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
. . .

إن أردت بأن لا يسجل error_log شيئًا، فعليك إرسال خرجه إلى /dev/null:

. . .
/etc/nginx/nginx.conf
error_log /dev/null crit;
. . .

أما سجل access_log فسوف نناقشه في فقرة تالية.

فهم آلية عمل سجل HttpLogModule

يُعد سجل error_log جزءًا من الوحدة الأساسية core module، أما سجل access_log فيُعد جزءًا من وحدة HttpLogModule التي تزودنا بإمكانية تخصيص السجلات. كما توجد بضع سجلات أخرى في هذه الوحدة تساعد في إعداد السجلات المخصصة custom logs.

سجل log_format

يُستخدم سجل log_format لوصف التنسيق المستخدم في السجلات باستخدام النص العادي والمتغيرات. ثمة تنسيق جاهز يأتي مع Nginx ويسمى التنسيق المدمج combined، وهو تنسيق شائع مُستَخدم في عدة خوادم. إليك مثالًا على التنسيق المدمج إن لم يكن مُعَّرفًا مسبقًا واضطررت إلى تعريفه مع سجل log_format:

/etc/nginx/nginx.conf
log_format combined '$remote_addr - $remote_user [$time_local]  '
            '"$request" $status $body_bytes_sent '
            '"$http_referer" "$http_user_agent"';

لاحظ أن التعريف يتضمن عدة أسطر وينتهي عند الفاصلة المنقوطة (;). أما الأسطر التي تبدأ بالعلامة ($) فهي تعبر عن المتغيرات، وتُفسَر المحارف التالية - ، [ ، ] حرفيًا. أما الصياغة العامة للسجل فهي كالتالي:

/etc/nginx/nginx.conf
log_format format_name string_describing_formatting;

يمكنك استخدام المتغيرات التي تدعمها الوحدة الأساسية وذلك لصياغة سلاسل تسجيل logging strings خاصة.

فهم آلية عمل سجل access_log

يستخدم سجل access_log صياغة مشابهة لصياغة سجل الأخطاء Error_log، لكنه أكثر مرونة، ولذلك يستخدم لضبط التسجيل المخصص Custom logging. الصياغة العامة لسجل access_log هي كالتالي:

/etc/nginx/nginx.conf
access_log /path/to/log/location [ format_of_log buffer_size ];

إن القيمة الافتراضية لسجل access_log هي التنسيق المدمج combined الذي تحدثنا عنه سابقًا في سجل log_format، لكن يمكنك استخدام أي تنسيق معَرَّف في سجل log_format. قمة المخزّن المؤقت Buffer هي الحجم الأعظمي للبيانات التي يحتفظ بها خادم Nginx قبل أن ينقلها إلى السجل. ويمكنك أن تضغط حجم ملف السجل بواسطة إضافة المحدد gzip ضمن تعريف السجل، كما يلي:

/etc/nginx/nginx.conf
access_log /path/to/log/location format_of_log gzip;

وبخلاف سجل الأخطاء Error_log، إن لم تُرِد التسجيل فبإمكانك إلغاؤه من ملف الإعدادات كالتالي، ولا حاجة لإرساله إلى /dev/null:

/etc/nginx/nginx.conf
. . .
##
# Logging Settings
##

access_log off;
error_log /var/log/nginx/error.log;

. . .

تدوير السجلات

مع ازدياد ملفات السجل، يصبح من الضروري إدارة آليات التسجيل لتجنب امتلاء مساحة القرص، وتدوير السجلات Log rotation هي عملية تبديل ملفات السجل وأرشفة الملفات القديمة لمدة زمنية محددة.

لا يوفر Nginx أدوات لإدارة ملفات السجلات، لكنه يحتوي على آليات للمساعدة في تدوير السجلات.

تدوير السجلات يدويًا

يمكنك إنشاء سكربت لتدوير السجلات يدويًا، على سبيل المثال، لنقل ملف السجل الحالي إلى ملف جديد وأرشفته، يمكنك إتباع الخطة التالية: أعد تسمية أحدث سجل بإضافة اللاحقة .0 إلى اسمه، ثم أعد تسمية الملفات القديمة بإضافة اللاحقة .1 وهكذا على التوالي:

mv /path/to/access.log /path/to/access.log.0

إن الأمر الذي يدوّر ملفات السجل هو التالي

kill -USR1 `cat /var/run/nginx.pid`

لا ينهي هذا الأمر عمليات خادم Nginx، لكنه يرسل لها إشارةً لتعيد تحميل ملفات السجل. سيؤدي هذا إلى تسجيل الطلبات الجديدة في ملف السجل المحدَّث:

kill -USR1 `cat /var/run/nginx.pid`

يخزّن خادم Nginx معرف العملية الرئيسة PID في الملف /var/run/nginx.pid الموجود أعلى ملف الإعدادات /etc/nginx/nginx.conf في السطر الذي يبدأ بكلمة pid:

sudo nano /etc/nginx/nginx.conf
/etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
...

بعد تدوير السجلات، نفّذ الأمر sleep 1 كي تكتمل عملية النقل. كما يمكنك بعدها أن تضغط الملفات القديمة في ملف بصيغة .zip أو أن تجري العملية التي ترغب بها:

sleep 1
[ post-rotation processing of old log file ]

تدوير السجلات باستخدام برنامج logrotate

يُستخدم برنامج logrotate لتدوير السجلات، وهو برنامج يُنَزّل تلقائيًا على نظام أوبنتو، كما يوجد سكربت مخصص لبرنامج logrotate على خادم nginx العامل بنظام أوبنتو. استخدم محرر النصوص الذي تفضله للوصول إلى ملف الإعدادات التالي، سوف نستخدم في مثالنا محرر النصوص nano :

sudo nano /etc/logrotate.d/nginx

عليك تذكر أن السطر الأول من الملف يحدد الموقع الذي ستُطَبق فيه أوامر الأسطر اللاحقة، إن غيّرت موقع تسجيل الملفات في ملف إعدادات Nginx، أما بقية الملف فيُشير إلى أن السجلات ستُدَور يوميًا وسيُحتَفظ ب 52 سجل قديم. لاحظ أن قسم postrotate يحتوي على أمر مشابه لآليات التدوير اليدوية التي طبقناها سابقًا:

/etc/logrotate.d/nginx
. . .
postrotate
    [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
. . .

يوجه القسم السابق Nginx إلى إعادة تحميل ملفات السجل عند اكتمال التدوير.

خاتمة

توفر إدارة السجلات وضبطها على نحو صحيح الوقت والجهد في حال حدوث مشكلة في الخادم، إذ إن الوصول إلى المعلومات التي تساعدك على تشخيص المشكلة يعد عاملًا مهمًا في حل المشكلة بسلاسة وسهولة. كما أن الاطلاع الدوري على سجلات الخادم يُعدّ أمرًا مهمًا لضمان عمل الموقع على نحو صحيح وعدم كشف أي بيانات حساسة. تعرفنا في هذا المقال على مقدمة عن التعامل مع السجلات في خادم Nginx يعمل بنظام تشغيل أوبنتو، كما يمكنك قراءة المزيد حول كشف المشاكل الشائعة للمواقع على خادوم لينكس. وللحصول على الدعم والمساعدة، أضف سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب.

ترجمة -وبتصرف- للمقال How To Configure Logging and Log Rotation in Nginx on an Ubuntu VPS لكاتبه Justin Ellingwood.

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



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

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

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.


×
×
  • أضف...