<?xml version="1.0"?>
<rss version="2.0"><channel><title>DevOps: Nginx</title><link>https://academy.hsoub.com/devops/servers/web/nginx/page/2/?d=4</link><description>DevOps: Nginx</description><language>ar</language><item><title>&#x641;&#x647;&#x645; &#x622;&#x644;&#x64A;&#x629; &#x639;&#x645;&#x644; &#x62E;&#x648;&#x627;&#x631;&#x632;&#x645;&#x64A;&#x651;&#x629; &#x627;&#x644;&#x627;&#x62E;&#x62A;&#x64A;&#x651;&#x627;&#x631; &#x641;&#x64A; &#x643;&#x62A;&#x644;&#x629; Location &#x644;&#x625;&#x639;&#x62F;&#x627;&#x62F;&#x627;&#x62A; &#x62E;&#x627;&#x62F;&#x648;&#x645; Nginx</title><link>https://academy.hsoub.com/devops/servers/web/nginx/%D9%81%D9%87%D9%85-%D8%A2%D9%84%D9%8A%D8%A9-%D8%B9%D9%85%D9%84-%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D9%91%D8%A9-%D8%A7%D9%84%D8%A7%D8%AE%D8%AA%D9%8A%D9%91%D8%A7%D8%B1-%D9%81%D9%8A-%D9%83%D8%AA%D9%84%D8%A9-location-%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF%D8%A7%D8%AA-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-nginx-r68/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_06/nginx-location-block.png.64b8c83b13e98ed91f4128e95fe4400e.png" /></p>

<p id="مقدمة">تناول الجزء الأوّل من هذا الدّليل <a href="https://academy.hsoub.com/devops/web-servers/nginx/%D9%81%D9%87%D9%85-%D8%A2%D9%84%D9%8A%D8%A9-%D8%B9%D9%85%D9%84-%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D9%91%D8%A9-%D8%A7%D9%84%D8%A7%D8%AE%D8%AA%D9%8A%D8%A7%D8%B1-%D9%81%D9%8A-%D9%83%D9%8F%D8%AA%D9%84-server-%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF%D8%A7%D8%AA-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-nginx-r66/">الخوارزميّة الّتي يتبعها خادوم ويب Nginx لاختيّار كتلة Server</a> للإجابة على طلب العميل. سنتحدَّث في هذا المقال عن كتل Location وكيف يقرّر Nginx الكتلة الّتي ستُجيب على الطّلب.</p><h2 id="تحليل-كتل-location">تحليل كُتَل Location</h2><p>توجد لدى Nginx آليّة لتقرير كتلة Location (الموقع) الّتي ستتولّى التّعامل مع الطّلب. تُشبه هذه الخوارزميّة في عملها خوارزميّة اختيّار كتلة Server المشروحة في الجزء الأوّل من هذا الدّليل.</p><h3 id="صياغة-syntax-كتلة-location">1- صيّاغة Syntax كتلة Location</h3><p>نبدأ، قبل شرح خوارزميّة اختيّار كتلة Location الّتي ستتولّى الإجابة على الطّلب، بشرح الصّيّاغة الّتي يستخدمها Nginx في تعريفات كتل الموقع. تُستخدَم كُتل Location الّتي تقبع ضمن كتلة Server (أو ضمن كتلة Location أخرى)، لتقرير كيف يُتعامل مع المعرّفات الكليّة للموارد Universal Resource Identifier, URI (الجزء الّذي يأتي بعد اسم النّطاق أو عنوان IP/المنفذ).</p><p>تأخذ كتلة Location عمومًا الهيئة التّاليّة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">location optional_modifier location_match {

    . . .

}</pre><p>تُحدّد تعليمة <code>location_match</code> مالّذي سيُقارن به معرّف المورد الموجود في الطّلب. يُحيل <code>optional_modifier</code> إلى مُغيِّر اختيّاري يؤثّر على الطّريقة الّتي يبحث بها Nginx عن تطابق في كتلة Location. نميّز الحالات التّاليّة، حسب قيمة <code>optional_modifier</code>:</p><ul><li>لا يوجد متغيّر: إن لم تُذكَر قيمة للمغيِّر الاختيّاريّ فإنّ الموقع سيُحلّل حسب التّطابق المُبدَأ Prefix match. يعني هذا أنّ الموقع سيُقارَن ببداية معرّف المورِد (URI) في الطّلب، بحثًا عن تطابقات.</li><li><code>=</code>: إذا استُخدمت علامة التّساوي فإنّ الكُتلة لن تُأخذ في الحسبان إلّا إذا كانت مطابقة تمامًا لمعرّف المورِد في الطّلب.</li><li><code>~</code>: في هذه الحالة يُستخدَم تعبير نمطيّ Regular expression يتأثّر بحالة الأحرف (كبيرة Upper case أو صغيرة Lower case).</li><li><code>*~</code>: تختلف عن الحالة السّابقة في أنّ التّعبير النّمطيّ لا يتأثر بحالة الأحرف.</li><li><code>~^</code>: تُشير هذه القيمة إلى أنّه إن اختيرت هذه الكتلة في بوصفها أفضل تطابق دون الاعتماد على التّعابير النّمطيّة فإنّ هذه الأخيرة (أي التّعابير النّمطيّة) لن تُأخَذ بالحسبان.</li></ul><h3 id="أمثلة-توضح-صياغة-كتلة-location">2- أمثلة توضّح صيّاغة كتلة Location</h3><p>كتلة Location التّاليّة مثال على التّطابق المُبدَأ. ستُختار هذه الكتلة للإجابة على الطّلبات الّتي تتضمّن معرّفات الموارِد مثل <code>site/page1/index.html/</code>، <code>site/</code> أو <code>site/index.html/</code> (كلّها تبدأ ب <code>site/</code>):</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">location /site {

    . . .

}</pre><p>لتوضيح التّطابق التّام نأخذ الكتلة التّاليّة الّتي ستُستخدَم للإجابة على الطّالبات ذات معرّف المورد <code>page1/</code>. لن تُختار هذه كتلة Location هذه للإجابة على طلب بمعرّف مورد <code>page1/index.html/</code>. انتبه إلى أنّه في حال اختيّار هذه الكتلة وكان الطّلب يُنفَّذ باستخدام صفحة فهرس (Index page) فإنّه ستُجرى إعادة توجيه داخليّة Internal redirect إلى كتلة موقع أخرى تكون هيّ المُداول Handler الفعليّ للطّلب:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">location = /page1 {

    . . .

}</pre><p>في الإعداد أدناه تعبيرٌ نمطيّ يتأثّر بحالة الأحرف. يُمكن أن تُستخدَم كتلة الموقع في هذا المثال للتّعامل مع الطّلبات على <code>tortoise.jpg/</code> ولكنّها لا يُمكن أن تلبّي الطّلبات على <code>FLOWER.PNG/</code>.</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">location ~ \.(jpe?g|png|gif|ico)$ {

    . . .

}</pre><p>المثال التّالي لا يختلف عن المثال السّابق سوى في المغيّر الاختيّاريّ (<code>~*</code>) حيثُ إنّ التّعبير النّمطي هنا لا يتأثّر بحالة الأحرف؛ لذا يُمكن استخدام الكتلة للإجابة على كلّ من <code>tortoise.jpg/</code> و <code>FLOWER.PNG/</code>.</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">location ~* \.(jpe?g|png|gif|ico)$ {

    . . .

}</pre><p>المثال الأخير للحالة الّتي تمنع فيها كتلة Location البحث عن تطابق عبر التّعابير النّمطيّة. تُحدّد الكتلة التّالية على أنّها أفضل تطابق لا يعتمد على التّعابير النّمطيّة للطّلبات على <code>costumes/ninja.html/</code>.</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">location ^~ /costumes {

    . . .

}</pre><p>رأينا أنّ المغيّرات تُحدّد كيف يجب أن تُفسَّر كتلة Location؛ إلّا أنّها لا تخبرنا عن ماهيّة الخوارزميّة الّتي يستخدمها Nginx لتقرير كتلة الموقع الّتي سيُرسِل إليها الطّلب، وهو ما سنتعرّض لها في الفقرات التّاليّة.</p><h3 id="كيف-يختار-nginx-كتلة-location-التي-ستتعامل-مع-الطلبات">3- كيف يختار Nginx كتلة Location الّتي ستتعامل مع الطّلبات؟</h3><p>يستخدم Nginx آليّةً لاختيّار كتلة الموقِع الّتي ستُجيب على الطّلبات مُشابهةً لكيفيّة اختيّاره لكتلة الخادوم.فهم الإجراءات الّتي يتبعها Nginx لاختيّار الكتلة المناسبة أساسيّ جدًّا لتكون قادرًا على إعداد Nginx بوثوق ودقّة.</p><p>يُقارن Nginx بين معرّف المورد في الطّلب وكتلة Location، مع احتساب المغيّرات الّتي ذكرناه في الفقرة السّابقة، من أجل تحديد أنسب كتلة موقع للإجابة على الطّلب؛ وفقًا للخوارزميّة التّاليّة:</p><ul><li><p>يبدأ Nginx بالتحقّق من كلّ المواقع الّتي لا تستعمل تعابير نمطيّة؛ فيُقارن كلّ كتلة موقع بمعرّف مورد الطّلب كاملًا.</p></li><li><p>يبحث Nginx أوّلًا عن تطابق كامل. إن وُجدت كتلة Location تستخدم المغيِّر <code>=</code> وتُطابق تمامًا معرّف المورد في الطّلب؛ فإنّ كتلة الخادوم هذه سيقع عليها الاختيّار فورًا.</p></li><li><p>إن لم يعثُر على تطابق كامل (باستخدام المغيّر <code>=</code>)، ينتقل Nginx إلى تقويم السّابقات (Prefixes) غير المُطابقة تمامًا؛ فيبحث عن أطول تطابق في الموقع مع معرّف المورد ثمّ يقوّمه بالطّريقة التّاليّة:</p><ul><li><p>إذا كانت كتلة الموقع الّتي يوجد بها أطول تطابق تستخدِم المغيّر <code>~^</code> فسيُنهي Nginx فورًا بحثَه ويختار هذه الكتلة للإجابة على الطّلب.</p></li><li><p>إن لم تكُن الكتلة الّتي يوجد بها أطول تطابق تستخدِم المغيّر <code>~^</code> فسيحتفظ بها Nginx دون أن يُنهي البحث، بحيث يُمكن له اختيّارها عند الحاجة.</p></li></ul></li><li><p>ينتقل Nginx، بعد تحديد الكتلة ذات التّطابق الأطول والاحتفاظ بها، إلى تقويم كتل المواقع الّتي تستخدِم التّعابير النّمطيّة، سواء كانت تتأثّر بحالة الأحرف أم لا. يُقوِّم Nginx التّعابير النمطيّة بالتّسلسل، ويختار فورًا أوّل كتلة موقع يُوافق تعبيرها النّمطيّ معرّفَ مورد الطّلب.</p></li><li><p>إن لم يعثُر خادوم الويب على موقع ذي تعبير نمطيّ يُوافق معرّف المورد المطلوب فإنّه يختار الكتلة المُحتفَظ بها سابقًا للإجابة على الطّلب.</p></li></ul><p>من المهمّ هنا أن نفهم أنّ Nginx، مبدئيًّا، يُفضّل كتل الموقع الّتي تُطابق الطّلب عبر تعابير نمطيّة؛ إلّا أنّه يبدأ بالبحث عن تطابق في كتل المواقع الّتي لا تستعمل تعابير نمطيّة، وهو ما يسمح لمسؤول خادوم الويب بتجاوز ميل Nginx إلى تفضيل التّعابير النّمطيّة عبر تحديد المغيِّرات <code>=</code> و<code>~^</code>.</p><p>من المهمّ أيضًا الانتباه إلى أنّ الاختيّار في كتل المواقع الّتي تستخدِم التّطابق المُبدَأ يكون حسب التّطابق الأطول والأكثر تحديدًا غالبًا. في حين أنّ تقويم التّعابير النمطيّة (وبالتّالي الاختيّار) يتوقّف فور الحصور على تطابق وهو ما يعني أنّ ترتيب كتل المواقع الّتي تستخدم التّعابير النّمطيّة له تأثير كبير على الاختيّار.</p><h3 id="متى-يتجاوز-تقويم-كتلة-الموقع-إلى-مواقع-أخرى">4- متى يتجاوز تقويم كتلة الموقع إلى مواقع أخرى؟</h3><p>عند اختيّار كتلة Location للإجابة على طلب فإنّ التّعامل معه، ابتداءً من هذه النّقطة، يحدُث بالكامل ضمن إطار الكتلة المُختارة. فقط هذه الكتلة والتّعليمات المتفرّعة عنها هي من يُحدّد كيف يُتعامل مع الطّلب، دون تدخّل من كتل Location من نفس المستوى في البنية الشّجريّة.</p><p>تسمح هذه القاعدة العامّة بتصميم كتل Location يُمكن التّنبّؤ بعملها. على الرّغم من ذلك، يجب الانتباه إلى وجود حالات تتسبّب تعليمات داخل الكتلة المُختارة في البحث من جديد عن موقع. يُمكن لهذا الاستثناء من القاعدة العامّة “كتلة موقع واحدة فقط” أن يُحدِث تأثيرات على كيفيّة الإجابة على الطّلب، بحيث يُخالف التّوقّعات الّتي كانت عندك أثناء تصميم كتل المواقع.</p><p>في ما يلي بعض التّعليمات الّتي قد تؤدّي إلى إعادة توجيه من داخل الكتلة المختارة:</p><ul><li>index</li><li>try_files</li><li>rewrite</li><li>serror_page</li></ul><p>نعرض باختصار لكلّ واحدة من هذه التّعليمات.</p><p>تتسبّب تعليمة <code>index</code> دائمًا في إعادة توجيه إن استُخدِمت للتّعامل مع الطّلب. يُستخدَم التّطابق التّام غالبًا لتسريع اختيّار كتلة الموقع عبر إنهاء الخوارزميّة فور حدوث هذا التّطابق. مع ذلك، إن استخدمت التّطابق التّامّ في حال الطّلب على مجلَّد فإنّه توجد إمكانيّة كبيرة لإعادة توجيه الطّلب إلى موقع آخر للإجابة الفعليّة عليه.</p><p>تُطابق أوّل كتلة في المثال التّالي معرّف المورد <code>exact/</code>، إلّا أنّ تعليمة <code>index</code> الّتي ترثها هذه الكتلة تتسبّب في إعادة توجيه إلى الكتلة الثّانيّة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">index index.html;

location = /exact {

    . . .

}

location / {

    . . .

}</pre><p>إذا احتجت أن يبقى تنفيذ الطّلب داخل الكتلة الأولى، في المثال أعلاه؛ فسيتطلّب ذلك منك استخدام وسيلة أخرى لتلبيّة الطّلب على المجلّد.</p><p>يُمكنك مثلًا استخدامُ فهرس غير صالح لهذه الكتلة ثمّ تفعيل تعليمة <code>autoindex</code>:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">location = /exact {
    index nothing_will_match;
    autoindex on;
}

location  / {

    . . .

}</pre><p>هذه إحدى الوسائل لمنع <code>index</code> من تبديل السّيّاق، ولكنّها وسيلة غير ناجعة في أغلب الإعدادات. يُستخدَم التّطابق التّامّ في المجلّدات كثيرًا في بعض الأمور مثل إعادة كتابة الطّلب Request rewriting (الّذي ينتُج عنه البحث من جديد عن الموقع).</p><p>قد تتسبّب تعليمة <code>try_files</code> هي الأخرى في إعادة تقويم عمليّة اختيّار الموقع. تطلُب هذه التّعليمة من Nginx التحقّق من وجود مجموعة مسمّاة من الملفّات أو المجلّدات؛ قد يكون المُعطى الأخير لتعليمة <code>try_files</code> معرّفَ مورد يُعيد Nginx التّوجيه إليه.</p><p>فلنأخذ الإعداد التّالي مثالًا للشّرح:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">root /var/www/main;
location / {
    try_files $uri $uri.html $uri/ /fallback/index.html;
}

location /fallback {
    root /var/www/another;
}</pre><p>سيختار Nginx الكتلة الأولى، في المثال أعلاه، في حال الطّلب على <code>blahblah/</code>. تبحث الكتلة عن ملفّ <code>blahblah</code> في المجلّد <code>var/www/main/</code>، وإن لم تعثُر عليه تبحث عن ملفّ <code>blahblah.html</code>؛ فإن لم تجد هذا الأخير تبحث عن مجلَّد <code>blahblah/</code> ضمن <code>var/www/main/</code>. إذا فشلت كلّ هذه المحاولات يُعيد Nginx توجيه الطّلب إلى <code>fallback/index.html/</code> وهو ما يتسبّب في استدعاء كتلة موقع الأخرى، الثّانيّة في المثال. في المحصّلة فإنّ الملفّ <code>var/www/another/fallback/index.html/</code> سيكون الإجابة على الطّلب.</p><p>تعليمة <code>rewrite</code> أيضًا قد تتسبّب في تجاوز كتلة الموقع المختارة عبر الخوارزميّة المشروحة أعلاه. يبحث Nginx عند استخدام المعطى الأخير مع تعليمة <code>rewrite</code> أو في حالة عدم ذكر أيّ معطى على الإطلاق، يبحث عن تطابق جديد اعتمادًا على نتيجة <code>rewrite</code>.</p><p>نُعيد استخدام المثال الأخير مع إضافة تعليمة <code>rewrite</code> للكتلة الأولى؛ يُمكن أن نلاحظ أنّ الطّلب يُمرَّر في بعض الحالات ماباشرةً إلى كتلة Location الثّانيّة دون تنفيذ تعليمة <code>try_files</code>:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">root /var/www/main;
location / {
    rewrite ^/rewriteme/(.*)$ /$1 last;
    try_files $uri $uri.html $uri/ /fallback/index.html;
}

