أساسيات Nginx
أساسيات Nginx
Nginx (تُنطق "إنجين إكس") هو خادم الويب المفضّل في تقريباً كل شركة تقنية كبرى — إذ يعمل بوابةً أمامية لـ Netflix وCloudflare وDropbox وGitHub وأغلب المواقع الأعلى حركةً في العالم. إتقان Nginx من التثبيت حتى نموذج التهيئة الداخلي هو متطلب أساسي لكل دور DevOps إنتاجي. يغطي هذا الدرس النموذج الذهني الكامل: كيف تُشغّل Nginx، وكيف يُنظَّم ملف التهيئة، والمفهومان اللذان ستُهيّئهما مئات المرات في مسيرتك — كتل الـ server وكتل الـ location.
تثبيت Nginx
على أنظمة Ubuntu/Debian الحديثة، المسار الموصى به للتثبيت هو حزمة Nginx الرسمية المستقرة أو الحديثة من مستودع APT الخاص بـ Nginx، وليس الحزمة الافتراضية للتوزيعة. حزمة التوزيعة كثيراً ما تتأخر أشهراً في تصحيحات الأمان والميزات.
apt upgrade عن غير قصد التحديث إلى حزمة التوزيعة.تشريح ملف nginx.conf
يُدار سلوك Nginx بالكامل بلغة تهيئة منظَّمة وحيدة. الملف في /etc/nginx/nginx.conf هو الجذر. فهم نموذج السياق الطبقي هو الخطوة المفاهيمية الأهم.
تُنظَّم التهيئة في سياقات (كتل محددة بـ { })، وتنطبق التوجيهات داخل السياق على ذلك السياق وكل السياقات المتداخلة بداخله. أربعة سياقات ستستخدمها باستمرار:
main— السياق العام (بلا أقواس محيطة). يتحكم في عمليات العمال وملف PID وسجل الأخطاء وتحميل الوحدات. ينطبق على العملية بأكملها.events— ضبط نموذج معالجة الاتصال. التوجيه الرئيسي:worker_connections.http— كل ما يخص HTTP/HTTPS. يحتوي كتل الـ server ويضع إعدادات HTTP العامة (أنواع MIME، التسجيل، الضغط، المهلات الزمنية، تجمعات الـ upstream).server— مضيف افتراضي (مكافئ لـ VirtualHost في Apache). يقع داخلhttp. ستمتلك واحداً لكل نطاق (أو لكل منفذ).location— يطابق نمط مسار URL داخل كتلة server. هذا هو المكان الذي يعيش فيه معظم المنطق الخاص بكل مسار.
ملف nginx.conf الابتدائي الأنيق الذي تستخدمه الشركات الكبرى في الإنتاج هو أكثر نحافةً بكثير من الملف الافتراضي الذي يشحن به Nginx. ابدأ بهذا الهيكل:
worker_processes auto يجعل Nginx يُنشئ تحديداً عامل واحد لكل نواة CPU منطقية. كل عامل أحادي الخيط ويعالج آلاف الاتصالات بشكل غير متزامن باستخدام حلقة أحداث epoll (Linux) أو kqueue (macOS/BSD). هذا مختلف جوهرياً عن نموذج Apache الذي يخصص خيطاً لكل اتصال، وهو سبب استخدام Nginx جزءاً صغيراً من الذاكرة تحت التزامن العالي.كتل الـ Server — الاستضافة الافتراضية
كتلة الـ server هي وحدة الاستضافة الافتراضية في Nginx. كل كتلة تُجيب على الطلبات لمجموعة محددة من عنوان IP والمنفذ ورأس Host (أي server_name). عند وصول طلب، يختار Nginx كتلة الـ server الصحيحة وفق خوارزمية مطابقة محددة:
- مطابقة عنوان
listenوالمنفذ تحديداً. - من بين الكتل المطابقة، إيجاد واحدة يطابق
server_nameفيها رأسHostتحديداً. - إن لم توجد مطابقة تحديدية، التحقق من وجود wildcard بادئ (
*.example.com)، ثم wildcard لاحق. - إن لم تُوجد مطابقة بعد، فحص أسماء server المعتمدة على regex بترتيب التعريف.
- الرجوع إلى
default_serverعلى ذلك المنفذ.
في الإنتاج ستُعلّم دائماً صراحةً إحدى كتل الـ server بـ default_server على المنفذ 80 و443، وتلك الكتلة يجب أن تُعيد 444 (Nginx يُغلق الاتصال دون استجابة) لأسماء المضيفين غير المعروفة — هذا يمنع الماسحين من تحديد بصمة الخادم الخلفي بضربه عبر الـ IP.
default_server. بدونها، أول كتلة server مُعرَّفة على منفذ تصبح الافتراضية الضمنية. هذا يعني أن ماسحاً يضرب خادمك عبر IP سيحصل على استجابة من مضيفك الافتراضي الأول — مما قد يُسرّب اسم نطاقه أو شهادة TLS أو تقنية الخادم الخلفي. عرّف دائماً catch-all صريحاً بـ return 444.كتل الـ Location — توجيه URL
داخل كتلة server، تُوجّه كتل location الطلبات إلى معالجات مختلفة بناءً على مسار URL. يستخدم Nginx خوارزمية أولوية محددة لاختيار كتلة الـ location الفائزة — الخطأ في هذا الفهم هو أحد أكثر أخطاء التهيئة الإنتاجية شيوعاً.
معدّلات كتلة location (بترتيب الأولوية):
= /exact— مطابقة سلسلة تحديدية؛ أعلى أولوية، تُوقف البحث فوراً.^~ /prefix— مطابقة بادئة تفوز على أي regex؛ إن تطابقت، تُوقف البحث عن regex.~ pattern— regex حساس لحالة الأحرف (أول تطابق يفوز بين كتل regex).~* pattern— regex غير حساس لحالة الأحرف./prefix— أطول مطابقة بادئة (بلا معدّل)؛ أقل أولوية، تُستخدم فقط إن لم يتطابق أي regex.
try_files: التوجيه try_files $uri $uri/ /index.php?$query_string هو أساس كل نشر لـ Laravel أو Symfony أو تطبيق أحادي الصفحة. يتحقق Nginx أولاً إن كان URI يُخطط إلى ملف حقيقي، ثم مجلد حقيقي، ولا يقع في front-controller PHP إلا حين لا يوجد أيٌّ منهما. هذا يعني أن الملفات الثابتة تُخدَّم بكود C الخاص بـ Nginx مباشرةً — PHP لا تستيقظ أبداً لطلب .js أو .css.اختبار التهيئة وإعادة التحميل
اختبر التهيئة دائماً قبل تطبيقها. خطأ نحوي في nginx.conf حي يجعل nginx -s reload يرفض التغيير — لكن خطأً يُدخَل بينما العملية متوقفة سيمنع الإطلاق كلياً.
nginx -t كفحص مسبق قبل أن يُنفّذ الـ pipeline أي شيء مدمّر. فشل اختبار التهيئة يجب أن يُوقف النشر. في شركات كـ Cloudflare، تمر تغييرات تهيئة Nginx بنفس pipeline مراجعة الكود والتحقق الآلي كالكود التطبيقي — تهيئة سيئة تصل إلى الإنتاج هي حادثة P0.كيف يختار Nginx كتلة Server وLocation: تتبع طلب
تتبع طلب واحد عبر شجرة قرار Nginx يبني النموذج الذهني الذي تحتاجه لتصحيح مشاكل الإنتاج بسرعة. لطلب https://example.com/api/users?page=2:
- يصل اتصال TCP على المنفذ 443. ينظر Nginx في كل كتل server بـ
listen 443. - يتم مصافحة TLS؛ SNI تُوفر اسم المضيف
example.com. - يمسح Nginx توجيهات
server_name: المطابقة التحديدية تفوز على wildcard. - داخل كتلة server المختارة، يُقيّم Nginx كل كتل location. المسار هو
/api/users. لا يوجد تطابق تحديدي (= /api/users)، ولا^~بادئة، ولا regex مطابق. أطول مطابقة بادئة هي/api/. - كتلة
/api/تُوكّل إلى خادم التطبيق upstream. - يضع Nginx رؤوس الوكيل (
X-Forwarded-For،X-Real-IP،Host) ويُعيد توجيه الطلب عبر اتصال TCP داخلي أو Unix socket. - تعود استجابة upstream؛ يبثّها Nginx للعميل ويسجّل الطلب.
proxy_pass: proxy_pass http://backend:3000/ (بشرطة مائلة لاحقة) يحذف بادئة location من URI قبل الإعادة. proxy_pass http://backend:3000 (بدون) يحتفظ بها. طلب /api/users مع location /api/ يذهب إلى http://backend:3000/users (بشرطة) أو http://backend:3000/api/users (بدون شرطة). هذا التعارض يُسبب أخطاء 404 يصعب تحديدها بدون قراءة سجلات وصول الـ upstream.متغيرات رئيسية وتوجيهات مضمّنة
يكشف Nginx عشرات المتغيرات في سياق location. أكثرها استخداماً:
$uri— URI الطلب الحالي المُعيَّر (بلا سلسلة استعلام).$args/$query_string— جزء سلسلة الاستعلام.$request_uri— URI الأصلي الكامل مع سلسلة الاستعلام (غير مُعيَّر).$remote_addr— IP العميل (لكن هذا IP موازن الحمل خلف وكيل؛ استخدم$http_x_forwarded_forبعد التحقق من الثقة).$host— قيمة رأسHost، أو اسم الخادم إن كان غائباً.$scheme—httpأوhttps.$document_root— قيمة توجيهrootلكتلة location الحالية.
بنهاية هذا الدرس يجب أن تستطيع تثبيت Nginx من المستودع الرسمي، وقراءة وكتابة nginx.conf منظَّم جيداً، وإنشاء مضيفات افتراضية بكتل server مناسبة، وتوجيه الطلبات عبر كتل location باستخدام المعدّل الصحيح لكل حالة استخدام. الدرس التالي يبني على هذا لتغطية خدمة الملفات الثابتة وتكامل PHP-FPM وخلفيات التطبيقات بالتفصيل.