يمكِن لـِ Nginx، أحد أكثر خواديم الويب انتشارًا؛ التّعاملُ بنجاح مع عملاء عدّة يتّصلون بالتّزامن، كما يُمكنه العمل بوصفه خادوم ويب، خادوم بريد أو وسيطًا عكسيًّا Reverse proxy.
سنتطرّق في هذا الدّليل إلى بعض كواليس الآليّة الّتي تحدّد كيف يتعامل Nginx مع طلبات العملاء Client requests. يُساعد فهمُ هذه الآليّة في معرفة كيف تعمل إعدادات الكتلة (Block configurations) في خادوم ويب Nginx وخصوصًا كتلتَيْ Server (الخادوم) وLocation (الموقع). كما أنّه يجعل من تعامل Nginx مع طلبات العملاء أكثر قابليّةً للتّوقّع والتخمين.
إعدادات كتلة Nginx
يقسّم Nginx إعداداتِ تقديم المحتوى إلى كُتل تنتظِم في بنية شجريّة Hierarchical. يبدأ Nginx عندما يتلقّى طلبًا إجراءاتِ تقرير كُتَل الإعداد الّتي يجب استخدامُها للتّعامل مع الطّلب. سنتحدّث في هذا الدّليل عن آليّة التّقرير هذه.
يتحدّث الجزء الأوّل من هذا الدّليل عن كتلة Server، أمّا الثّاني فيتناول كتلة Location.
تعرّف كتلة Server، وهي مجموعة فرعيّة من إعدادات Nginx، خادومًا افتراضيًّا يتعامل مع طلباتٍ من نوع محدَّد. يعرّف مدراء الخواديم عادةً كتلَ خادوم عدّة ثمّ يضبطونها للتّعامل مع الطّلبات حسب اسم النّطاق Domain name، أو المنفذ Port، أو عنوان IP الذي يأتي عبره الطّلب.
تقبع كتلة Location ضمن كتلة من نوع Server (كتلة خادوم)، وتُستخدَم لتعريف الكيفيّة الّتي سيتعامل بها خادوم ويب Nginx مع الطّلبات على موارد الخادوم والمعرّفات الكليّة لهذه الموارد Universal Resource Identifier, URI. يُمكن أن تُقسَّم مساحة المعرّفات الكليّة للموارد URIs بالطّريقة الّتي يراها المدير عن طريق استخدام كتل Location، فنموذج الكتل مرن للغاية.
كيف يقرّر Nginx كتلة Server الّتي ستتعامل مع الطّلب؟
يحتاج Nginx، ما دام يسمح بتعريف كُتَل Server عدّة تعمل على أنّها خواديم ويب افتراضيّة متفرّقة، يحتاج لوسيلة يعرف بها كتلة Server الّتي ستتولّى تلبيّة الطّلب.
يُعرّف خادوم ويب Nginx نظامَ فحص يُستخدَم للعثور على كتلة Server الأكثر مُطابقةً للطّلب. يهتم Nginx أثناء عمليّة الفحص بتعليمتَيْن Directives على مستوى كتلة الخادوم، وهما listen
وserver_name
.
1- تحليل تعليمة listen بحثًا عن تطابقات ممكنة
ينظُر Nginx أوّلًا إلى عنوان IP الطّلب ومنفَذه؛ ثمّ يبحث عن تطابق بين هاتين المعلومتيْن مع محتوى تعليمة listen
في كلّ كتلة خادوم. يُنشئ Nginx إثر هذه الخطوة قائمةً بكُتل الخواديم الّتي يُمكن أن تلبّي الطّلب.
تعرّف تعليمة listen
عنوان IP والمنفَذ الّذيْن ستُجيب كتلة الخادوم الطّلبات الآتيّة منهما. إذا لم تتضمّن كتلة الخادوم تعليمة listen
فإنّ المعطيات 0.0.0.0:80
تُمنح للتّعليمة بشكل افتراضيّ (أو 0.0.0.0:8080
إذا كان مستخدم عاديّ غير المستخدم الجذر هو من يشغّل خادوم ويب Nginx). تسمح هذه المعطيات لكتلة الخادوم بالإجابة عن طلبات عبر المنفذ 80
على كلّ الواجهات Interfaces؛ إلّا أنّ المعطيات الافتراضيّة لا تمثّل ثقلًا كبيرًا في عمليّة اختيّار الخادوم.
يُمكن ضبطُ تعليمة listen
:
- بذكر عنوان IP ومنفَذ.
- بذكر عنوان IP فقط؛ في هذه الحالة يُستخدم المنفذ الافتراضيّ
80
. - بذكر منفَذ فقط؛ في هذه الحالة تستجيب لأي طلب يأتي عبر هذا المنفذ على كلّ الواجهات.
- بتحديد مسار إلى مقبس يونكس Unix socket.
سيقتصر تأثير الخيّار الأخير - غالبًا - على الطّلبات الّتي تمرّر بين مجموعة خواديم.
يقرّر Nginx كتلة الخادوم الّتي سيُرسل إليها الطّلب اعتمادًا على خصوصيّة تعليمة listen
وذلك وفقًا للقواعد التّاليّة:
تُكمَّل الأجزاء غير المكتملة من تعليمة
listen
بالقيّم الافتراضيّة. الأمثلة التّاليّة توضّح كيف تُكمّل تعليمةlisten
:- كتلة خادوم لا توجد بها تعليمة
listen
ستستعمل القيمة0.0.0.0:80
. - كتلة خادوم مضبوطة على العنوان
111.111.111.111
ولا تعرّف منفذًا تستعمل القيمة111.111.111.111:80
. - كتلة خادوم مضبوطة على المنفذ
8888
دون عنوان IP، تستخدم القيمة0.0.0.0:8888
.
- كتلة خادوم لا توجد بها تعليمة
يكوّن Nginx قائمة بكتل الخواديم الّتي تُطابق الطّلب، وبالتحديد عنوان IP والمنفذ. يعني هذا أنّ أيّة كتلة تستخدم عنوان
0.0.0.0
(مطابقة كلّ الواجهات) لن تُختار إن وُجدت كتلة تستخدم عناوين IP تُطابق الطّلب. في جميع الحالات يجب أن تُطابقَ الكتلة المنفذ بالضّبط.إذا وُجدت كتلة واحدة تُطابق الطّلب، ولم توجد أخرى بنفس المستوى من المُطابقة، فستُستخدَم للإجابة على الطّلب؛ أمّا إذا وُجدت عدّة كتل مع نفس المستوى من المطابقة فإنّ Nginx يبدأ بالنّظر في قيمة تعليمة
server_name
بالنّسبة لكلّ كتلة خادوم.
يجب الانتباه إلى أنّ Nginx لن ينظُر في قيمة تعليمة server_name
إلّا إذا احتاج للتّفريق بين كتل خواديم لديها تعليمة listen
بنفس المستوى من المطابقة للطّلب. على سبيل المثال؛ إذا كان example.com
مُستضافًا على المنفذ 80
من 192.168.1.10
فـإنّ كتلة الخادوم الأولى فقط في المثال أدناه، هيّ من سيستجيب للطّلبات الموّجّهة إلى example.com
، على الرّغم من أنّ تعليمة server_name
في الكتلة الثّانيّة تحوي القيمة example.com
.
server { listen 192.168.1.10; . . . } server { listen 80; server_name example.com; . . . }
أمّا إذا وُجِدت أكثر من كتلة خادوم تُطابق بنفس المستوى من التّحديد الطّلب؛ فإنّ الخطوة التّاليّة هي فحص محتوى تعليمة server_name
.
2- تحليل تعليمة server_name للاختيّار بين التّطابقات
الخطوة المواليّة، في حال وجود كتل خواديم عدّة بنفس المستوى من التّحديد توافق الطّلب، هي تحليل تعليمة server_name
. يتحقّق Nginx من ترويسة Header في الطّلب تُسمّى Host
(المستضيف). تحوي ترويسة Host
اسم النّطاق أو عنوان IP الّذي يُريد العميل الوصول إليه.
يُحاول Nginx إيجاد كتلة الخادوم الأكثر مطابقةً لترويسة Host
من بين كتل الخواديم المتبقيّة بعد تحليل تعليمة listen
. يتبع Nginx الوصفة التّاليّة لإيجاد الكتلة المناسبة:
يبحث خادوم الويب عن كتلة خادوم تكون قيمة تعليمة
server_name
مطابقةً تمامًا لترويسةHost
الموجودة في الطّلب. إذا عثر على تعليمةserver_name
يتحقّق فيها الشّرط فإنّ الكتلة المرتبطة بها هي الّتي تُستخدَم. إذا كانت هناك عدّة تعليمات مطابقة فإنّ أوّل كتلة خادوم هيّ الّتي ستُختار.إن لم يعثُر على مطابقة تامّة يبحث Nginx عن كتلة خادوم تبدأ قيمة تعليمة
server_name
فيها بحرف بَدَل Wildcard (يُشار إليه بعلامة*
في بداية الاسم) بحيث توافق التّعليمة ترويسة المستضيف في الطّلب. إذا عثر على تعليمةserver_name
يتحقّق فيها الشّرط فإنّ الكتلة المرتبطة بها هي الّتي تُستخدَم. أمّا إذا كانت هناك عدّة تعليمات فإنّ التّعليمة ذات التّطابق الأطول (عدد الأحرف) هيّ الّتي ستُختار.إن لم يُعثُر على مُطابقة باستخدام حرف بدل في بداية قيمة التّعليمة فإنّ Nginx يبحث عن تعليمة
server_name
تنتهي بحرف بدل (يُشار إليه بعلامة*
في نهاية الاسم) بحيث توافق التّعليمة ترويسة المستضيف في الطّلب. إذا عثر على تعليمةserver_name
يتحقّق فيها الشّرط فإنّ الكتلة المرتبطة بها هي الّتي تُستخدَم. أمّا إذا كانت هناك عدّة تعليمات فإنّ التّعليمة ذات التّطابق الأطول (عدد الأحرف) هيّ الّتي ستُختار.إن لم يعثُر Nginx على مُطابقة باستخدام حرف بدل في نهاية قيمة التّعليمة فإنّه يبحث عن كتلة خادوم تعرّف تعليمة
server_name
عن طريق تعبير نمطيّ Regular expression (يُشار إليه بعلامة~
قبل الاسم). يستخدِم Nginx أوّل كتلة خادوم يُوافق تعبير تعليمةserver_name
النّمطيّ فيها ترويسة المستضيف.إن لم يوجد تطابُق باستخدام التّعبير النّمطيّ يختار Nginx كتلة الخادوم الافتراضّية لعنوان IP والمنفَذ المستخدَم.
يوجد لكلّ ثنائيّ عنوان IP/منفذ كتلة خادوم مبدئيّة Default تُستخدَم إن لم تؤدِّ الآليّة الموصوفة أعلاه للعثور على كتلة خادوم. كتلة الثّنائيّ عنوان IP/منفذ المبدئيّة هيّ الكتلة الأولى في الإعداد أو تلك الّتي تحوي خيّار default_server
ضمن تعليمة listen
(يغلِب مفعول خيّار default_server
، إذا كان موجودًا، مفعول الكتلة الأولى). لا يُمكن أن يوجد خيّار default_server
في أكثر من مرّة بالنّسبة لكلّ عنوان IP/منفذ.
نشرح في الفقرة التّاليّة كلّ نقطة من آليّة العمل أعلاه.
3- أمثلة
إذا وجدت تعليمة server_name
تُطابق تمامًا ترويسة المستضيف فسيقع على الكتلة المرتبطة بها الاختيّار للإجابة على الطّلب.
إذا كانت ترويسة Host
الموجودة في الطّلب تحوي host1.example.com
فإنّ الخادوم الثّاني في المثال أدناه هو الّذي سيقع عليه الاختيّار:
server { listen 80; server_name *.example.com; . . . } server { listen 80; server_name host1.example.com; . . . }
إن لم يوجد تطابق كامل يبحثُ Nginx عن تعليمة server_name
تبدأ بحرف بَدَل ويتحقّق من توافقها مع المستضيف في الطّلب. يختار خادوم الويب أطول قيمة في server_name
من بين تلك الّتي تُطابق الطّلب.
في المثال التّالي يختار Nginx كتلة الخادوم الثّانيّة إذا كان العميل يطلُب المستضيف www.example.org
:
server { listen 80; server_name www.example.*; . . . } server { listen 80; server_name *.example.org; . . . } server { listen 80; server_name *.org; . . . }
ملحوظة: كلّ من الكتلة الثّانيّة والثّالثة توافق المستضيف في الطّلب (www.example.org
)؛ إلّا أنّ قيمة server_name
في الكتلة الثّانيّة أطول. تُقرأ قيمة الكتلة الثّانيّة في المثال أعلاه “جميع المستضيفات الّتي تنتهي بexample.org.
أمّا الكتلة الثّالثّة فتقرأ قيمة server_name
“جميع المستضيفات الّتي تنتهي بorg.
. يُمكن ملاحظة أنّ قيمة server_name
في كتلة الخادوم الثّانيّة أكثر تحديدًا.
إذا لم يجد Nginx كتلة الخادوم المناسبة في قيّم server_name
الّتي تبدأ بحرف بدل، فإنّه يبحث في كتل الخادوم الّتي تنتهي قيّم server_name
فيها بحرف بدل. مثل ما يحدُث في الحالة السّابقة، يختار خادوم الويب أطول قيمة في server_name
من بين تلك الّتي تُطابق الطّلب.
إذا كان المستضيف المحدّد في الطّلب هو www.example.com
فإنّ Nginx سيختار، في المثال التّالي، كتلة الخادوم الثّالثة.
server { listen 80; server_name host1.example.com; . . . } server { listen 80; server_name example.com; . . . } server { listen 80; server_name www.example.*; . . . }
ملحوظة: تُقرأ قيمة server_name
في كتلة الخادوم الثّالثة في المثال أعلاه “جميع المستضيفات الّتي تبدأ ب.www.example
.
مجدّدًا، إذا لم يعثُر Nginx على تطابق باستخدام أحرف البدل في نهاية قيمة التّعليمة فإنّه سينتقل إلى محاولة مطابقة قيمة Host
في ترويسة الطّلب بقيّم server_name
المعرّفة بتعابير نمطيّة ويختار أوّل كتلة خادوم تُطابق فيها قيمة server_name
قيمة Host
.
إذا كانت قيمة Host
هي www.example.com
فإنّ Nginx سيختار، في المثال التّالي، كتلة الخادوم الثّالقة للإجابة على الطّلب:
server { listen 80; server_name example.com; . . . } server { listen 80; server_name ~^(www|host1).*\.example\.com$; . . . } server { listen 80; server_name ~^(subdomain|set|www|host1).*\.example\.com$; . . . }
ملحوظة: يُقرأ التّعبير النّمطيّ أعلاه “يبدأ اسم المستضيف بإحدى الكلمات التّاليّة set، www، host1 أو subdomain؛ قد يتبعها حرف أو عدد غير محدّد من الحروف، ثمّ نقطة ثم كلمة example
ثمّ نقطة ثمّ com.
“. للمزيد حول التّعابير النّمطيّة راجع درس مقدمة في التعابير النمطية Regular Expressions.
إذا لم يتمكّن Nginx من العثور على أي تعليمة server_name
مُطابقة لقيمة Host
عبر الإجراءات السّابقة فإنّه يختار الخادوم المبدئي الموافق للثّنائي عنوان IP/المنفَذ الّذي أتى عليه الطّلب.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.