location /fallback {
    root /var/www/another;
}</pre><p>تُجيب كتلة الموقع الأولى ابتداءً في المثال أعلاه على الطّلب <code>rewriteme/hello/</code>؛ ثمّ يأتي الطّلب لتعليمة <code>rewrite</code> الّتي تُعيد كتابته ليُصبح <code>hello/</code> فيبدأ Nginx البحث من جديد عن موقع للإجابة على الطّلب ويعثُر من جديد على تطابق مع الكتلة الأولى ثمّ تُنفَّذ عليه تعليمة <code>try_files</code> وفقًا للآليّة المشروحة في مثال استخدام تعليمة <code>try_files</code>.</p><p>أمّا إذا كان الطّلب على <code>rewriteme/fallback/hello/</code> فستُطابق كتلة الموقع الأولى الطّلب ثمّ تنفَّذ عليه تعليمة <code>rewrite</code> الّتي تعيد كتابته فيصبح <code>fallback/hello/</code> ممّا ينتُج عنه مطابقة مع كتلة الموقع الثّانيّة وبالتّالي تُجيب الطّلب.</p><p>تحدُث حالة مُشابهة مع تعليمة <code>return</code> عند إرسال رمز الحالة Status code رقم 301 أو 302. الفرق في هذه الحالة هي أنّ النتيجة عبارة عن طلب جديد كلّيًّا على هيئة إعادة توجيه خارجيّة External redirect مرئيّة. نفس الشيء يُمكن أن يحدُث مع تعليمة <code>rewrite</code> عند استخدام عَلَميْ <code>redirect</code> و <code>permanent</code>. إلّا أنّ هذه الحالات يجب ألا تكون غير متوقّعة، فإعادة التّوجيه الخارجيّة المرئيّة ينتُج عنها دومًا طلب جديد.</p><p><strong>ملحوظة 1</strong>: الفرق بين إعادة التّوجيه الدّاخليّة والخارجيّة هو أنّ الأولى لا تُنهي طلب العميل الحاليّ بل تُحيله إلى مسار آخر ضمن خادوم الويب؛ أمّا الخارجيّة فتُنهي طلب العميل مع إخباره بمعرّف المورد الجديد الّذي يجب عليه إرسال طلب آخر للحصول عليه.</p><p><strong>ملحوظة 2</strong>: رموز الحالة هي أعداد يستخدمها بروتوكول HTTP ليُشعِر بالحالة الّتي انتهى عليها تنفيذ الطّلب. تُقسَّم إجابات HTTP إلى خمس مجموعات: إجابات بمعلومات، إجابات بنجاح الطّلب، إعادات توجيه، أخطاء من جانب العميل و أخطاء من جانب الخادوم.</p><p>يُمكن أن تؤدّي تعليمة <code>error_page</code> إلى إعادة توجيه داخليّة مشابهة لتلك الّتي تُنشئها تعليمة <code>try_files</code>. تُستخدَم تعليمة <code>error_page</code> لتحديد ما يجب أن يحدُث عند تلقّي رموز حالات معيَّنة. على الأرجح لن تُنفَّذ تعليمة <code>error_page</code> إذا كانت تعليمة <code>try_files</code>مضبوطة، فهذه الأخيرة تتعامل مع كامل دورة حياة الطّلب.</p><p>فلنأخذ المثال التّاليّ:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">root /var/www/main;

location / {
    error_page 404 /another/whoops.html;
}

location /another {
    root /var/www;
}</pre><p>تستجيب الكتلة الأولى الّتي تقدّم ملفّات من المجلَّد <code>var/www/main/</code> لجميع الطّلبات، ما عدا تلك الّتي تبدأ ب<code>another/</code>. إن لم يُعثَر على الملفّ المطلوب ضمن المجلَّد المذكور (رمز الحالة 404) فسيُعاد توجيه الطّلب إلى الملفّ <code>another/whoops.html/</code> ممّا ينتُج عنه البحث عن كتلة موقع تتعامل مع الطّلب الجديد. يرسو البحث على كتلة الموقع الثّانيّة الّتي تُجيب بالملفّ <code>var/www/another/whoops.html/</code>.</p><p>يُساعد فهمُ الظّروف الّتي تؤثّر على Nginx وتجعله يبحث عن كتلة موقع جديدة تلبّي الطّلب على توقّع سلوك Nginx عند إنشاء طلبات.</p><h2 id="خاتمة">خاتمة</h2><p>يُسهّل فهمُ الإجراءات الّتي يتبعها Nginx في الاستجابة لطلبات العملاء كثيرًا من عمل مسؤول الموقع، فيمكنك معرفة كتلة الخادوم الّتي سيختارها Nginx للإجابة حسب كلّ طلب على حدة. كما ستكون لديك القدرة على معرفة كتلة الموقع الّتي سيختارها خادوم الويب اعتمادًا على معرّف المورد المذكور في الطّلب.</p><p>على العموم تُمكنّك معرفة الطّريقة الّتي يختار Nginx وفقها الكتل المختلفة من تتبّع السّيّاقات الّتي يطبّقها Nginx من أجل الإجابة على كلّ طلب.</p><p>ترجمة بتصرّف لمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/understanding-nginx-server-and-location-block-selection-algorithms">Understanding Nginx Server and Location Block Selection Algorithms</a>.</p>
]]></description><guid isPermaLink="false">68</guid><pubDate>Tue, 09 Jun 2015 20:49:04 +0000</pubDate></item><item><title>&#x641;&#x647;&#x645; &#x622;&#x644;&#x64A;&#x629; &#x639;&#x645;&#x644; &#x62E;&#x648;&#x627;&#x631;&#x632;&#x645;&#x64A;&#x651;&#x629; &#x627;&#x644;&#x627;&#x62E;&#x62A;&#x64A;&#x627;&#x631; &#x641;&#x64A; &#x643;&#x64F;&#x62A;&#x644; Server &#x644;&#x625;&#x639;&#x62F;&#x627;&#x62F;&#x627;&#x62A; &#x62E;&#x627;&#x62F;&#x648;&#x645; Nginx</title><link>https://academy.hsoub.com/devops/servers/web/nginx/%D9%81%D9%87%D9%85-%D8%A2%D9%84%D9%8A%D8%A9-%D8%B9%D9%85%D9%84-%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D9%91%D8%A9-%D8%A7%D9%84%D8%A7%D8%AE%D8%AA%D9%8A%D8%A7%D8%B1-%D9%81%D9%8A-%D9%83%D9%8F%D8%AA%D9%84-server-%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF%D8%A7%D8%AA-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-nginx-r66/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_06/nginx-server-block.png.52223db64de350269b2c664828ebd844.png" /></p>

<p id="مقدمة">يمكِن لـِ Nginx، أحد أكثر خواديم الويب انتشارًا؛ التّعاملُ بنجاح مع عملاء عدّة يتّصلون بالتّزامن، كما يُمكنه العمل بوصفه خادوم ويب، خادوم بريد أو <a href="https://academy.hsoub.com/devops/web-servers/nginx/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-nginx-%D9%83%D9%88%D8%B3%D9%8A%D8%B7-%D8%B9%D9%83%D8%B3%D9%8A-reverse-proxy-%D9%84%D9%80apache-r19/">وسيطًا عكسيًّا Reverse proxy</a>.</p><p>سنتطرّق في هذا الدّليل إلى بعض كواليس الآليّة الّتي تحدّد كيف يتعامل Nginx مع طلبات العملاء Client requests. يُساعد فهمُ هذه الآليّة في معرفة كيف تعمل إعدادات الكتلة (Block configurations) في خادوم ويب Nginx وخصوصًا كتلتَيْ Server (الخادوم) وLocation (الموقع). كما أنّه يجعل من تعامل Nginx مع طلبات العملاء أكثر قابليّةً للتّوقّع والتخمين.</p><h2 id="إعدادات-كتلة-nginx">إعدادات كتلة Nginx</h2><p>يقسّم Nginx إعداداتِ تقديم المحتوى إلى كُتل تنتظِم في بنية شجريّة Hierarchical. يبدأ Nginx عندما يتلقّى طلبًا إجراءاتِ تقرير كُتَل الإعداد الّتي يجب استخدامُها للتّعامل مع الطّلب. سنتحدّث في هذا الدّليل عن آليّة التّقرير هذه.</p><p>يتحدّث الجزء الأوّل من هذا الدّليل عن كتلة Server، أمّا الثّاني فيتناول كتلة Location.</p><p>تعرّف كتلة Server، وهي مجموعة فرعيّة من إعدادات Nginx، خادومًا افتراضيًّا يتعامل مع طلباتٍ من نوع محدَّد. يعرّف مدراء الخواديم عادةً كتلَ خادوم عدّة ثمّ يضبطونها للتّعامل مع الطّلبات حسب اسم النّطاق Domain name، أو المنفذ Port، أو عنوان IP الذي يأتي عبره الطّلب.</p><p>تقبع كتلة Location ضمن كتلة من نوع Server (كتلة خادوم)، وتُستخدَم لتعريف الكيفيّة الّتي سيتعامل بها خادوم ويب Nginx مع الطّلبات على موارد الخادوم والمعرّفات الكليّة لهذه الموارد Universal Resource Identifier, URI. يُمكن أن تُقسَّم مساحة المعرّفات الكليّة للموارد URIs بالطّريقة الّتي يراها المدير عن طريق استخدام كتل Location، فنموذج الكتل مرن للغاية.</p><h2 id="كيف-يقرر-nginx-كتلة-server-التي-ستتعامل-مع-الطلب">كيف يقرّر Nginx كتلة Server الّتي ستتعامل مع الطّلب؟</h2><p>يحتاج Nginx، ما دام يسمح بتعريف كُتَل Server عدّة تعمل على أنّها خواديم ويب افتراضيّة متفرّقة، يحتاج لوسيلة يعرف بها كتلة Server الّتي ستتولّى تلبيّة الطّلب.</p><p>يُعرّف خادوم ويب Nginx نظامَ فحص يُستخدَم للعثور على كتلة Server الأكثر مُطابقةً للطّلب. يهتم Nginx أثناء عمليّة الفحص بتعليمتَيْن Directives على مستوى كتلة الخادوم، وهما <code>listen</code> و<code>server_name</code>.</p><h3 id="1-تحليل-تعليمة-listen-بحثا-عن-تطابقات-ممكنة">1- تحليل تعليمة listen بحثًا عن تطابقات ممكنة</h3><p>ينظُر Nginx أوّلًا إلى عنوان IP الطّلب ومنفَذه؛ ثمّ يبحث عن تطابق بين هاتين المعلومتيْن مع محتوى تعليمة <code>listen</code> في كلّ كتلة خادوم. يُنشئ Nginx إثر هذه الخطوة قائمةً بكُتل الخواديم الّتي يُمكن أن تلبّي الطّلب.</p><p>تعرّف تعليمة <code>listen</code> عنوان IP والمنفَذ الّذيْن ستُجيب كتلة الخادوم الطّلبات الآتيّة منهما. إذا لم تتضمّن كتلة الخادوم تعليمة <code>listen</code> فإنّ المعطيات <code>0.0.0.0:80</code> تُمنح للتّعليمة بشكل افتراضيّ (أو <code>0.0.0.0:8080</code> إذا كان مستخدم عاديّ غير المستخدم الجذر هو من يشغّل خادوم ويب Nginx). تسمح هذه المعطيات لكتلة الخادوم بالإجابة عن طلبات عبر المنفذ <code>80</code> على كلّ الواجهات Interfaces؛ إلّا أنّ المعطيات الافتراضيّة لا تمثّل ثقلًا كبيرًا في عمليّة اختيّار الخادوم.</p><p>يُمكن ضبطُ تعليمة <code>listen</code>:</p><ul><li>بذكر عنوان IP ومنفَذ.</li><li>بذكر عنوان IP فقط؛ في هذه الحالة يُستخدم المنفذ الافتراضيّ <code>80</code>.</li><li>بذكر منفَذ فقط؛ في هذه الحالة تستجيب لأي طلب يأتي عبر هذا المنفذ على كلّ الواجهات.</li><li>بتحديد مسار إلى مقبس يونكس Unix socket.</li></ul><p>سيقتصر تأثير الخيّار الأخير - غالبًا - على الطّلبات الّتي تمرّر بين مجموعة خواديم.</p><p>يقرّر Nginx كتلة الخادوم الّتي سيُرسل إليها الطّلب اعتمادًا على خصوصيّة تعليمة <code>listen</code> وذلك وفقًا للقواعد التّاليّة:</p><ul><li><p>تُكمَّل الأجزاء غير المكتملة من تعليمة <code>listen</code> بالقيّم الافتراضيّة. الأمثلة التّاليّة توضّح كيف تُكمّل تعليمة <code>listen</code>:</p><ul><li>كتلة خادوم لا توجد بها تعليمة <code>listen</code> ستستعمل القيمة <code>0.0.0.0:80</code>.</li><li>كتلة خادوم مضبوطة على العنوان <code>111.111.111.111</code> ولا تعرّف منفذًا تستعمل القيمة <code>111.111.111.111:80</code>.</li><li>كتلة خادوم مضبوطة على المنفذ <code>8888</code> دون عنوان IP، تستخدم القيمة <code>0.0.0.0:8888</code>.</li></ul></li><li><p>يكوّن Nginx قائمة بكتل الخواديم الّتي تُطابق الطّلب، وبالتحديد عنوان IP والمنفذ. يعني هذا أنّ أيّة كتلة تستخدم عنوان <code>0.0.0.0</code> (مطابقة كلّ الواجهات) لن تُختار إن وُجدت كتلة تستخدم عناوين IP تُطابق الطّلب. في جميع الحالات يجب أن تُطابقَ الكتلة المنفذ بالضّبط.</p></li><li><p>إذا وُجدت كتلة واحدة تُطابق الطّلب، ولم توجد أخرى بنفس المستوى من المُطابقة، فستُستخدَم للإجابة على الطّلب؛ أمّا إذا وُجدت عدّة كتل مع نفس المستوى من المطابقة فإنّ Nginx يبدأ بالنّظر في قيمة تعليمة <code>server_name</code> بالنّسبة لكلّ كتلة خادوم.</p></li></ul><p>يجب الانتباه إلى أنّ Nginx لن ينظُر في قيمة تعليمة <code>server_name</code> إلّا إذا احتاج للتّفريق بين كتل خواديم لديها تعليمة <code>listen</code> بنفس المستوى من المطابقة للطّلب. على سبيل المثال؛ إذا كان <code>example.com</code> مُستضافًا على المنفذ <code>80</code> من <code>192.168.1.10</code> فـإنّ كتلة الخادوم الأولى فقط في المثال أدناه، هيّ من سيستجيب للطّلبات الموّجّهة إلى <code>example.com</code>، على الرّغم من أنّ تعليمة <code>server_name</code> في الكتلة الثّانيّة تحوي القيمة <code>example.com</code>.</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">server {
    listen 192.168.1.10;

    . . .

}

