الضبط والاستكشاف وإصلاح الأعطال
الضبط والاستكشاف وإصلاح الأعطال
يقدّم Nginx المُثبَّت بصورة صحيحة الطلبات. أما Nginx المُضبَّط بصورة صحيحة فيقدّم عشرة أضعاف ذلك دون عناء — وحين يحدث خطأ، تخبرك سجلاته بالسبب الحرفي في ثوانٍ. يتناول هذا الدرس ثلاثة موضوعات مترابطة يجب أن يتقنها كل مهندس إنتاج: حدود العمليات والاتصالات، ومساحة واصفات الملفات، والتحليل المنهجي للسجلات.
عمليات العمال واتصالاتهم
يعتمد Nginx بنية رئيسي + عمال. تمتلك العملية الرئيسية مقابس الاستماع وتُعيد تحميل الإعدادات؛ أما عمليات العمال فتتولى عمليات الإدخال/الإخراج الفعلية — قراءة الطلبات، واستدعاء الخوادم الأمامية، وإرسال الاستجابات. العمال أحادية الخيوط وقائمة على الأحداث، وبذلك يمكنها التعامل مع آلاف الاتصالات المتزامنة دون خيوط أو أقفال.
التوجيهان اللذان يحددان الطاقة القصوى لخادمك يقعان في nginx.conf على المستوى الأعلى وفي كتلة events:
worker_connections؟ يستهلك كل اتصال مفتوح واصف ملف واحدًا تقريبًا وقدرًا صغيرًا من الذاكرة (8–16 كيلوبايت). الحد الآمن هو: worker_connections = (واصفات_الملفات_المتاحة / worker_processes) * 0.9. على خادم بـ 65 535 واصفًا و4 عمال يعطيك ذلك نحو 14 700 لكل عامل — أعلى بكثير من القيمة الافتراضية 1024. ارفعها إلى 4096 أو 8192 للواجهات الأمامية كثيفة الحركة.
واصفات الملفات: الاختناق الخفي
كل مقبس أو ملف أو أنبوب مفتوح يُحتسب ضمن حد واصفات الملفات (FD) لنظام التشغيل. تحت الحمل الثقيل، يُسجّل الخادم غير المُهيَّأ الخطأ too many open files ويبدأ في رفض الاتصالات — وهو فشل حاد يبدو للمستخدمين على هيئة مهل عشوائية.
ثمة حدّان يجب رفعهما معًا:
- على مستوى نظام التشغيل (عموم النظام):
/proc/sys/fs/file-max— السقف المطلق لجميع العمليات على الجهاز. - على مستوى العملية:
ulimit -nلعملية عامل Nginx، يُتحكم فيه عبرworker_rlimit_nofileفيnginx.conf.
LimitNOFILE الخاص به. تحقق بـ systemctl show nginx | grep LimitNOFILE. لرفعه، أنشئ ملف تعديل: systemctl edit nginx، أضف [Service] / LimitNOFILE=65535، ثم systemctl daemon-reload && systemctl reload nginx. يجب ضبط كل من حد systemd وworker_rlimit_nofile — فهما مفتاحان مستقلان.
قراءة سجلات الوصول في Nginx
سجل الوصول هو نافذتك الفورية على حركة الإنتاج. يظهر هنا كل طلب عالجه Nginx. يلتقط تنسيق combined الافتراضي عنوان IP والطابع الزمني وأسلوب HTTP وعنوان URI ورمز الحالة والبايتات المُرسلة والمرجع ووكيل المستخدم — وهو كافٍ لإعادة بناء ما حدث بالضبط.
$request_time و$upstream_response_time إلى تنسيق سجلك. لا يتضمنهما التنسيق الافتراضي. بدونهما لا يمكنك التمييز بين "كان Nginx بطيئًا" (ارتفاع $request_time، انخفاض $upstream_response_time) و"كانت الخلفية بطيئة" (ارتفاع كليهما). أضف تنسيق سجل مخصصًا في nginx.conf واستخدمه في جميع كتل server للإنتاج:
log_format timed_combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time urt=$upstream_response_time';
قراءة سجلات الأخطاء في Nginx
تلتقط سجلات الأخطاء كل ما عجز Nginx عن التعامل معه بسلاسة: مهل الخادم الأمامي، وتعطل العمال، وأخطاء الصلاحيات، وأخطاء الإعدادات المكتشفة وقت التشغيل، واستنزاف الموارد. المستوى الافتراضي هو error؛ يمكنك خفضه مؤقتًا إلى warn أو info للتشخيص، لكن لا تُبقِ على debug في الإنتاج أبدًا — إذ يكتب سطرًا لكل بايت ويُشبع القرص.
تجميع الصورة الكاملة: قائمة ضبط للإنتاج
عند تجهيز خادم للإنتاج أو تشخيص انتكاسة في الأداء، اتبع هذه الخطوات بالترتيب:
- شغّل
nprocوتأكد من ضبطworker_processes auto;— أو حدده صراحةً. - تحقق من
worker_connections: لوكيل عكسي أمامي يخدم أكثر من 10 آلاف مستخدم متزامن، 4096–8192 نقطة انطلاق جيدة. - تأكد أن
worker_rlimit_nofileيساوي أو يتجاوزworker_connections * 2(اتصال للعميل + اتصال للخادم الأمامي). - تحقق من توافق
LimitNOFILEفي systemd. - أضف
$request_timeو$upstream_response_timeإلى تنسيق السجل قبل الإطلاق — إضافتهما بعد وقوع الحادثة متأخر جدًا. - اضبط تدوير السجلات مع
logrotateلمنع سجلات الوصول من استنزاف مساحة القرص على مدار أسابيع.
nginx -T (T كبيرة) لتفريغ الإعداد الكامل المُحلَّل. هذه هي الطريقة الأكثر فاعلية للتحقق من أن include أو كتلة server أو توجيهًا ما نشطٌ فعلًا. يُؤكد الناتج أيضًا آخر عملية فحص بناء جملة بـ nginx -t بعرض ما حمّله Nginx فعلًا في الذاكرة.