تعد إدراة السجلات جزءًا أساسيًا من إدارة الخوادم، ولتفادي ظهور المشاكل في خادم الويب، ينصح بإعداد السجلات 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.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.