server {
    listen 80;
    server_name example.com;

    . . .

}</pre><p>أمّا إذا وُجِدت أكثر من كتلة خادوم تُطابق بنفس المستوى من التّحديد الطّلب؛ فإنّ الخطوة التّاليّة هي فحص محتوى تعليمة <code>server_name</code>.</p><h3 id="2-تحليل-تعليمة-servername-للاختيار-بين-التطابقات">2- تحليل تعليمة server_name للاختيّار بين التّطابقات</h3><p>الخطوة المواليّة، في حال وجود كتل خواديم عدّة بنفس المستوى من التّحديد توافق الطّلب، هي تحليل تعليمة <code>server_name</code>. يتحقّق Nginx من ترويسة Header في الطّلب تُسمّى <code>Host</code> (المستضيف). تحوي ترويسة <code>Host</code> اسم النّطاق أو عنوان IP الّذي يُريد العميل الوصول إليه.</p><p>يُحاول Nginx إيجاد كتلة الخادوم الأكثر مطابقةً لترويسة <code>Host</code> من بين كتل الخواديم المتبقيّة بعد تحليل تعليمة <code>listen</code>. يتبع Nginx الوصفة التّاليّة لإيجاد الكتلة المناسبة:</p><ul><li><p>يبحث خادوم الويب عن كتلة خادوم تكون قيمة تعليمة <code>server_name</code> مطابقةً تمامًا لترويسة <code>Host</code> الموجودة في الطّلب. إذا عثر على تعليمة <code>server_name</code> يتحقّق فيها الشّرط فإنّ الكتلة المرتبطة بها هي الّتي تُستخدَم. إذا كانت هناك عدّة تعليمات مطابقة فإنّ أوّل كتلة خادوم هيّ الّتي ستُختار.</p></li><li><p>إن لم يعثُر على مطابقة تامّة يبحث Nginx عن كتلة خادوم تبدأ قيمة تعليمة <code>server_name</code> فيها بحرف بَدَل Wildcard (يُشار إليه بعلامة <code>*</code> في <strong>بداية</strong> الاسم) بحيث توافق التّعليمة ترويسة المستضيف في الطّلب. إذا عثر على تعليمة <code>server_name</code> يتحقّق فيها الشّرط فإنّ الكتلة المرتبطة بها هي الّتي تُستخدَم. أمّا إذا كانت هناك عدّة تعليمات فإنّ التّعليمة ذات التّطابق الأطول (عدد الأحرف) هيّ الّتي ستُختار.</p></li><li><p>إن لم يُعثُر على مُطابقة باستخدام حرف بدل في بداية قيمة التّعليمة فإنّ Nginx يبحث عن تعليمة <code>server_name</code> تنتهي بحرف بدل (يُشار إليه بعلامة <code>*</code> في <strong>نهاية</strong> الاسم) بحيث توافق التّعليمة ترويسة المستضيف في الطّلب. إذا عثر على تعليمة <code>server_name</code> يتحقّق فيها الشّرط فإنّ الكتلة المرتبطة بها هي الّتي تُستخدَم. أمّا إذا كانت هناك عدّة تعليمات فإنّ التّعليمة ذات التّطابق الأطول (عدد الأحرف) هيّ الّتي ستُختار.</p></li><li><p>إن لم يعثُر Nginx على مُطابقة باستخدام حرف بدل في نهاية قيمة التّعليمة فإنّه يبحث عن كتلة خادوم تعرّف تعليمة <code>server_name</code> عن طريق تعبير نمطيّ Regular expression (يُشار إليه بعلامة <code>~</code> قبل الاسم). يستخدِم Nginx أوّل كتلة خادوم يُوافق تعبير تعليمة <code>server_name</code> النّمطيّ فيها ترويسة المستضيف.</p></li><li><p>إن لم يوجد تطابُق باستخدام التّعبير النّمطيّ يختار Nginx كتلة الخادوم الافتراضّية لعنوان IP والمنفَذ المستخدَم.</p></li></ul><p>يوجد لكلّ ثنائيّ عنوان IP/منفذ كتلة خادوم مبدئيّة Default تُستخدَم إن لم تؤدِّ الآليّة الموصوفة أعلاه للعثور على كتلة خادوم. كتلة الثّنائيّ عنوان IP/منفذ المبدئيّة هيّ الكتلة الأولى في الإعداد أو تلك الّتي تحوي خيّار <code>default_server</code> ضمن تعليمة <code>listen</code> (يغلِب مفعول خيّار <code>default_server</code>، إذا كان موجودًا، مفعول الكتلة الأولى). لا يُمكن أن يوجد خيّار <code>default_server</code> في أكثر من مرّة بالنّسبة لكلّ عنوان IP/منفذ.</p><p>نشرح في الفقرة التّاليّة كلّ نقطة من آليّة العمل أعلاه.</p><h3 id="3-أمثلة">3- أمثلة</h3><p>إذا وجدت تعليمة <code>server_name</code> تُطابق تمامًا ترويسة المستضيف فسيقع على الكتلة المرتبطة بها الاختيّار للإجابة على الطّلب.</p><p>إذا كانت ترويسة <code>Host</code> الموجودة في الطّلب تحوي <code>host1.example.com</code> فإنّ الخادوم الثّاني في المثال أدناه هو الّذي سيقع عليه الاختيّار:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">server {
    listen 80;
    server_name *.example.com;

    . . .

}

server {
    listen 80;
    server_name host1.example.com;

    . . .

}</pre><p>إن لم يوجد تطابق كامل يبحثُ Nginx عن تعليمة <code>server_name</code> تبدأ بحرف بَدَل ويتحقّق من توافقها مع المستضيف في الطّلب. يختار خادوم الويب أطول قيمة في <code>server_name</code> من بين تلك الّتي تُطابق الطّلب.</p><p>في المثال التّالي يختار Nginx كتلة الخادوم الثّانيّة إذا كان العميل يطلُب المستضيف <code>www.example.org</code>:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">server {
    listen 80;
    server_name www.example.*;

    . . .
}

server {
    listen 80;
    server_name *.example.org;

    . . .
}

server {
    listen 80;
    server_name *.org;

    . . .
}</pre><p>ملحوظة: كلّ من الكتلة الثّانيّة والثّالثة توافق المستضيف في الطّلب (<code>www.example.org</code>)؛ إلّا أنّ قيمة <code>server_name</code> في الكتلة الثّانيّة أطول. تُقرأ قيمة الكتلة الثّانيّة في المثال أعلاه “جميع المستضيفات الّتي <strong>تنتهي</strong> ب<code>example.org.</code> أمّا الكتلة الثّالثّة فتقرأ قيمة <code>server_name</code> “جميع المستضيفات الّتي <strong>تنتهي</strong> ب<code>org.</code>. يُمكن ملاحظة أنّ قيمة <code>server_name</code> في كتلة الخادوم الثّانيّة أكثر تحديدًا.</p><p>إذا لم يجد Nginx كتلة الخادوم المناسبة في قيّم <code>server_name</code> الّتي <strong>تبدأ</strong> بحرف بدل، فإنّه يبحث في كتل الخادوم الّتي <strong>تنتهي</strong> قيّم <code>server_name</code> فيها بحرف بدل. مثل ما يحدُث في الحالة السّابقة، يختار خادوم الويب أطول قيمة في <code>server_name</code> من بين تلك الّتي تُطابق الطّلب.</p><p>إذا كان المستضيف المحدّد في الطّلب هو <code>www.example.com</code> فإنّ Nginx سيختار، في المثال التّالي، كتلة الخادوم الثّالثة.</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">server {
    listen 80;
    server_name host1.example.com;
    . . .
}

server {
    listen 80;
    server_name example.com;
    . . .
}

server {
    listen 80;
    server_name www.example.*;
    . . .
}</pre><p>ملحوظة: تُقرأ قيمة <code>server_name</code> في كتلة الخادوم الثّالثة في المثال أعلاه “جميع المستضيفات الّتي <strong>تبدأ</strong> ب<code>.www.example</code>.</p><p>مجدّدًا، إذا لم يعثُر Nginx على تطابق باستخدام أحرف البدل في نهاية قيمة التّعليمة فإنّه سينتقل إلى محاولة مطابقة قيمة <code>Host</code> في ترويسة الطّلب بقيّم <code>server_name</code> المعرّفة بتعابير نمطيّة ويختار أوّل كتلة خادوم تُطابق فيها قيمة <code>server_name</code> قيمة <code>Host</code>.</p><p>إذا كانت قيمة <code>Host</code> هي <code>www.example.com</code> فإنّ Nginx سيختار، في المثال التّالي، كتلة الخادوم الثّالقة للإجابة على الطّلب:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">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$;

    . . .

}</pre><p>ملحوظة: يُقرأ التّعبير النّمطيّ أعلاه “يبدأ اسم المستضيف بإحدى الكلمات التّاليّة set، www، host1 أو subdomain؛ قد يتبعها حرف أو عدد غير محدّد من الحروف، ثمّ نقطة ثم كلمة <code>example</code> ثمّ نقطة ثمّ <code>com.</code>“. للمزيد حول التّعابير النّمطيّة راجع درس <a href="https://academy.hsoub.com/devops/linux/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D8%A8%D9%8A%D8%B1-%D8%A7%D9%84%D9%86%D9%85%D8%B7%D9%8A%D8%A9-regular-expressions-r63/">مقدمة في التعابير النمطية Regular Expressions</a>.</p><p>إذا لم يتمكّن Nginx من العثور على أي تعليمة <code>server_name</code> مُطابقة لقيمة <code>Host</code> عبر الإجراءات السّابقة فإنّه يختار الخادوم المبدئي الموافق للثّنائي عنوان IP/المنفَذ الّذي أتى عليه الطّلب.</p>
]]></description><guid isPermaLink="false">66</guid><pubDate>Mon, 08 Jun 2015 12:40:41 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x64F;&#x62D;&#x633;&#x651;&#x650;&#x646; &#x623;&#x62F;&#x627;&#x621; &#x62E;&#x627;&#x62F;&#x648;&#x645; Nginx</title><link>https://academy.hsoub.com/devops/servers/web/nginx/%D9%83%D9%8A%D9%81-%D8%AA%D9%8F%D8%AD%D8%B3%D9%91%D9%90%D9%86-%D8%A3%D8%AF%D8%A7%D8%A1-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-nginx-r31/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_04/nginx_480x300.png.8b9ee762b6ea2bcda2ff1da175d6358f.png" /></p>
<h2 dir="rtl">&#1605;&#1602;&#1583;&#1617;&#1616;&#1605;&#1577;</h2><p dir="rtl">&#1610;&#1615;&#1588;&#1603;&#1617;&#1604; &#1582;&#1575;&#1583;&#1608;&#1605;&nbsp;Nginx&#1548; &#1575;&#1604;&#1587;&#1617;&#1585;&#1610;&#1593; &#1608;&#1575;&#1604;&#1582;&#1601;&#1610;&#1601;&#1548; &#1576;&#1583;&#1610;&#1604;&#1611;&#1575; - &#1601;&#1610; &#1581;&#1575;&#1604;&#1575;&#1578; &#1593;&#1583;&#1610;&#1583;&#1577; - &#1604;&#1582;&#1575;&#1583;&#1608;&#1605;&nbsp;Apache &#1603;&#1579;&#1610;&#1585;&#1616; &#1575;&#1604;&#1605;&#1615;&#1578;&#1591;&#1604;&#1617;&#1576;&#1575;&#1578;. &#1603;&#1571;&#1610;&#1617; &#1576;&#1585;&#1606;&#1575;&#1605;&#1580; &#1570;&#1582;&#1585;&#1548; &#1610;&#1581;&#1578;&#1575;&#1580; Nginx &#1573;&#1604;&#1609; &#1590;&#1576;&#1591;&#1607; &#1605;&#1606; &#1571;&#1580;&#1604; &#1575;&#1604;&#1581;&#1589;&#1608;&#1604; &#1593;&#1604;&#1609; &#1571;&#1583;&#1575;&#1569; &#1571;&#1601;&#1590;&#1604;.</p><h2 dir="rtl">&#1605;&#1615;&#1578;&#1591;&#1604;&#1617;&#1614;&#1576;&#1575;&#1578; &#1575;&#1604;&#1583;&#1617;&#1585;&#1587;</h2><ul><li><p dir="rtl"><a href="http://academy.hsoub.com/devops/web-servers/nginx/%D8%AA%D9%86%D8%B5%D9%8A%D8%A8%D8%8C-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D9%88%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-nginx-%D9%83%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D9%88%D9%8A%D8%A8-r1/">&#1582;&#1575;&#1583;&#1608;&#1605; &#1608;&#1610;&#1576; Nginx &#1605;&#1579;&#1615;&#1576;&#1617;&#1614;&#1578; &#1608;&#1605;&#1615;&#1593;&#1614;&#1583;&#1617; &#1604;&#1604;&#1593;&#1605;&#1604;</a>.</p></li><li><p dir="rtl">&#1601;&#1607;&#1605; <a href="http://academy.hsoub.com/search/?tags=%D9%85%D8%AF%D8%AE%D9%84+%D8%A5%D9%84%D9%89+%D9%84%D9%8A%D9%86%D9%83%D8%B3">&#1571;&#1587;&#1575;&#1587;&#1610;&#1617;&#1575;&#1578; &#1575;&#1604;&#1578;&#1617;&#1593;&#1575;&#1605;&#1604; &#1605;&#1593; </a><a href="http://academy.hsoub.com/search/?tags=%D9%85%D8%AF%D8%AE%D9%84+%D8%A5%D9%84%D9%89+%D9%84%D9%8A%D9%86%D9%83%D8%B3">Linux</a>.</p></li></ul><h2 dir="rtl">&#1590;&#1576;&#1591; &#1605;&#1578;&#1594;&#1610;&#1617;&#1585;&#1614;&#1610;&#1618; <span style="font-family:courier new,courier,monospace;">worker_processes</span> &#1608; <span style="font-family:courier new,courier,monospace;">worker_connections</span></h2><p dir="rtl">&#1571;&#1608;&#1617;&#1604; &#1605;&#1578;&#1594;&#1610;&#1617;&#1616;&#1585;&#1610;&#1618;&#1606; &#1610;&#1580;&#1576; &#1593;&#1604;&#1610;&#1606;&#1575; &#1590;&#1576;&#1591;&#1615;&#1607;&#1605;&#1575; &#1607;&#1605;&#1575; &#1605;&#1578;&#1594;&#1610;&#1617;&#1585;&#1575; <span style="font-family:courier new,courier,monospace;">worker_processes</span> &#1608; <span style="font-family:courier new,courier,monospace;">worker_connections</span>. &#1610;&#1580;&#1576; &#1571;&#1606; &#1606;&#1601;&#1607;&#1605; &#1605;&#1575; &#1575;&#1604;&#1617;&#1584;&#1610; &#1610;&#1578;&#1581;&#1603;&#1617;&#1605; &#1601;&#1610;&#1607; &#1603;&#1604; &#1608;&#1575;&#1581;&#1583; &#1605;&#1606; &#1607;&#1584;&#1610;&#1618;&#1606; &#1575;&#1604;&#1605;&#1578;&#1594;&#1610;&#1617;&#1585;&#1610;&#1618;&#1606;&#1548; &#1602;&#1576;&#1604; &#1575;&#1604;&#1583;&#1617;&#1582;&#1608;&#1604; &#1601;&#1610; &#1578;&#1601;&#1575;&#1589;&#1610;&#1604; &#1573;&#1593;&#1583;&#1575;&#1583; &#1603;&#1604;&#1617; &#1608;&#1575;&#1581;&#1583; &#1605;&#1606;&#1607;&#1605;&#1575;.</p><p dir="rtl">&#1606;&#1576;&#1583;&#1571; &#1576;&#1578;&#1593;&#1604;&#1610;&#1605;&#1577; <span style="font-family:courier new,courier,monospace;">worker_processes</span> &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1615;&#1605;&#1579;&#1617;&#1616;&#1604; &#1575;&#1604;&#1593;&#1605;&#1608;&#1583; &#1575;&#1604;&#1601;&#1602;&#1585;&#1610; &#1575;&#1604;&#1589;&#1617;&#1604;&#1576; &#1576;&#1575;&#1604;&#1606;&#1617;&#1587;&#1576;&#1577; &#1604; Nginx. &#1578;&#1615;&#1593;&#1591;&#1610; &#1607;&#1584;&#1607; &#1575;&#1604;&#1578;&#1617;&#1593;&#1604;&#1610;&#1605;&#1577; &#1593;&#1583;&#1583;&#1614; &#1575;&#1604;&#1593;&#1605;&#1604;&#1610;&#1617;&#1575;&#1578; Processes &#1575;&#1604;&#1617;&#1578;&#1610; &#1610;&#1580;&#1576; &#1593;&#1604;&#1609; Nginx &#1573;&#1606;&#1588;&#1575;&#1572;&#1615;&#1607;&#1575; &#1576;&#1593;&#1583; &#1605;&#1593;&#1585;&#1601;&#1578;&#1607; &#1604;&#1593;&#1606;&#1608;&#1575;&#1606; IP &#1608;&#1575;&#1604;&#1605;&#1606;&#1575;&#1601;&#1616;&#1584; Ports &#1575;&#1604;&#1617;&#1578;&#1610; &#1587;&#1610;&#1588;&#1578;&#1594;&#1604; &#1593;&#1604;&#1610;&#1607;&#1575;&#1548; &#1608;&#1607;&#1610;&#1617; &#1575;&#1604;&#1605;&#1587;&#1572;&#1608;&#1604;&#1577; &#1593;&#1606; &#1603;&#1604; &#1605;&#1575; &#1610;&#1615;&#1572;&#1583;&#1617;&#1610;&#1607; &#1582;&#1575;&#1583;&#1608;&#1605; &#1575;&#1604;&#1608;&#1610;&#1576;. &#1610;&#1615;&#1591;&#1604;&#1614;&#1602; &#1593;&#1604;&#1609; &#1603;&#1604; &#1608;&#1575;&#1581;&#1583;&#1577; &#1605;&#1606; &#1607;&#1584;&#1607; &#1575;&#1604;&#1593;&#1605;&#1604;&#1610;&#1617;&#1575;&#1578; &#1575;&#1587;&#1605; Worker (&#1575;&#1604;&#1593;&#1575;&#1605;&#1616;&#1604;). &#1605;&#1606; &#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1581;&#1587;&#1614;&#1606; &#1578;&#1588;&#1594;&#1610;&#1604;&#1615; &#1593;&#1575;&#1605;&#1604; &#1608;&#1575;&#1581;&#1583; &#1593;&#1604;&#1609; &#1603;&#1604; &#1606;&#1608;&#1575;&#1577; Core &#1605;&#1606; &#1608;&#1581;&#1583;&#1577; &#1575;&#1604;&#1605;&#1615;&#1593;&#1575;&#1604;&#1580;&#1577; &#1575;&#1604;&#1605;&#1585;&#1603;&#1586;&#1610;&#1617;&#1577; Central processing unit, CPU. &#1604;&#1606; &#1610;&#1606;&#1578;&#1615;&#1580; &#1593;&#1606; &#1578;&#1588;&#1594;&#1610;&#1604; &#1571;&#1603;&#1579;&#1585; &#1605;&#1606; &#1593;&#1575;&#1605;&#1604; &#1593;&#1604;&#1609; &#1606;&#1608;&#1575;&#1577;&#1613; &#1590;&#1585;&#1585;&#1612; &#1603;&#1576;&#1610;&#1585; &#1593;&#1604;&#1609; &#1575;&#1604;&#1606;&#1617;&#1616;&#1592;&#1575;&#1605; &#1604;&#1603;&#1606;&#1617;&#1607; &#1587;&#1610;&#1572;&#1583;&#1617;&#1610; &#1573;&#1604;&#1609; &#1608;&#1580;&#1608;&#1583; &#1575;&#1604;&#1593;&#1583;&#1610;&#1583; &#1605;&#1606; &#1575;&#1604;&#1593;&#1605;&#1604;&#1610;&#1617;&#1575;&#1578; &#1575;&#1604;&#1587;&#1617;&#1575;&#1603;&#1606;&#1577; Idle processes &#1594;&#1610;&#1585; &#1575;&#1604;&#1590;&#1617;&#1585;&#1608;&#1585;&#1610;&#1617;&#1577;.</p><p dir="rtl"><strong>&#1605;&#1604;&#1581;&#1608;&#1592;&#1577;</strong>: &#1593;&#1605;&#1604;&#1610;&#1617;&#1577; &#1587;&#1575;&#1603;&#1606;&#1577; &#1607;&#1610; &#1593;&#1605;&#1604;&#1610;&#1617;&#1577; &#1604;&#1575; &#1578;&#1580;&#1583; &#1605;&#1575; &#1578;&#1601;&#1593;&#1604;&#1607; &#1608;&#1604;&#1575; &#1578;&#1578;&#1608;&#1604;&#1617;&#1609; &#1575;&#1604;&#1573;&#1580;&#1575;&#1576;&#1577; &#1593;&#1606; &#1571;&#1610;&#1617; &#1591;&#1604;&#1576;.</p><p dir="rtl">&#1610;&#1603;&#1601;&#1610;&#1548; &#1604;&#1605;&#1593;&#1585;&#1601;&#1577; &#1602;&#1610;&#1605;&#1577; <span style="font-family:courier new,courier,monospace;">worker_processes</span> &#1575;&#1604;&#1571;&#1605;&#1579;&#1604; &#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1603;&#1548; &#1573;&#1604;&#1602;&#1575;&#1569;&#1615; &#1606;&#1592;&#1585;&#1577; &#1593;&#1604;&#1609; &#1593;&#1583;&#1583; &#1575;&#1604;&#1571;&#1606;&#1608;&#1610;&#1617;&#1577; &#1604;&#1583;&#1610;&#1603;. &#1610;&#1615;&#1605;&#1603;&#1616;&#1606;&#1603; &#1593;&#1576;&#1585; &#1575;&#1604;&#1571;&#1605;&#1585; &#1575;&#1604;&#1578;&#1617;&#1575;&#1604;&#1610; &#1575;&#1604;&#1581;&#1589;&#1608;&#1604; &#1593;&#1604;&#1609; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1593;&#1604;&#1608;&#1605;&#1577;:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">grep processor /proc/cpuinfo | wc -l</pre><p dir="rtl">&#1601;&#1604;&#1606;&#1601;&#1578;&#1585;&#1616;&#1590; &#1571;&#1606;&#1617; &#1606;&#1578;&#1610;&#1580;&#1577;&#1614; &#1578;&#1606;&#1601;&#1610;&#1584; &#1575;&#1604;&#1571;&#1605;&#1585; &#1607;&#1610;&#1617; 1. &#1610;&#1593;&#1606;&#1610; &#1607;&#1584;&#1575; &#1571;&#1606;&#1617;&#1607; &#1610;&#1608;&#1580;&#1583; &#1601;&#1610; &#1575;&#1604;&#1606;&#1617;&#1592;&#1575;&#1605; &#1604;&#1583;&#1610;&#1606;&#1575; &#1606;&#1608;&#1575;&#1577;&#1612; &#1608;&#1575;&#1581;&#1583;&#1577;.</p><p dir="rtl">&#1575;&#1604;&#1605;&#1615;&#1578;&#1594;&#1610;&#1617;&#1585; &#1575;&#1604;&#1579;&#1617;&#1575;&#1606;&#1610; <span style="font-family:courier new,courier,monospace;">worker_connections</span> &#1610;&#1615;&#1593;&#1591;&#1610; &#1593;&#1583;&#1583;&#1614; &#1575;&#1604;&#1575;&#1578;&#1617;&#1589;&#1575;&#1604;&#1575;&#1578; &#1575;&#1604;&#1617;&#1578;&#1610; &#1610;&#1615;&#1605;&#1603;&#1606; &#1604;&#1593;&#1605;&#1604;&#1610;&#1617;&#1575;&#1578; &#1605;&#1606; &#1606;&#1608;&#1593; Worker &#1575;&#1604;&#1575;&#1587;&#1578;&#1580;&#1575;&#1576;&#1577; &#1604;&#1607;&#1575; &#1601;&#1610; &#1606;&#1601;&#1587; &#1575;&#1604;&#1608;&#1602;&#1578;. &#1575;&#1604;&#1602;&#1610;&#1605;&#1577; &#1575;&#1604;&#1575;&#1601;&#1578;&#1585;&#1575;&#1590;&#1610;&#1617;&#1577; &#1607;&#1610; <span style="font-family:courier new,courier,monospace;">768</span>.&#1601;&#1610; &#1575;&#1604;&#1593;&#1575;&#1583;&#1577;&#1548; &#1610;&#1615;&#1585;&#1587;&#1616;&#1604; &#1605;&#1578;&#1589;&#1601;&#1617;&#1581; &#1575;&#1604;&#1608;&#1610;&#1576; &#1591;&#1604;&#1576;&#1610;&#1618;&#1606; - &#1593;&#1604;&#1609; &#1575;&#1604;&#1571;&#1602;&#1604; - &#1601;&#1610; &#1606;&#1601;&#1587; &#1575;&#1604;&#1608;&#1602;&#1578; &#1573;&#1604;&#1609; &#1575;&#1604;&#1582;&#1575;&#1583;&#1608;&#1605;&#1548; &#1608;&#1607;&#1608; &#1605;&#1575; &#1610;&#1593;&#1606;&#1610; &#1571;&#1606;&#1617; &#1593;&#1583;&#1583; &#1575;&#1604;&#1593;&#1605;&#1604;&#1575;&#1569; &#1575;&#1604;&#1617;&#1584;&#1610;&#1606; &#1610;&#1615;&#1605;&#1603;&#1616;&#1606; &#1575;&#1604;&#1585;&#1617;&#1583; &#1593;&#1604;&#1610;&#1607;&#1605; &#1601;&#1610; &#1606;&#1601;&#1587; &#1575;&#1604;&#1608;&#1602;&#1578; &#1610;&#1576;&#1604;&#1594; &#1601;&#1610; &#1571;&#1593;&#1604;&#1609; &#1578;&#1602;&#1583;&#1610;&#1585; &#1606;&#1589;&#1601;&#1614; &#1602;&#1610;&#1605;&#1577;&#1616; &#1575;&#1604;&#1605;&#1615;&#1578;&#1594;&#1610;&#1617;&#1616;&#1585; <span style="font-family:courier new,courier,monospace;">worker_connections</span>. &#1605;&#1606; &#1571;&#1580;&#1604; &#1575;&#1604;&#1585;&#1617;&#1601;&#1593; &#1605;&#1606; &#1593;&#1583;&#1583; &#1575;&#1604;&#1593;&#1615;&#1605;&#1604;&#1575;&#1569; &#1575;&#1604;&#1605;&#1615;&#1578;&#1617;&#1589;&#1604;&#1610;&#1606; &#1601;&#1610; &#1570;&#1606;&#1613; &#1605;&#1593;&#1611;&#1575; &#1587;&#1606;&#1615;&#1593;&#1591;&#1610; &#1604;&#1607;&#1584;&#1575; &#1575;&#1604;&#1605;&#1615;&#1578;&#1594;&#1610;&#1617;&#1616;&#1585; &#1571;&#1593;&#1604;&#1609; &#1602;&#1610;&#1605;&#1577; &#1578;&#1587;&#1605;&#1581; &#1576;&#1607;&#1575; &#1605;&#1608;&#1575;&#1585;&#1583; &#1575;&#1604;&#1580;&#1607;&#1575;&#1586;&#1548; &#1608;&#1575;&#1604;&#1617;&#1578;&#1610; &#1610;&#1615;&#1605;&#1603;&#1616;&#1606; &#1605;&#1593;&#1585;&#1601;&#1578;&#1607;&#1575; &#1593;&#1606; &#1591;&#1585;&#1610;&#1602; &#1575;&#1604;&#1571;&#1605;&#1585;:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">ulimit -n</pre><p dir="rtl">&#1587;&#1578;&#1578;&#1594;&#1610;&#1617;&#1614;&#1585; &#1575;&#1604;&#1606;&#1617;&#1578;&#1610;&#1580;&#1577; &#1581;&#1587;&#1576; &#1575;&#1604;&#1580;&#1607;&#1575;&#1586; &#1608;&#1575;&#1604;&#1605;&#1608;&#1575;&#1585;&#1583; &#1575;&#1604;&#1605;&#1615;&#1578;&#1608;&#1601;&#1617;&#1585;&#1577; &#1604;&#1607;. &#1606;&#1571;&#1582;&#1584; &#1605;&#1579;&#1575;&#1604;&#1611;&#1575; &#1576;&#1580;&#1607;&#1575;&#1586; &#1584;&#1610; &#1573;&#1605;&#1603;&#1575;&#1606;&#1610;&#1617;&#1575;&#1578; &#1605;&#1581;&#1583;&#1608;&#1583;&#1577; &#1581;&#1610;&#1579;&#1615; &#1578;&#1615;&#1587;&#1575;&#1608;&#1610; &#1607;&#1584;&#1607; &#1575;&#1604;&#1602;&#1610;&#1605;&#1577; <span style="font-family:courier new,courier,monospace;">1024</span>.</p><p dir="rtl">&#1606;&#1615;&#1581;&#1583;&#1617;&#1616;&#1579; &#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; Nginx &#1593;&#1576;&#1585; &#1601;&#1578;&#1581; &#1605;&#1604;&#1601;&#1617; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583; <span style="font-family:courier new,courier,monospace;">nginx.conf</span> &#1608;&#1578;&#1581;&#1585;&#1610;&#1585;&#1607;:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">sudo nano /etc/nginx/nginx.conf</pre><p dir="rtl">&#1606;&#1615;&#1593;&#1591;&#1610; &#1575;&#1604;&#1602;&#1610;&#1605;&#1577; <span style="font-family:courier new,courier,monospace;">1</span> &#1604;&#1600; <span style="font-family:courier new,courier,monospace;">worker_processes</span> &#1608;&#1575;&#1604;&#1602;&#1610;&#1605;&#1577; <span style="font-family:courier new,courier,monospace;">1024</span> &#1604;&#1600;<span style="font-family:courier new,courier,monospace;">worker_connections</span>:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">worker_processes 1;
worker_connections 1024;</pre><p dir="rtl">&#1610;&#1580;&#1576; &#1575;&#1604;&#1575;&#1606;&#1578;&#1576;&#1575;&#1607; &#1607;&#1606;&#1575; &#1573;&#1604;&#1609; &#1571;&#1606;&#1617; &#1593;&#1583;&#1583; &#1575;&#1604;&#1575;&#1578;&#1617;&#1589;&#1575;&#1604;&#1575;&#1578; &#1575;&#1604;&#1603;&#1604;&#1617;&#1610; &#1575;&#1604;&#1617;&#1578;&#1610; &#1610;&#1602;&#1576;&#1604;&#1607; Nginx &#1601;&#1610; &#1606;&#1601;&#1587; &#1575;&#1604;&#1608;&#1602;&#1578; &#1610;&#1615;&#1587;&#1575;&#1608;&#1610; &#1580;&#1583;&#1575;&#1569;&#1614; &#1602;&#1610;&#1605;&#1578;&#1614;&#1610;&#1618; &#1575;&#1604;&#1605;&#1615;&#1578;&#1594;&#1610;&#1617;&#1585;&#1610;&#1618;&#1606; <span style="font-family:courier new,courier,monospace;">worker_processes</span> &#1608; <span style="font-family:courier new,courier,monospace;">worker_connections</span>. &#1571;&#1610;&#1548; &#1601;&#1610; &#1581;&#1575;&#1604; &#1575;&#1604;&#1578;&#1586;&#1605;&#1606;&#1575; &#1576;&#1575;&#1604;&#1602;&#1575;&#1593;&#1583;&#1577; &#1575;&#1604;&#1587;&#1617;&#1575;&#1576;&#1602;&#1577;&#1548; &#1593;&#1583;&#1583;&#1614; &#1575;&#1604;&#1571;&#1606;&#1608;&#1610;&#1617;&#1577; &#1605;&#1590;&#1585;&#1608;&#1576;&#1611;&#1575; &#1576;&#1593;&#1583;&#1583; &#1575;&#1604;&#1575;&#1578;&#1617;&#1589;&#1575;&#1604;&#1575;&#1578; &#1575;&#1604;&#1617;&#1578;&#1610; &#1610;&#1615;&#1605;&#1603;&#1606; &#1604;&#1603;&#1604; &#1593;&#1575;&#1605;&#1616;&#1604; &#1575;&#1604;&#1575;&#1587;&#1578;&#1580;&#1575;&#1576;&#1577; &#1604;&#1607;&#1575;. &#1601;&#1610; &#1605;&#1579;&#1575;&#1604;&#1606;&#1575; &#1607;&#1606;&#1575; &#1575;&#1604;&#1606;&#1617;&#1578;&#1610;&#1580;&#1577; &#1607;&#1610;&#1617; 1024 (&#1581;&#1575;&#1589;&#1604; &#1590;&#1585;&#1576; 1024 &#1576; 1). &#1610;&#1608;&#1580;&#1583; &#1571;&#1610;&#1590;&#1611;&#1575; &#1605;&#1615;&#1578;&#1594;&#1610;&#1617;&#1616;&#1585; <span style="font-family:courier new,courier,monospace;">keepalive_timeout</span> &#1608;&#1575;&#1604;&#1617;&#1584;&#1610; &#1610;&#1615;&#1605;&#1603;&#1606; &#1604;&#1602;&#1610;&#1605;&#1578;&#1607; &#1571;&#1606; &#1578;&#1615;&#1602;&#1604;&#1617;&#1616;&#1604;&#1614; &#1605;&#1606; &#1593;&#1583;&#1583; &#1575;&#1604;&#1575;&#1578;&#1617;&#1589;&#1575;&#1604;&#1575;&#1578; &#1575;&#1604;&#1601;&#1593;&#1604;&#1610;&#1617;&#1577; (&#1587;&#1606;&#1578;&#1591;&#1585;&#1617;&#1602; &#1604;&#1607;&#1584;&#1575; &#1575;&#1604;&#1605;&#1578;&#1594;&#1610;&#1617;&#1616;&#1585;).</p><h2 dir="rtl">&#1575;&#1604;&#1589;&#1617;&#1617;&#1615;&#1608;&#1617;&#1614;&#1575;&#1606;&#1575;&#1578;&nbsp;Buffers</h2><p dir="rtl">&#1610;&#1615;&#1605;&#1603;&#1616;&#1606; &#1571;&#1606; &#1610;&#1606;&#1578;&#1615;&#1580; &#1593;&#1606; &#1578;&#1593;&#1583;&#1610;&#1604; &#1581;&#1580;&#1605; &#1575;&#1604;&#1589;&#1617;&#1616;&#1608;&#1575;&#1606; (&#1608;&#1607;&#1610; &#1605;&#1606;&#1591;&#1602;&#1577; &#1578;&#1582;&#1586;&#1610;&#1606; &#1605;&#1615;&#1572;&#1602;&#1617;&#1578; &#1590;&#1605;&#1606; &#1584;&#1575;&#1603;&#1585;&#1577; &#1575;&#1604;&#1608;&#1589;&#1608;&#1604; &#1575;&#1604;&#1593;&#1588;&#1608;&#1575;&#1574;&#1610; RAM&#1548; &#1578;&#1615;&#1587;&#1578;&#1582;&#1583;&#1605; &#1604;&#1606;&#1602;&#1604; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606;&#1575;&#1578; &#1576;&#1610;&#1606; &#1575;&#1604;&#1593;&#1605;&#1604;&#1610;&#1617;&#1575;&#1578;) &#1578;&#1594;&#1610;&#1617;&#1585;&#1575;&#1578; &#1605;&#1615;&#1593;&#1578;&#1576;&#1585;&#1577; &#1601;&#1610; &#1575;&#1604;&#1571;&#1583;&#1575;&#1569;. &#1573;&#1584;&#1575; &#1603;&#1575;&#1606; &#1581;&#1580;&#1605; &#1575;&#1604;&#1589;&#1617;&#1616;&#1608;&#1575;&#1606; &#1589;&#1594;&#1610;&#1585;&#1611;&#1575; &#1601;&#1573;&#1606; Nginx &#1587;&#1610;&#1581;&#1578;&#1575;&#1580; &#1573;&#1604;&#1609; &#1573;&#1606;&#1588;&#1575;&#1569; &#1605;&#1604;&#1601;&#1617; &#1578;&#1582;&#1586;&#1610;&#1606; &#1605;&#1572;&#1602;&#1617;&#1614;&#1578; Temporary file &#1605;&#1605;&#1617;&#1575; &#1610;&#1615;&#1572;&#1583;&#1617;&#1610; &#1573;&#1604;&#1609; &#1603;&#1579;&#1585;&#1577; &#1575;&#1604;&#1602;&#1585;&#1575;&#1569;&#1577; &#1608;&#1575;&#1604;&#1603;&#1616;&#1578;&#1575;&#1576;&#1577; &#1605;&#1606; &#1575;&#1604;&#1602;&#1585;&#1589; &#1575;&#1604;&#1589;&#1617;&#1604;&#1576;. &#1578;&#1608;&#1580;&#1583; &#1576;&#1593;&#1590; &#1575;&#1604;&#1578;&#1617;&#1593;&#1604;&#1610;&#1605;&#1575;&#1578; &#1575;&#1604;&#1617;&#1578;&#1610; &#1606;&#1581;&#1578;&#1575;&#1580; &#1604;&#1601;&#1607;&#1605;&#1607;&#1575; &#1602;&#1576;&#1604; &#1573;&#1580;&#1585;&#1575;&#1569; &#1571;&#1610;&#1617; &#1578;&#1593;&#1583;&#1610;&#1604;.</p><ul><li><p dir="rtl"><span style="font-family:courier new,courier,monospace;">client_body_buffer_size</span>: &#1581;&#1580;&#1605; &#1589;&#1616;&#1608;&#1575;&#1606; &#1575;&#1604;&#1593;&#1605;&#1610;&#1604; Client (&#1608;&#1581;&#1583;&#1577; &#1575;&#1604;&#1581;&#1580;&#1605; &#1601;&#1610; &#1603;&#1575;&#1605;&#1604; &#1605;&#1604;&#1601; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1607;&#1610;&#1617; &#1575;&#1604;&#1576;&#1575;&#1610;&#1578; Byte&#1548; &#1610;&#1615;&#1588;&#1610;&#1585; &#1581;&#1585;&#1601; K &#1573;&#1604;&#1609; &#1603;&#1610;&#1604;&#1608;&#1576;&#1575;&#1610;&#1578; KB) &#1571;&#1610; &#1581;&#1580;&#1605; &#1575;&#1604;&#1580;&#1587;&#1605; Body &#1601;&#1610; &#1591;&#1604;&#1576; Http &#1571;&#1579;&#1606;&#1575;&#1569; &#1573;&#1580;&#1585;&#1575;&#1569; <span style="font-family:courier new,courier,monospace;">POST</span>. &#1578;&#1615;&#1587;&#1578;&#1582;&#1583;&#1614;&#1605; &#1573;&#1580;&#1585;&#1575;&#1569;&#1575;&#1578; <span style="font-family:courier new,courier,monospace;">POST</span> &#1571;&#1587;&#1575;&#1587;&#1611;&#1575; &#1593;&#1606;&#1583; &#1573;&#1585;&#1587;&#1575;&#1604; &#1575;&#1604;&#1606;&#1617;&#1605;&#1575;&#1584;&#1580;</p></li><li><p dir="rtl"><span style="font-family:courier new,courier,monospace;">client_header_buffer_size</span>: &#1605;&#1615;&#1588;&#1575;&#1576;&#1607;&#1577; &#1604;&#1604;&#1578;&#1617;&#1593;&#1604;&#1610;&#1605;&#1577; &#1575;&#1604;&#1587;&#1617;&#1575;&#1576;&#1602;&#1577;&#1548; &#1608;&#1604;&#1603;&#1606; &#1604;&#1581;&#1580;&#1605; &#1575;&#1604;&#1578;&#1617;&#1585;&#1608;&#1610;&#1587;&#1577; Header &#1601;&#1610; &#1591;&#1604;&#1576; Http. &#1581;&#1580;&#1605; 1KB &#1605;&#1606;&#1575;&#1587;&#1616;&#1576; - &#1594;&#1575;&#1604;&#1576;&#1611;&#1575; - &#1604;&#1607;&#1584;&#1607; &#1575;&#1604;&#1578;&#1617;&#1593;&#1604;&#1610;&#1605;&#1577;.</p></li><li><p dir="rtl"><span style="font-family:courier new,courier,monospace;">client_max_body_size</span>: &#1575;&#1604;&#1581;&#1580;&#1605; &#1575;&#1604;&#1571;&#1602;&#1589;&#1609; &#1575;&#1604;&#1605;&#1587;&#1605;&#1608;&#1581; &#1576;&#1607; &#1604;&#1591;&#1604;&#1576; &#1575;&#1604;&#1593;&#1605;&#1610;&#1604;. &#1573;&#1584;&#1575; &#1578;&#1580;&#1575;&#1608;&#1586; &#1591;&#1604;&#1576; &#1575;&#1604;&#1593;&#1605;&#1610;&#1604; &#1607;&#1584;&#1575; &#1575;&#1604;&#1581;&#1580;&#1605; &#1601;&#1573;&#1606; &#1582;&#1575;&#1583;&#1608;&#1605; &#1608;&#1610;&#1576; Nginx &#1587;&#1610;&#1615;&#1580;&#1610;&#1576; &#1576;&#1582;&#1591;&#1571; 413 (&#1605;&#1581;&#1578;&#1608;&#1609; &#1575;&#1604;&#1591;&#1617;&#1604;&#1576; &#1571;&#1603;&#1576;&#1585; &#1605;&#1606; &#1575;&#1604;&#1605;&#1587;&#1605;&#1608;&#1581; &#1576;&#1607; Request Entity Too Large).</p></li><li><p dir="rtl"><span style="font-family:courier new,courier,monospace;">large_client_header_buffers</span>: &#1575;&#1604;&#1593;&#1583;&#1583; &#1575;&#1604;&#1571;&#1593;&#1604;&#1609; &#1608;&#1575;&#1604;&#1581;&#1580;&#1605; &#1575;&#1604;&#1571;&#1602;&#1589;&#1609; &#1604;&#1604;&#1589;&#1617;&#1615;&#1608;&#1617;&#1575;&#1606; &#1576;&#1575;&#1604;&#1606;&#1617;&#1587;&#1576;&#1577; &#1604;&#1604;&#1578;&#1617;&#1585;&#1608;&#1610;&#1587;&#1575;&#1578; &#1575;&#1604;&#1593;&#1585;&#1610;&#1590;&#1577; &#1601;&#1610; &#1591;&#1604;&#1576; &#1575;&#1604;&#1593;&#1605;&#1610;&#1604;. &#1601;&#1610; &#1581;&#1575;&#1604; &#1603;&#1575;&#1606; &#1587;&#1591;&#1585; &#1575;&#1604;&#1591;&#1617;&#1604;&#1576; &#1571;&#1603;&#1576;&#1585; &#1605;&#1606; &#1581;&#1580;&#1605; &#1575;&#1604;&#1589;&#1617;&#1616;&#1608;&#1617;&#1575;&#1606; &#1601;&#1573;&#1606; &#1582;&#1575;&#1583;&#1608;&#1605; &#1575;&#1604;&#1608;&#1610;&#1576; &#1610;&#1615;&#1580;&#1610;&#1576; &#1576;&#1582;&#1591;&#1571; 414 (&#1605;&#1587;&#1575;&#1585; URI &#1604;&#1604;&#1591;&#1617;&#1604;&#1576; &#1571;&#1591;&#1608;&#1604; &#1605;&#1606; &#1575;&#1604;&#1605;&#1587;&#1605;&#1608;&#1581; &#1576;&#1607; Request URI too large). &#1606;&#1601;&#1587; &#1575;&#1604;&#1588;&#1617;&#1610;&#1569; &#1576;&#1575;&#1604;&#1606;&#1617;&#1587;&#1576;&#1577; &#1604;&#1604;&#1578;&#1617;&#1585;&#1608;&#1610;&#1587;&#1577; &#1601;&#1610; &#1575;&#1604;&#1591;&#1617;&#1604;&#1576; &#1573;&#1584; &#1604;&#1575; &#1610;&#1580;&#1608;&#1586; &#1571;&#1606; &#1578;&#1578;&#1580;&#1575;&#1608;&#1586; &#1581;&#1580;&#1605; &#1575;&#1604;&#1589;&#1617;&#1616;&#1608;&#1575;&#1606; &#1575;&#1604;&#1605;&#1587;&#1605;&#1608;&#1581; &#1576;&#1607; &#1601;&#1610; &#1607;&#1584;&#1607; &#1575;&#1604;&#1578;&#1617;&#1593;&#1604;&#1610;&#1605;&#1577; &#1608;&#1573;&#1604;&#1575;&#1617; &#1601;&#1573;&#1606;&#1617; Nginx &#1587;&#1610;&#1615;&#1580;&#1610;&#1576; &#1576;&#1582;&#1591;&#1571; 400 (&#1591;&#1604;&#1576; &#1594;&#1610;&#1585; &#1589;&#1575;&#1604;&#1581; Bad request). &#1610;&#1615;&#1588;&#1610;&#1585; &#1575;&#1604;&#1593;&#1583;&#1583; &#1601;&#1610; &#1607;&#1584;&#1607; &#1575;&#1604;&#1578;&#1617;&#1593;&#1604;&#1610;&#1605;&#1577; &#1573;&#1604;&#1609; &#1575;&#1604;&#1593;&#1583;&#1583; &#1575;&#1604;&#1571;&#1593;&#1604;&#1609; &#1605;&#1606; &#1575;&#1604;&#1591;&#1617;&#1604;&#1576;&#1575;&#1578; &#1584;&#1575;&#1578; &#1575;&#1604;&#1578;&#1617;&#1585;&#1608;&#1610;&#1587;&#1577; &#1575;&#1604;&#1593;&#1585;&#1610;&#1590;&#1577; (&#1571;&#1610; &#1578;&#1585;&#1608;&#1610;&#1587;&#1577; &#1576;&#1581;&#1580;&#1605; &#1571;&#1603;&#1576;&#1585; &#1605;&#1606; &#1575;&#1604;&#1605;&#1615;&#1581;&#1583;&#1617;&#1614;&#1583; &#1601;&#1610; <span style="font-family:courier new,courier,monospace;">client_header_buffer_size</span>) &#1575;&#1604;&#1605;&#1587;&#1605;&#1608;&#1581; &#1576;&#1607;&#1575;.</p></li></ul><p dir="rtl">&#1605;&#1579;&#1575;&#1604; &#1593;&#1604;&#1609; &#1602;&#1616;&#1610;&#1617;&#1605; &#1604;&#1604;&#1605;&#1578;&#1594;&#1610;&#1617;&#1585;&#1575;&#1578; &#1575;&#1604;&#1587;&#1617;&#1575;&#1576;&#1602; &#1584;&#1603;&#1585;&#1607;&#1575;:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">client_body_buffer_size 10K;
client_header_buffer_size 1k;
client_max_body_size 8m;
large_client_header_buffers 2 1k;</pre><h2><span style="line-height: 1.6;">&#1575;&#1604;&#1605;&#1615;&#1607;&#1614;&#1604; Timeouts</span></h2><p dir="rtl">&#1575;&#1604;&#1605;&#1615;&#1607;&#1604; &#1607;&#1610; &#1605;&#1615;&#1578;&#1594;&#1610;&#1617;&#1585;&#1575;&#1578; &#1571;&#1582;&#1585;&#1609; &#1578;&#1615;&#1608;&#1617;&#1579;&#1617;&#1585; &#1603;&#1579;&#1610;&#1585;&#1611;&#1575; &#1593;&#1604;&#1609; &#1571;&#1583;&#1575;&#1569; Nginx.</p><p dir="rtl">&#1578;&#1615;&#1581;&#1583;&#1617;&#1583; &#1578;&#1593;&#1604;&#1610;&#1605;&#1578;&#1614;&#1575; <span style="font-family:courier new,courier,monospace;">client_body_timeout</span> &#1608; <span style="font-family:courier new,courier,monospace;">client_header_timeout</span> &#1575;&#1604;&#1605;&#1607;&#1604;&#1577; &#1575;&#1604;&#1586;&#1617;&#1605;&#1606;&#1610;&#1617;&#1577; (&#1576;&#1575;&#1604;&#1579;&#1617;&#1575;&#1606;&#1610;&#1617;&#1577;) &#1575;&#1604;&#1617;&#1578;&#1610; &#1610;&#1606;&#1578;&#1592;&#1585;&#1607;&#1575; &#1575;&#1604;&#1582;&#1575;&#1583;&#1608;&#1605; &#1604;&#1578;&#1604;&#1602;&#1610; &#1605;&#1581;&#1578;&#1608;&#1609; &#1571;&#1608; &#1578;&#1585;&#1608;&#1610;&#1587;&#1577; &#1575;&#1604;&#1593;&#1605;&#1610;&#1604; &#1593;&#1604;&#1609; &#1575;&#1604;&#1578;&#1617;&#1608;&#1575;&#1604;&#1610; &#1576;&#1593;&#1583;&#1614; &#1575;&#1587;&#1578;&#1604;&#1575;&#1605; &#1575;&#1604;&#1591;&#1617;&#1604;&#1576; &#1605;&#1606;&#1607;. &#1573;&#1606; &#1604;&#1605; &#1610;&#1578;&#1604;&#1602;&#1617;&#1614; &#1575;&#1604;&#1582;&#1575;&#1583;&#1608;&#1605; &#1608;&#1575;&#1581;&#1583;&#1611;&#1575; &#1605;&#1606; &#1575;&#1604;&#1575;&#1579;&#1606;&#1610;&#1618;&#1606; &#1582;&#1604;&#1575;&#1604; &#1607;&#1584;&#1607; &#1575;&#1604;&#1601;&#1578;&#1585;&#1577; &#1601;&#1587;&#1610;&#1615;&#1580;&#1610;&#1576; &#1576;&#1582;&#1591;&#1571; 408 (&#1575;&#1606;&#1578;&#1607;&#1614;&#1578; &#1605;&#1615;&#1607;&#1604;&#1577; &#1575;&#1604;&#1591;&#1617;&#1604;&#1576; Request time out).</p><p dir="rtl">&#1571;&#1605;&#1617;&#1575; &#1578;&#1593;&#1604;&#1610;&#1605;&#1577; <span style="font-family:courier new,courier,monospace;">keepalive_timeout</span> &#1601;&#1578;&#1615;&#1581;&#1583;&#1617;&#1583; &#1575;&#1604;&#1605;&#1607;&#1604;&#1577; &#1575;&#1604;&#1586;&#1605;&#1606;&#1610;&#1617;&#1577; &#1604;&#1575;&#1578;&#1617;&#1589;&#1575;&#1604;&#1575;&#1578; &#1575;&#1587;&#1578;&#1605;&#1585;&#1575;&#1585; &#1575;&#1604;&#1606;&#1617;&#1588;&#1575;&#1591; Keep-alive connections. &#1576;&#1593;&#1576;&#1575;&#1585;&#1577; &#1571;&#1582;&#1585;&#1609;&#1548; &#1587;&#1610;&#1602;&#1591;&#1593; Nginx &#1575;&#1604;&#1575;&#1578;&#1617;&#1589;&#1575;&#1604; &#1576;&#1593;&#1583; &#1575;&#1606;&#1602;&#1590;&#1575;&#1569; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1615;&#1607;&#1604;&#1577; &#1576;&#1594;&#1590; &#1575;&#1604;&#1606;&#1617;&#1592;&#1585; &#1593;&#1605;&#1617;&#1575; &#1610;&#1615;&#1585;&#1610;&#1583; &#1575;&#1604;&#1593;&#1605;&#1610;&#1604;.</p><p dir="rtl">&#1578;&#1608;&#1580;&#1583; &#1571;&#1610;&#1590;&#1611;&#1575; <span style="font-family:courier new,courier,monospace;">send_timeout</span> &#1608;&#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1615;&#1593;&#1606;&#1609; &#1576;&#1575;&#1604;&#1601;&#1578;&#1585;&#1577; &#1575;&#1604;&#1586;&#1617;&#1605;&#1606;&#1610;&#1577; &#1576;&#1610;&#1606; &#1593;&#1605;&#1604;&#1610;&#1617;&#1578;&#1614;&#1610;&#1618; &#1602;&#1585;&#1575;&#1569;&#1577; &#1605;&#1606; &#1591;&#1585;&#1601; &#1575;&#1604;&#1593;&#1605;&#1610;&#1604;. &#1573;&#1606;&#1618; &#1604;&#1605; &#1610;&#1615;&#1585;&#1587;&#1616;&#1604; &#1575;&#1604;&#1593;&#1605;&#1610;&#1604; &#1571;&#1610;&#1617; &#1591;&#1604;&#1576; &#1582;&#1604;&#1575;&#1604; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1607;&#1604;&#1577; &#1601;&#1587;&#1610;&#1602;&#1591;&#1593; &#1582;&#1575;&#1583;&#1608;&#1605; &#1575;&#1604;&#1608;&#1610;&#1576; &#1575;&#1604;&#1575;&#1578;&#1617;&#1589;&#1575;&#1604;&#1614; &#1576;&#1607;&#1548; &#1583;&#1608;&#1606; &#1575;&#1593;&#1578;&#1576;&#1575;&#1585; &#1604;&#1602;&#1610;&#1605;&#1577; &#1575;&#1604;&#1578;&#1617;&#1593;&#1604;&#1610;&#1605;&#1577; &#1575;&#1604;&#1587;&#1617;&#1575;&#1576;&#1602;&#1577;.</p><p dir="rtl">&#1605;&#1579;&#1575;&#1604; &#1593;&#1604;&#1609; &#1602;&#1610;&#1617;&#1605; &#1604;&#1605;&#1578;&#1594;&#1610;&#1617;&#1585;&#1575;&#1578; &#1575;&#1604;&#1605;&#1615;&#1607;&#1614;&#1604; &#1575;&#1604;&#1586;&#1617;&#1605;&#1606;&#1610;&#1617;&#1577;:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">client_body_timeout 12;
client_header_timeout 12;
keepalive_timeout 15;
send_timeout 10;

</pre><h2 dir="rtl">&#1575;&#1604;&#1590;&#1617;&#1594;&#1591; Compression &#1576;&#1608;&#1575;&#1587;&#1591;&#1577; Gzip</h2><p dir="rtl">&#1610;&#1615;&#1605;&#1603;&#1616;&#1606; &#1604;&#1571;&#1583;&#1575;&#1577; &#1575;&#1604;&#1590;&#1617;&#1594;&#1591; &#1608;&#1601;&#1603;&#1617; &#1575;&#1604;&#1590;&#1617;&#1594;&#1591; Gzip &#1575;&#1604;&#1605;&#1615;&#1587;&#1575;&#1593;&#1583;&#1577; &#1601;&#1610; &#1578;&#1581;&#1587;&#1610;&#1606; &#1571;&#1583;&#1575;&#1569; &#1582;&#1575;&#1583;&#1608;&#1605; &#1575;&#1604;&#1608;&#1610;&#1576; &#1593;&#1576;&#1585; &#1575;&#1604;&#1578;&#1617;&#1602;&#1604;&#1610;&#1604; &#1605;&#1606; &#1581;&#1580;&#1605; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606;&#1575;&#1578; &#1575;&#1604;&#1605;&#1615;&#1578;&#1576;&#1575;&#1583;&#1604;&#1577;&#1563; &#1604;&#1603;&#1606; &#1610;&#1606;&#1576;&#1594;&#1610; &#1575;&#1604;&#1581;&#1584;&#1585; &#1605;&#1606; &#1585;&#1601;&#1593; &#1602;&#1610;&#1605;&#1577; &#1605;&#1587;&#1578;&#1608;&#1609; &#1575;&#1604;&#1590;&#1617;&#1594;&#1591; gzip_comp_level &#1604;&#1605;&#1587;&#1578;&#1608;&#1609; &#1593;&#1575;&#1604;&#1613; &#1573;&#1584; &#1610;&#1615;&#1605;&#1603;&#1606; &#1571;&#1606; &#1610;&#1615;&#1587;&#1576;&#1617;&#1576; &#1584;&#1604;&#1603; &#1603;&#1579;&#1585;&#1577; &#1606;&#1588;&#1575;&#1591; &#1571;&#1606;&#1608;&#1610;&#1617;&#1577; &#1575;&#1604;&#1605;&#1615;&#1593;&#1575;&#1604;&#1580;.</p><p dir="rtl">&#1604;&#1578;&#1601;&#1593;&#1610;&#1604; &#1575;&#1604;&#1590;&#1617;&#1594;&#1591; &#1606;&#1615;&#1593;&#1591;&#1610; &#1575;&#1604;&#1602;&#1610;&#1605;&#1577; <span style="font-family:courier new,courier,monospace;">on</span> &#1604;&#1578;&#1593;&#1604;&#1610;&#1605;&#1577; <span style="font-family:courier new,courier,monospace;">gzip</span>. &#1578;&#1593;&#1604;&#1610;&#1605;&#1577; <span style="font-family:courier new,courier,monospace;">gzip_min_length</span> &#1578;&#1615;&#1581;&#1583;&#1617;&#1616;&#1583; &#1575;&#1604;&#1581;&#1580;&#1605; &#1575;&#1604;&#1571;&#1583;&#1606;&#1609; &#1604;&#1578;&#1601;&#1593;&#1610;&#1604; &#1575;&#1604;&#1590;&#1617;&#1594;&#1591;&#1548; &#1571;&#1610; &#1571;&#1606;&#1617; &#1605;&#1604;&#1601;&#1617;&#1611;&#1575; &#1576;&#1581;&#1580;&#1605; &#1571;&#1602;&#1604; &#1605;&#1606; &#1602;&#1610;&#1605;&#1577; &#1607;&#1584;&#1607; &#1575;&#1604;&#1578;&#1617;&#1593;&#1604;&#1610;&#1605;&#1577; &#1604;&#1606; &#1610;&#1582;&#1590;&#1593; &#1604;&#1604;&#1590;&#1617;&#1594;&#1591;. &#1610;&#1615;&#1605;&#1603;&#1616;&#1606; &#1578;&#1581;&#1583;&#1610;&#1583; &#1589;&#1610;&#1617;&#1594; &#1575;&#1604;&#1605;&#1604;&#1601;&#1617;&#1575;&#1578; &#1575;&#1604;&#1617;&#1578;&#1610; &#1610;&#1615;&#1591;&#1576;&#1617;&#1614;&#1602; &#1593;&#1604;&#1610;&#1607;&#1575; &#1575;&#1604;&#1590;&#1617;&#1594;&#1591; &#1593;&#1576;&#1585; &#1575;&#1604;&#1578;&#1617;&#1593;&#1604;&#1610;&#1605;&#1577; <span style="font-family:courier new,courier,monospace;">gzip_type</span>. &#1578;&#1608;&#1580;&#1583; &#1571;&#1610;&#1590;&#1611;&#1575; &#1578;&#1593;&#1604;&#1610;&#1605;&#1577; <span style="font-family:courier new,courier,monospace;">gzip_proxied</span> &#1604;&#1578;&#1593;&#1610;&#1610;&#1606; &#1591;&#1585;&#1610;&#1602; &#1575;&#1604;&#1578;&#1617;&#1593;&#1575;&#1605;&#1604; &#1605;&#1593; &#1575;&#1604;&#1591;&#1617;&#1604;&#1576;&#1575;&#1578; &#1575;&#1604;&#1608;&#1575;&#1585;&#1583;&#1577; &#1605;&#1606; &#1593;&#1605;&#1604;&#1575;&#1569; &#1610;&#1605;&#1585;&#1617;&#1608;&#1606; &#1593;&#1576;&#1585; &#1608;&#1587;&#1610;&#1591; Proxy.</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">gzip on;
gzip_comp_level 2;
gzip_min_length 1000;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain application/x-javascript text/xml text/css application/xml;

</pre><h2 dir="rtl">&#1575;&#1604;&#1578;&#1617;&#1582;&#1586;&#1610;&#1606; &#1575;&#1604;&#1605;&#1572;&#1602;&#1578; &#1604;&#1604;&#1605;&#1604;&#1601;&#1575;&#1578; &#1575;&#1604;&#1587;&#1617;&#1575;&#1603;&#1606;&#1577;&nbsp; Static File Caching</h2><p dir="rtl">&#1610;&#1615;&#1587;&#1575;&#1607;&#1605; &#1591;&#1604;&#1576; &#1575;&#1604;&#1578;&#1617;&#1582;&#1586;&#1610;&#1606; &#1575;&#1604;&#1605;&#1615;&#1608;&#1602;&#1617;&#1578; &#1605;&#1606; &#1580;&#1575;&#1606;&#1576; &#1575;&#1604;&#1593;&#1605;&#1610;&#1604; (&#1575;&#1604;&#1605;&#1615;&#1578;&#1589;&#1601;&#1617;&#1616;&#1581;) &#1601;&#1610; &#1575;&#1604;&#1578;&#1617;&#1602;&#1604;&#1610;&#1604; &#1605;&#1606; &#1578;&#1576;&#1575;&#1583;&#1604; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606;&#1575;&#1578; &#1608;&#1575;&#1604;&#1581;&#1601;&#1575;&#1592; &#1593;&#1604;&#1609; &#1605;&#1608;&#1575;&#1585;&#1583; &#1575;&#1604;&#1582;&#1575;&#1583;&#1608;&#1605;. &#1610;&#1580;&#1576; &#1573;&#1583;&#1585;&#1575;&#1580; &#1607;&#1584;&#1607; &#1575;&#1604;&#1578;&#1617;&#1593;&#1604;&#1610;&#1605;&#1577; &#1593;&#1604;&#1609; &#1605;&#1615;&#1587;&#1578;&#1608;&#1609; &#1603;&#1615;&#1578;&#1604;&#1577; &#1575;&#1604;&#1582;&#1575;&#1583;&#1608;&#1605; Server block &#1590;&#1605;&#1606; &#1575;&#1604;&#1605;&#1604;&#1601; &#1575;&#1604;&#1575;&#1601;&#1578;&#1585;&#1575;&#1590;&#1610; &#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1603;&#1615;&#1578;&#1604;&#1577; &#1582;&#1575;&#1583;&#1608;&#1605; Nginx&#1548; &#1603;&#1605;&#1575; &#1601;&#1610; &#1575;&#1604;&#1605;&#1579;&#1575;&#1604; &#1571;&#1583;&#1606;&#1575;&#1607;. &#1593;&#1605;&#1604; &#1575;&#1604;&#1578;&#1617;&#1593;&#1604;&#1610;&#1605;&#1577; &#1610;&#1578;&#1605;&#1579;&#1617;&#1604; &#1601;&#1610; &#1573;&#1582;&#1576;&#1575;&#1585; &#1575;&#1604;&#1593;&#1605;&#1610;&#1604; &#1576;&#1575;&#1604;&#1575;&#1581;&#1578;&#1601;&#1575;&#1592; &#1576;&#1606;&#1587;&#1582;&#1577; &#1605;&#1606; &#1575;&#1604;&#1605;&#1604;&#1601;&#1617; &#1608;&#1593;&#1583;&#1605; &#1578;&#1606;&#1586;&#1610;&#1604;&#1607;&#1575; &#1605;&#1606; &#1575;&#1604;&#1582;&#1575;&#1583;&#1608;&#1605; &#1591;&#1608;&#1575;&#1604; &#1605;&#1583;&#1617;&#1577; &#1605;&#1581;&#1583;&#1617;&#1583;&#1614;&#1577; (365 &#1610;&#1608;&#1605;&#1611;&#1575; &#1601;&#1610; &#1575;&#1604;&#1605;&#1579;&#1575;&#1604;). &#1573;&#1606; &#1575;&#1581;&#1578;&#1575;&#1580; &#1575;&#1604;&#1593;&#1605;&#1610;&#1604; &#1604;&#1571;&#1581;&#1583; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1604;&#1601;&#1617;&#1575;&#1578; &#1582;&#1604;&#1575;&#1604; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1583;&#1617;&#1577; &#1601;&#1587;&#1610;&#1604;&#1580;&#1571; &#1604;&#1604;&#1606;&#1617;&#1587;&#1582;&#1577; &#1575;&#1604;&#1605;&#1608;&#1580;&#1608;&#1583;&#1577; &#1604;&#1583;&#1610;&#1607; &#1608;&#1604;&#1606; &#1610;&#1578;&#1576;&#1575;&#1583;&#1604; &#1576;&#1610;&#1575;&#1606;&#1575;&#1578; &#1605;&#1593; &#1575;&#1604;&#1582;&#1575;&#1583;&#1608;&#1605;.</p><p dir="rtl">&#1578;&#1615;&#1584;&#1603;&#1614;&#1585; &#1601;&#1610; &#1575;&#1604;&#1578;&#1617;&#1593;&#1604;&#1610;&#1605;&#1577; &#1571;&#1606;&#1608;&#1575;&#1593; &#1575;&#1604;&#1605;&#1604;&#1601;&#1617;&#1575;&#1578; &#1575;&#1604;&#1617;&#1578;&#1610; &#1610;&#1615;&#1591;&#1604;&#1614;&#1576; &#1605;&#1606; &#1575;&#1604;&#1593;&#1605;&#1610;&#1604; &#1578;&#1582;&#1586;&#1610;&#1606;&#1607;&#1575; (&#1571;&#1587;&#1575;&#1587;&#1611;&#1575; &#1589;&#1608;&#1617;&#1585; &#1608;&#1605;&#1604;&#1601;&#1575;&#1617;&#1578; &#1578;&#1606;&#1587;&#1610;&#1602; css &#1608;js).</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
}
</pre><h2><span style="line-height: 1.6;">&#1578;&#1593;&#1591;&#1610;&#1604; &#1581;&#1601;&#1592; &#1575;&#1604;&#1587;&#1617;&#1580;&#1604;&#1617;&#1575;&#1578; Logging</span></h2><p dir="rtl">&#1610;&#1581;&#1578;&#1601;&#1592; Nginx &#1601;&#1610; &#1575;&#1604;&#1573;&#1593;&#1583;&#1583;&#1575;&#1578; &#1575;&#1604;&#1575;&#1601;&#1578;&#1585;&#1575;&#1590;&#1610;&#1577; &#1576;&#1603;&#1604;&#1617; &#1591;&#1604;&#1576; &#1610;&#1589;&#1604; &#1573;&#1604;&#1609; &#1575;&#1604;&#1582;&#1575;&#1583;&#1608;&#1605; &#1590;&#1605;&#1606; &#1605;&#1604;&#1601;&#1617; &#1604;&#1604;&#1587;&#1617;&#1580;&#1604;&#1617;&#1575;&#1578; Logs. &#1610;&#1615;&#1605;&#1603;&#1606;&#1603; &#1573;&#1610;&#1602;&#1575;&#1601; &#1607;&#1584;&#1607; &#1575;&#1604;&#1582;&#1575;&#1589;&#1610;&#1617;&#1577; &#1573;&#1584;&#1575; &#1603;&#1606;&#1578;&#1614; &#1578;&#1587;&#1578;&#1582;&#1583;&#1616;&#1605; &#1571;&#1583;&#1575;&#1577;&#1611; <a href="http://academy.hsoub.com/marketing/analytics/">&#1604;&#1578;&#1581;&#1604;&#1610;&#1604; &#1575;&#1604;&#1605;&#1608;&#1575;&#1602;&#1593;</a> &#1593;&#1606; &#1591;&#1585;&#1610;&#1602; &#1573;&#1593;&#1591;&#1575;&#1569; &#1575;&#1604;&#1602;&#1610;&#1605;&#1577; <span style="font-family:courier new,courier,monospace;">off</span> &#1604;&#1604;&#1578;&#1617;&#1593;&#1604;&#1610;&#1605;&#1577; <span style="font-family:courier new,courier,monospace;">access_log</span> &#1603;&#1605;&#1575; &#1607;&#1608;&#1617; &#1605;&#1608;&#1590;&#1617;&#1614;&#1581; &#1571;&#1583;&#1606;&#1575;&#1607;:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">access_log off;</pre><p dir="rtl">&#1571;&#1593;&#1616;&#1583; &#1578;&#1588;&#1594;&#1610;&#1604; &#1582;&#1575;&#1583;&#1608;&#1605; &#1575;&#1604;&#1608;&#1610;&#1576; &#1576;&#1593;&#1583; &#1581;&#1601;&#1592; &#1605;&#1604;&#1601;&#1617; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1581;&#1578;&#1609; &#1578;&#1615;&#1572;&#1582;&#1584; &#1575;&#1604;&#1578;&#1617;&#1593;&#1583;&#1610;&#1604;&#1575;&#1578; &#1601;&#1610; &#1575;&#1604;&#1581;&#1587;&#1576;&#1575;&#1606;:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">sudo service nginx restart</pre><h2 dir="rtl">&#1582;&#1575;&#1578;&#1605;&#1577;</h2><p dir="rtl">&#1582;&#1575;&#1583;&#1608;&#1605; &#1608;&#1610;&#1576; &#1605;&#1590;&#1576;&#1608;&#1591; &#1580;&#1610;&#1617;&#1583;&#1611;&#1575; &#1607;&#1608; &#1582;&#1575;&#1583;&#1608;&#1605; &#1605;&#1615;&#1593;&#1583; &#1608;&#1605;&#1615;&#1607;&#1610;&#1617;&#1614;&#1571; &#1604;&#1610;&#1578;&#1589;&#1585;&#1617;&#1601; &#1581;&#1587;&#1576; &#1606;&#1608;&#1593;&#1610;&#1617;&#1577; &#1575;&#1604;&#1591;&#1617;&#1604;&#1576;&#1575;&#1578; &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1585;&#1583;&#1607;. &#1610;&#1606;&#1576;&#1594;&#1610; &#1575;&#1604;&#1575;&#1606;&#1578;&#1576;&#1575;&#1607; &#1573;&#1604;&#1609; &#1571;&#1606;&#1617;&#1607; &#1604;&#1575; &#1578;&#1608;&#1580;&#1583; &#1602;&#1610;&#1605;&#1577; &#1605;&#1615;&#1579;&#1604;&#1609; &#1604;&#1575; &#1610;&#1606;&#1576;&#1594;&#1610; &#1575;&#1604;&#1605;&#1587;&#1575;&#1587;&#1615; &#1576;&#1607;&#1575; &#1604;&#1571;&#1610;&#1617; &#1605;&#1606; &#1575;&#1604;&#1605;&#1578;&#1594;&#1610;&#1617;&#1585;&#1575;&#1578; &#1608;&#1575;&#1604;&#1578;&#1617;&#1593;&#1604;&#1610;&#1605;&#1575;&#1578; &#1575;&#1604;&#1605;&#1584;&#1603;&#1608;&#1585;&#1577; &#1601;&#1610; &#1607;&#1584;&#1575; &#1575;&#1604;&#1583;&#1617;&#1604;&#1610;&#1604;. &#1610;&#1580;&#1576; &#1590;&#1576;&#1591; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1581;&#1587;&#1576; &#1603;&#1604;&#1617; &#1581;&#1575;&#1604;&#1577; &#1608;&#1605;&#1575; &#1610;&#1615;&#1606;&#1575;&#1587;&#1576;&#1607;&#1575;.</p><p dir="rtl">&#1573;&#1584;&#1575; &#1571;&#1585;&#1583;&#1578;&#1614; &#1575;&#1604;&#1575;&#1587;&#1578;&#1605;&#1585;&#1575;&#1585; &#1601;&#1610; &#1591;&#1585;&#1610;&#1602; &#1575;&#1604;&#1578;&#1617;&#1581;&#1587;&#1610;&#1606; &#1601;&#1610;&#1615;&#1605;&#1603;&#1606;&#1603; &#1578;&#1580;&#1585;&#1576;&#1577; &#1575;&#1604;&#1578;&#1617;&#1608;&#1587;&#1617;&#1593; &#1575;&#1604;&#1571;&#1601;&#1602;&#1610; Horizontal scaling &#1608;<a href="http://academy.hsoub.com/devops/web-servers/nginx/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D9%85%D9%88%D8%A7%D8%B2%D9%86%D8%A9-%D8%A7%D9%84%D8%AD%D9%85%D9%84-load-balancing-%D8%B9%D9%84%D9%89-nginx-r20/">&#1578;&#1608;&#1586;&#1610;&#1593; &#1575;&#1604;&#1581;&#1616;&#1605;&#1604; Load balancing</a>. &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1575;&#1604;&#1605;&#1584;&#1603;&#1608;&#1585;&#1577; &#1601;&#1610; &#1607;&#1584;&#1575; &#1575;&#1604;&#1583;&#1617;&#1604;&#1610;&#1604; &#1604;&#1610;&#1587;&#1578; &#1587;&#1608;&#1609; &#1576;&#1583;&#1575;&#1610;&#1577; &#1601;&#1610; &#1575;&#1604;&#1591;&#1617;&#1585;&#1610;&#1602; &#1573;&#1604;&#1609; &#1578;&#1581;&#1587;&#1610;&#1606;&#1575;&#1578; &#1571;&#1603;&#1576;&#1585;.</p><p dir="rtl">&#1578;&#1585;&#1580;&#1605;&#1577; &ndash; &#1608;&#1576;&#1578;&#1589;&#1585;&#1617;&#1601; &ndash; &#1604;&#1604;&#1605;&#1602;&#1575;&#1604;&nbsp;<a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-optimize-nginx-configuration">How To Optimize Nginx Configuration</a></p>
]]></description><guid isPermaLink="false">31</guid><pubDate>Thu, 23 Apr 2015 06:19:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x625;&#x639;&#x62F;&#x627;&#x62F; &#x645;&#x648;&#x627;&#x632;&#x646;&#x629; &#x627;&#x644;&#x62D;&#x645;&#x644; (Load Balancing) &#x639;&#x644;&#x649; Nginx</title><link>https://academy.hsoub.com/devops/servers/web/nginx/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D9%85%D9%88%D8%A7%D8%B2%D9%86%D8%A9-%D8%A7%D9%84%D8%AD%D9%85%D9%84-load-balancing-%D8%B9%D9%84%D9%89-nginx-r20/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_03/nginx-load-balancing_480x300.png.f233f27da1b08f0f0018a041931dd06b.png" /></p>
<h2 dir="rtl">ما هي موازنة الحمل (Load Balancing)</h2><p dir="rtl">موازنة الحمل هي عبارة عن آلية لتوزيع التدفّق (traffic) على عدّة خواديم افتراضية خاصّة عبرَ تقسيم آلية المعالجة إلى عدّة أجهزة مما يضمن استقرارًا أفضل وتعاملًا أكثر سلاسة مع الأخطاء. خوارزمية Round Robin لموازنة الحمل ترسل الزوار إلى واحدٍ من مجموعة عناوين الـIP. تقوم خوارزمية Round Robin بشكلٍ أساسي بتوزيع حملِ الخادوم دون الحاجة إلى تضمين أي أمورٍ إضافية أخرى، آخذةً بعينِ الاعتبار بعض العوامل المهمة مثل سرعة استجابة الخادوم والمنطقة الجغرافية الخاصة بالزوار.</p><h2 dir="rtl">الإعداد</h2><p dir="rtl">تتطلب الخطوات في هذا الدّرس وجود مستخدمٍ يمتلك صلاحيات الجذر على خادومك الافتراضي الخاص (VPS). يمكنك تعلم كيفية تثبيت واحد في <a rel="external nofollow" href="https://www.digitalocean.com/community/articles/how-to-add-and-delete-users-on-ubuntu-12-04-and-centos-6">دليل إدارة المستخدمين</a>.</p><p dir="rtl">لكي تقوم بتثبيت موازنة الحمل الخاصة بـnginx فيجب بالطبع أن يكون nginx مثبتًا على خادومك الشخصي. يمكنك فعل ذلك بسرعة مع <span style="font-family:'courier new', courier, monospace;">apt-get</span>:</p><pre class="php ipsCode prettyprint">sudo apt-get install nginx
</pre><h2 dir="rtl">وحدة المنبع Upstream Module</h2><p dir="rtl">بهدف تثبيت موازنة الحمل الخاصة بخوارزمية round robin, فإنّه يجب علينا استخدام وحدة المنبع (upstream module) الخاصة بـnginx. سنقوم بإدراج بعض التضبيطات في إعدادات nginx.</p><p dir="rtl">اذهب وافتح إعدادات موقعك (في مثالنا سنستخدم فقط إعدادات المضيف الوهمي الافتراضي):</p><pre class="php ipsCode prettyprint">sudo nano /etc/nginx/sites-available/default</pre><p dir="rtl">سنحتاج إلى إضافة إعدادات موازنة الحمل إلى الملف. أولًا، سنحتاج إلى تضمين وحدة المنبع داخل الملف والتي تبدو هكذا:</p><pre class="php ipsCode prettyprint">upstream backend  {
  server backend1.example.com;
  server backend2.example.com;
  server backend3.example.com;
}</pre><p dir="rtl">بعدها، يجب علينا الإشارة إلى الوحدة داخل الإعدادات بشكلٍ أوضح:</p><pre class="php ipsCode prettyprint"> server {
  location / {
    proxy_pass  http://backend;
  }
}</pre><p dir="rtl">ثم لإعادة تشغيل nginx:</p><pre class="php ipsCode prettyprint">sudo service nginx restart</pre><p dir="rtl">طالما أن جميع الخواديم الافتراضية الخاصة بك في مكانها الصحيح فإنه يجب عليك أن تجد أنّ عملية موازنة الحمل ستبدأ بتوزيع الزوار إلى الخواديم المربوطة بشكلٍ متساوي تلقائيًا.</p><h2 dir="rtl">التوجيهات Directives</h2><p dir="rtl">القسم السابق غطّى كيفية توزيع الحمل بشكلٍ متساوٍ عبر عدّة خواديم افتراضية خاصة. على كل حال، هناك عدة أسباب تجعل هذه الطريقة ليست الطريقة الأكثر فعالية للعمل مع البيانات. هناك عدّة توجيهات يمكننا استخدامها لتوجيه زوار الموقع بطريقة أكثر فعالية.</p><h3 dir="rtl">الوزن</h3><p dir="rtl">من الطرق المستخدمة لبدء تخصيص المستخدمين إلى الخواديم بطريقة أكثر دقّةً هي تخصيص وزنٍ محدد لأجهزة محددة. Nginx يسمح لنا بإسناد رقمٍ يُحدد حجم التدفّق الذي يجب توجيهه إلى كلِّ خادوم.</p><p dir="rtl">يمكن لتثبيت حملٍ مُوازَن يتضمن وزن الخادوم أن يبدو هكذا:</p><pre class="php ipsCode prettyprint">upstream backend  {
  server backend1.example.com weight=1;
  server backend2.example.com weight=2;
  server backend3.example.com weight=4;
}</pre><p dir="rtl">الوزن الافتراضي هو 1. مع وزنٍ بـ2 فإنَّ <span style="font-family:'courier new', courier, monospace;">backend2.example</span> سيتلقّى تدفّقًا أكبر بمرتين من <span style="font-family:'courier new', courier, monospace;">backend1</span>. بينما <span style="font-family:'courier new', courier, monospace;">backend3</span> مع وزن 4 سيتعامل مع تدفّق أكبر بمرتين من التدفّق الذي يستقبله <span style="font-family:'courier new', courier, monospace;">backend2</span> وأكبر بأربع مرات من التدفّق الذي يستقبله <span style="font-family:'courier new', courier, monospace;">backend1</span>.</p><h3 dir="rtl">التلّبيد (Hash)</h3><p dir="rtl">تلّبيد عنوان الـIP يسمح للخواديم أن تستجيب للعملاء (clients) استنادًا إلى عناوين الـIP الخاصة بهم، حيث يتم إرسال الزوار مجددًا إلى نفس الخادوم الافتراضي الخاص في كلّ مرةٍ يزورون الموقع (باستثناء في حال كان الخادوم معطّلًا). إذا تم اكتشاف خادومٍ غير نشيط، فإنّه يتم تعليمه كخادومٍ معطّل. جميع عناوين الـIP التي كان من المفترض أن تقوم بالتوجيه إلى الخادوم المعطل ستقوم حينها تلقائيًا بالتوجيه إلى واحدٍ بديل.</p><p dir="rtl">الإعدادات التالية هي مثال على ذلك:</p><pre class="php ipsCode prettyprint">upstream backend {
  ip_hash;
  server   backend1.example.com;
  server   backend2.example.com;
  server   backend3.example.com  down;
 }</pre><h3 dir="rtl">أقصى عدد لمرّات الفشل (Max Fails)</h3><p dir="rtl">وفقَ إعدادات round robin الافتراضية، فإنّ nginx سيظلّ يرسل البيانات إلى الخواديم الوهمية الخاصّة، حتى لو كانت هذه الخواديم لا تستجيب. “العدد الأقصى لمرّات الفشل" يمكنه تلقائيًا أن يمنع حصولَ هذا عبر تعليم الخواديم التي لا تستجيب تلقائيًا بعد مرور وقتٍ معيّن.</p><p dir="rtl">هناك عاملان مرتبطان بالعدد الأقصى لمرّات الفشل: <span style="font-family:'courier new', courier, monospace;">max_fails</span> و<span style="font-family:'courier new', courier, monospace;"> fall_timeout</span>. يشيرُ الأول إلى العدد الأقصى للمحاولات الفاشلة للاتصال بالخادوم التي يمكن عدّها قبل أن يتم تعليم الخادوم بأنّه غير نشيط. <span style="font-family:'courier new', courier, monospace;">Fall_timeout</span> يحدد طول المدة التي يتم اعتبار الخادوم فيها خارج العمل. بمجرد نفاذ الوقت، ستبدأ محاولات جديدة لإعادة الاتصال بالخادوم. القيمة الافتراضية لهذا المتغير هي 10 ثواني.</p><p dir="rtl">إعدادٌ بسيط سيبدو هكذا:</p><pre class="php ipsCode prettyprint">upstream backend  {
  server backend1.example.com max_fails=3  fail_timeout=15s;
  server backend2.example.com weight=2;
  server backend3.example.com weight=4;
}</pre><p dir="rtl">كان هذا استعراضًا سريعًا لـ Round Robin load balancing. هناك عدّة طرق أخرى قد نتطرّق إليها لاحقًا في مقالات أخرى</p><p dir="rtl"> </p><p dir="rtl">ترجمة -وبتصرّف- للمقال: <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-load-balancing">How To Set Up Nginx Load Balancing</a></p>
]]></description><guid isPermaLink="false">20</guid><pubDate>Fri, 27 Mar 2015 08:04:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x625;&#x639;&#x62F;&#x627;&#x62F; Nginx &#x643;&#x648;&#x633;&#x64A;&#x637; &#x639;&#x643;&#x633;&#x64A; (Reverse Proxy) &#x644;&#x640;Apache</title><link>https://academy.hsoub.com/devops/servers/web/nginx/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-nginx-%D9%83%D9%88%D8%B3%D9%8A%D8%B7-%D8%B9%D9%83%D8%B3%D9%8A-reverse-proxy-%D9%84%D9%80apache-r19/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_03/nginx-reserse-proxy-apache_480x300.png.adfac71ae8ab160346c0c4257abf5122.png" /></p>

<h2 dir="rtl">لِمَاذا قد تودُّ تشغيل Nginx و Apache معًا</h2><p dir="rtl">في الواقع يعتبر كلٌّ من nginx و apache عبارة عن خواديم ويب فعّالة للعمل. حاليًّا يحتل <span style="line-height:11.1999998092651px;">Apache </span>المرتبة الأولى في مجال إدارة الخواديم منذ إطلاقه للعموم في 2006، nginx يصعد بقوة في شتّى أرجاء العالم وهو الآن يحتل المرتبة الثانية في خواديم الويب التي تدير المواقع النشطة. الأسباب وراء شعبية كلّ خادوم واضحة: قوة apache وسرعة nginx المعروفتان لدى الجميع. وعلى كلّ حال، فإن كلًّا من الخادومين يمتلكان نقاط ضعف – apache يستهلك الذاكرة بشراهة، بينما nginx -الذي يؤدي عملًا ممتازًا مع الملفات الثابتة(static files)- يحتاج مساعدة php-fpm أو وحدات مشابهة للتعامل مع المحتوى الديناميكي.</p><p dir="rtl">على كلّ حال، يمكن لأي شخص أن يدمج الخادومين للحصول على فعالية ممتازة، مع استخدام nginx كخادوم ويب للملفات الثابتة بالواجهة (front-end) و apache ليعالج العمليات بالخلفية (back-end).</p><p dir="rtl" style="text-align:center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_03/nginx-reserse-proxy-apache_480x300.png.6f140e39aab54f9862814b736cb5f001.png"><img data-fileid="813" class="ipsImage ipsImage_thumbnailed" alt="nginx-reserse-proxy-apache_480x300.thumb" src="https://academy.hsoub.com/uploads/monthly_2015_03/nginx-reserse-proxy-apache_480x300.thumb.png.596dc7557f87b99fb6ef6104dae56cc0.png"></a></p><h2 dir="rtl">التثبيت</h2><p dir="rtl">لتطبيق الخطوات الموجودة في هذا الدّرس ستحتاج إلى امتلاك صلاحيات المستخدم الجذر root على خادومك الافتراضي الخاص.</p><p dir="rtl">لإنشاء مستخدم يمتلك صلاحيات الجذر، تابع الخطوتيّن الثالثة والرابعة من <a rel="external nofollow" href="https://www.digitalocean.com/community/articles/initial-server-setup-with-ubuntu-12-04">دليل تثبيت خادوم أوبونتو الشامل</a>.</p><h2 dir="rtl">تثبيت nginx</h2><p dir="rtl">لكي نبدأ العمل، سنحتاج إلى تثبيت وإعداد nginx الذي سيخدم واجهة موقعنا. يمكن تثبيته باستخدام <span style="font-family:'courier new', courier, monospace;">apt-get</span> عبر الأمر التالي:</p><pre class="php ipsCode prettyprint">sudo apt-get install nginx
</pre><p dir="rtl">بمجرد أن يتم التثبيت، يمكنك أن تبدأ بإعداد المضيف الوهمي (virtual host) لكي يتم تشغيله بواجهة الموقع.</p><p dir="rtl">هناك بضع تغييرات إضافية علينا عملها في الإعدادات.</p><h2 dir="rtl">إعداد nginx</h2><p dir="rtl">افتح إعدادات nginx عن طريق الأمر:</p><pre class="php ipsCode prettyprint">sudo nano /etc/nginx/sites-available/example</pre><p dir="rtl">الإعدادات التالية ستسمح لك باستخدام nginx كخادوم لواجهة الموقع. هذه الإعدادات مشابهة للإعدادات الافتراضية، تفاصيلها تجدها تحتها.</p><pre class="php ipsCode prettyprint">server {
        listen   80; 
        root /var/www/; 
        index index.php index.html index.htm;
        server_name example.com; 

        location / {
        try_files $uri $uri/ /index.php;
        }

        location ~ \.php$ {
        
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass <a rel="external nofollow" href="http://127.0.0.1:8080">http://127.0.0.1:8080</a>;

         }

         location ~ /\.ht {
                deny all;
        }
}</pre><p dir="rtl">هذه هي التغييرات التي تم عملها على الإعدادات:</p><ul><li><p dir="rtl">مسار الجذر تم تغييره إلى مسار الويب الحالي.</p></li><li><p dir="rtl">ملف <span style="font-family:'courier new', courier, monospace;">index.php</span> تم إضافته إلى سطر الفهرس.</p></li><li><p dir="rtl">دالة <span style="font-family:'courier new', courier, monospace;">try_file</span>s ستحاول القيام بتخديم الزوار مهما كانت الصفحات التي يطلبونها. إذا كان nginx غير قادرٍ على فعل ذلك، حينها يتم إرسال الملف إلى الوسيط (proxy).</p></li><li><p dir="rtl">دالة <span style="font-family:'courier new', courier, monospace;">proxy_pass</span> تسمح لـ nginx أن يتعرف على مسار الخادوم الوسيط.</p></li><li><p dir="rtl">"<span style="font-family:'courier new', courier, monospace;">location ~ /\.ht {</span>" تمنع الموقع من الوصول إلى جميع ملفات <span style="font-family:'courier new', courier, monospace;">.htaccess</span> إذا كان مسار الجذر الخاص بـ Apache يتعارض مع ذاك الخاص بـnginx.</p></li></ul><p dir="rtl">هذه الإعدادات تقوم بإعداد نظامٍ صغير حيث يتم توجيه جميع الملفات التي نهايتها <span style="font-family:'courier new', courier, monospace;">.php</span> إلى خادوم apache ليعالجها بالخلفية والذي سيعمل على المنفذ <span style="font-family:'courier new', courier, monospace;">8080</span>.</p><p dir="rtl">لتفعيل المضيف الوهمي:</p><pre class="php ipsCode prettyprint">sudo ln -s /etc/nginx/sites-available/example /etc/nginx/sites-enabled/example</pre><p dir="rtl">بالإضافة إلى ذلك، علينا حذف إعداد nginx الافتراضي:</p><pre class="php ipsCode prettyprint">sudo rm /etc/nginx/sites-enabled/default</pre><p dir="rtl">الخطوة التالية ستكون تثبيت وإعداد apache.</p><h2 dir="rtl">تثبيت Apache</h2><p dir="rtl">بعد أنّ انتهينا من nginx، حان الوقت لتثبيت واجهة موقعنا الخلفية، apache:</p><pre class="php ipsCode prettyprint">sudo apt-get install apache2</pre><p dir="rtl">بما أنه لم يتم تشغيل nginx بعد، فإنّ Apache سيعمل المنفذ 80.</p><h2 dir="rtl">إعداد Apache</h2><p dir="rtl">سنحتاج إلى إعداد apache لجعله يدير الواجهة الخلفية لموقعنا، والذي كما قلنا سابقًا، سيعمل على المنفذ 8080. افتح ملف منافذ apache للبدأ في إعداده ليستخدم المنفذ الصحيح عبر الأمر:</p><pre class="php ipsCode prettyprint">sudo nano /etc/apache2/ports.conf</pre><p dir="rtl">ابحث وغيّر السطور التّالية لجعل apache يعمل على المنفذ <span style="font-family:'courier new', courier, monospace;">8080</span> والقابل للوصول من المضيف المحلي (localhost) فقط:</p><pre class="php ipsCode prettyprint">NameVirtualHost 127.0.0.1:8080
Listen 127.0.0.1:8080</pre><p dir="rtl">احفظ الملف واخرج.</p><p dir="rtl">بعد ذلك قمّ بإنشاء ملف مضيف وهمي عبر نسخ تخطيط الملف من ملف apache الافتراضي عبر الأمر:</p><pre class="php ipsCode prettyprint">sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/example
sudo nano /etc/apache2/sites-available/example</pre><p>المشكلة الرئيسية التي يجب حلّها هنا هي أنه يجب أن يتم إعادة ضبط <span style="line-height:11.1999998092651px;">المضيف الوهمي</span> مُجدّدًا لكي يعمل على المنفذ 8080 (عوضًا عن المنفذ الافتراضي الذي هو 80 والذي يعمل عليه nginx).</p><p dir="rtl">يجب أن يبدو السطر المطلوب هكذا:</p><pre class="php ipsCode prettyprint">&lt;VirtualHost 127.0.0.1:8080&gt;</pre><p dir="rtl">تأكّد من أن مسار الجذر صحيح. احفظ الملف واخرج منه وقم بتفعيل المضيف الوهمي:</p><pre class="php ipsCode prettyprint">sudo a2ensite example</pre><p dir="rtl">قبل البدء باختبار الأشياء، نحتاج إلى دعم apache بملحق <span style="font-family:'courier new', courier, monospace;">php.</span> ثبّته عبر الأمر:</p><pre class="php ipsCode prettyprint">sudo apt-get install php5</pre><p dir="rtl">قم بإعادة تشغيل كلٍ من الخادومين للتأكد من عمل التغييرات:</p><pre class="php ipsCode prettyprint">sudo service apache2 restart
sudo service nginx restart</pre><h2 dir="rtl">إنهاء العمليّة</h2><p dir="rtl">لقد قمنا بإعداد خادومنا الشخصي الوهمي الخاص (VPS) ليتم تشغيل nginx في واجهة موقعنا وapache ليعالج الطلبات المتعلقة بـ php في الخلفية. الذهاب إلى نطاقنا الرئيسي (domain) الآن سيأخذنا إلى الصفحة الافتراضية لموقعنا.</p><p dir="rtl">يمكننا التحقق مما إذا كان يتم توجيه المعلومات إلى apache عبر تشغيل سكربت PHP شائع الاستخدام. اذهب وأنشء ملف <span style="font-family:'courier new', courier, monospace;">php.info</span> عبر:</p><pre class="php ipsCode prettyprint">sudo nano /var/www/info.php</pre><p dir="rtl">والصق الشفرة التالية داخله:</p><pre class="php ipsCode prettyprint">&lt;?
phpinfo( );
?&gt;</pre><p dir="rtl">احفظ الملف واخرج.</p><p dir="rtl">زيارة <span style="font-family:'courier new', courier, monospace;">domain/info.php</span> الخاص بك يجب أن يعرض لك شاشة معلومات <span style="font-family:'courier new', courier, monospace;">php</span>، وسيكون بمقدورك رؤية أنه قد تم معالجة الطلب بواسطة apache </p><p dir="rtl" style="text-align:center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_03/php-info.png.e3dbbe16e37a8c50756365106e2e3cae.png"><img data-fileid="812" class="ipsImage ipsImage_thumbnailed" alt="php-info.thumb.png.0b8c665042bdc8845ef29" src="https://academy.hsoub.com/uploads/monthly_2015_03/php-info.thumb.png.0b8c665042bdc8845ef29dec6a49a7cb.png"></a></p><p dir="rtl">أخيرًا، يمكنك رؤية أيٍّ من المنافذ مفتوح وأيّ التطبيقات التي تعمل على كلّ واحدٍ منها عبر كتابة هذا الأمر:</p><pre class="php ipsCode prettyprint">sudo netstat -plunt</pre><p dir="rtl">ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-configure-nginx-as-a-reverse-proxy-for-apache">How To Configure Nginx as a Reverse Proxy for Apache</a> لصاحبته Etel Sverdlov</p>
]]></description><guid isPermaLink="false">19</guid><pubDate>Thu, 26 Mar 2015 08:56:00 +0000</pubDate></item><item><title>&#x62A;&#x646;&#x635;&#x64A;&#x628;&#x60C; &#x625;&#x639;&#x62F;&#x627;&#x62F; &#x648;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; nginx &#x643;&#x62E;&#x627;&#x62F;&#x648;&#x645; &#x648;&#x64A;&#x628;</title><link>https://academy.hsoub.com/devops/servers/web/nginx/%D8%AA%D9%86%D8%B5%D9%8A%D8%A8%D8%8C-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D9%88%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-nginx-%D9%83%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D9%88%D9%8A%D8%A8-r1/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_04/nginx_480x300.png.3d68faca15c95d5cad3416f1f1b147cf.png" /></p>

<p>
	Nginx عبارة عن مشروع مفتوح المصدر، له استخدامات مُختلفة قد يكون أهمها هو استخدامه كخادوم ويب. يُمكن اعتبار Nginx كمنافس قوي لخادوم apache رغم قُوة هذا الأخير. إليكم دليلا سريعا حول كيفية تنصيبه، إعداده واستخدامه كخادوم ويب محلي.
</p>

<p dir="rtl">
	سأستعرض آلية تنصيب وإعداد nginx على نظام لينكس (توزيعة Archlinux) ويُمكنك تغيير مسارات الملفات لتتوافق مع مسارات الملفات على توزيعتك المُفضلة للوصول إلى نفس النتيجة.
</p>

<p dir="rtl">
	بداية سنحتاج أولا إلى تنصيب nginx عبر الأمر التالي (وفي حال ما إذا كانت مشاريعك مكتوبة بلغة php فإنك ستحتاج أيضا إلى تنصيب php-fpm):
</p>

<pre class="php ipsCode prettyprint">
sudo pacman -S nginx php-fpm</pre>

<p dir="rtl">
	على توزيعة ubuntu سيكون أمر التنصيب هو:
</p>

<pre class="php ipsCode prettyprint">
sudo apt-get install nginx php5-fpm</pre>

<p dir="rtl">
	بعد الفراغ من التنصيب سنقوم بتفعيل الخادوم (وphp-fpm) وتشغيله بالأمرين التاليين:
</p>

<pre class="php ipsCode prettyprint">
sudo systemctl enable nginx php-fpm
sudo systemctl start nginx php-fpm</pre>

<p dir="rtl">
	بعد قيامك بذلك ولو استعرضت عنوان localhost فستظهر لك صفحة تؤكد لك بأنه تم تنصيب الخادوم وتشغيله بنجاح.
</p>

<p dir="rtl">
	الآن وبحكم أنك ستعمل على أكثر من مشروع ويب في آن واحد على جهازك المحلي سنقوم بإعداد الخادوم لتمكيننا من ذلك.
</p>

<p dir="rtl">
	لنبدأ أولا بإلقاء نظرة على ملف nginx.conf الذي يتحكم في الخادوم. ستلاحظ الشفرة التالية المسؤولة عن إظهار صفحة البداية آنفة الذكر
</p>

<pre class="php ipsCode prettyprint">
server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }</pre>

<p dir="rtl">
	وكل ما نحتاجه هو إنشاء خادوم server جديد لكل مشروع تود العمل عليه، لكن ولإبقاء هذا الملف "نظيفا" ولتجنب حصول أية مشاكل بسبب تعديل غير مرغوب فيه سنقوم بإنشاء ملف مُنفصل لكل مشروع جديد.
</p>

<p dir="rtl">
	اذهب إلى المُجلد الذي تم تنصيب nginx فيه (/etc/nginx/ ) وقم بإنشاء مُجلدي sites-available وsites-enabled إن لم يكونا موجودين من قبل.
</p>

<p dir="rtl">
	لماذا سنحتاج إلى مُجلدين؟ سنضع في الأول المواقع (المشاريع) التي نعمل عليها و"سنضع" في الثاني المواقع (المشاريع) التي نود أن نقوم بتنفيذها. صحيح أن هذه الخُطوة قليلة أو ربما عديمة الفائدة على خادوم محلي، لكن من الأفضل أن تعود نفسك على ذلك قبل أن تقوم برفع مواقعك إلى خادوم فعلي.
</p>

<p dir="rtl">
	سنقوم بإنشاء ملف إعدادات لكل مشروع جديد داخل مُجلد site-available ولنسمي كل ملف باسم المشروع متبوعا بـ .dev (يُمكنك تجاهل هذه اللاحقة إن أردت أو استخدام أي لاحقة أخرى) بعبارة أخرى لو كان المشروع الأول الذي نود أن نقوم بتشغيله عبر nginx هو myproject فسيكون اسم الملف هو myproject.dev
</p>

<p dir="rtl">
	إليكم مثالا عن إعدادات phpmyadmin (بطبيعة الحال ستحتاج إلى تنصيبه أولا قبل أن تقوم بذلك):
</p>

<pre class="php ipsCode prettyprint">
server {
   listen 80;
   server_name phpmyadmin.dev;
   location / {
      root /usr/share/webapps/phpMyAdmin;
      index index.html index.htm index.php;
      try_files $uri $uri/ /index.php$is_args$args;
      autoindex on;
   }
   location ~ \.php$ {
      root /usr/share/webapps/phpMyAdmin;
      fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      include fastcgi_params;
   }
   #error_page 404 /404.html;
   # redirect server error pages to the static page /50x.html
   error_page 500 502 503 504 /50x.html;
   location = /50x.html {
      root /usr/share/nginx/html;
   }
}</pre>

<p dir="rtl">
	في حال ما إذا كان مشروعك داخل مُجلد آخر فيكفي أن تغير قيمة root. لو كان مشروعك متواجدا داخل /srv/http/myproject فيكفي أن تغيير root لتصبح
</p>

<pre class="php ipsCode prettyprint">
root /usr/share/webapps/myproject;</pre>

<p dir="rtl">
	ستحتاج أيضا إلى تغيير قيمة fastcgi_pass لتتوافق مع مسار php-fpm على نظامك، فلو كنت على توزيعة ubuntu مثلا فسيكون المسار unix:/var/run/php5-fpm.sock;
</p>

<p dir="rtl">
	بطبيعة الحال يُمكنك إضافة، تعديل أو إزالة أية إعدادات أخرى حسب الحاجة كتفعيل أو تعديل مسار صفحة الخطأ error_page 404 أو تعطيل خاصية autoindex on; التي تسمح باستظهار مُحتوى المُجلدات التي لا تحتوي على ملفات index.
</p>

<p dir="rtl">
	الآن وبعد أن أنشأنا على الأقل ملفي إعدادات (واحد للمشروع myproject وآخر لسكربت phpMyAdmin) سنحتاج أن نقوم بنقلهما إلى مُجلد sites-enabled، لكن لن نقوم بنسخهما بل يكفي أن نقوم بإنشاء رابط وهمي. بعبارة أخرى سنقوم بإنشاء رابط وهمي من مُجلد sites-enabled إلى ملفات الإعدادات الموجودة في مجلد sites-available وذلك على النحو التالي:
</p>

<pre class="php ipsCode prettyprint">
sudo ln -s /etc/nginx/sites-available/myproject.dev /etc/nginx/sites-enabled/myproject.dev
sudo ln -s /etc/nginx/sites-available/phpmyadmin.dev /etc/nginx/sites-enabled/phpmyadmin.dev</pre>

<p dir="rtl">
	بقيت خُطوة أخيرة، وبحكم أننا سنتحكم في جميع مشاريعنا عبر ملفات فردية فإننا لن نحتاج بعد الآن إلى الإعدادات الموجودة في ملف nginx.conf. هذا من جهة، ومن جهة أخرى سنحتاج إلى تضمين هذه الملفات الفردية في الملف الرئيسي عبر الأمر:
</p>

<pre class="php ipsCode prettyprint">
include sites-enabled/*;</pre>

<p dir="rtl">
	ليصبح الملف على النحو التالي:
</p>

<pre class="php ipsCode prettyprint">
#user html;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#<abbr title="Process IDentifier | معرّف العملية أو البرنامج">pid</abbr> logs/nginx.<abbr title="Process IDentifier | معرّف العملية أو البرنامج">pid</abbr>;

events {
   worker_connections 1024;
}
http {
   include mime.types;
   default_type application/octet-stream;
   #access_log logs/access.log main;
   sendfile on;
   #tcp_nopush on;
   #keepalive_timeout 0;
   keepalive_timeout 65;
   #gzip on;
   include sites-enabled/*;
}</pre>

<p dir="rtl">
	الآن وبعد أن أنهينا إعداد ملفات الخواديم، سنحتاج إلى إعادة تشغيل nginx ليأخذ التغييرات في الحسبان عبر الأمر
</p>

<pre class="php ipsCode prettyprint">
sudo systemctl restart nginx</pre>

<p dir="rtl">
	لكن كيف سنقوم باستعراض المشاريع على المُتصفح؟ بقيت خطوة أخيرة (ألم تقل في الخطوة السابقة أنها الخطوة الأخيرة؟؟:P) سنحتاج إلى تعديل ملف /etc/hosts وإضافة سطر لكل مشروع على النحو التالي:
</p>

<pre class="php ipsCode prettyprint">
127.0.0.1 myproject.dev localhost
127.0.0.1 phpmyadmin.dev localhost</pre>

<p dir="rtl">
	الآن يكفي أن أكتب في خانة العناوين العنوان phpmyadmin.dev أو myproject.dev لأتمكن من استعراض المشروعين.
</p>

<p dir="rtl">
	<strong>ملاحظة</strong>: هذا دليل سريع حول تنصيب nginx والشروع في استخدامه، قد تحتاج إلى إضافة إعدادات أخرى لتوافق ودعم أفضل لنظام إدارة المُحتوى الذي تعمل عليه أو للغة البرمجية المُفضّلة لديك.
</p>

<p dir="rtl">
	<strong>ملاحظة2</strong>: ستجد في الشفرات السابقة بعض الإعدادات المُعطلة (مسبوقة بمحرف #) تركت لتبيين بعض ما يُمكن إضافته للملف ابحث عن كل واحدة وفعلها حسب الحاجة.
</p>
]]></description><guid isPermaLink="false">1</guid><pubDate>Sat, 28 Feb 2015 16:16:00 +0000</pubDate></item></channel></rss>
