المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : شرح كيفية تحسين الاداء والسرعة الخاصة بالويب سيرفر SERVER apache



loulou ange
11-02-2013, بتوقيت غرينيتش 01:53 AM
بسم الله الرحمن الرحيم

من اهم المواضيع التى تواجه اصحاب السيرفر SERVERات وهى شرح كيفية تحسين الاداء والسرعة الخاصة بالويب سيرفر SERVER (الاباتشى).

ليس الحل دائما عند مواجه مشاكل فى الاداء والسرعة ان تقوم بترقية upgrade العتاد(Hardware). ولكن فى بعض الحالات تغيير احد اعدادت الاباتشى كفيل بتحسين الاداء 4 اضعاف.
لذلك قبل ان تقرر شراء سيرفر SERVER جديد او ترقية upgrade سيرفر SERVERك. ان تقوم بتجربة سلسلة من التغييرات فى الاعدادات الخاصة بالويب سيرفر SERVER (الاباتشى)

لذلك ‫في هذا الموضوع سأقوم بمناقشة الاعدادات التي يمكن تغييرها للحصول على أداء أفضل‬
‫لموقعك.


هناك بعض المصطلحات والاساسيات يجب التعرف عليها اولا:

‫‪ Configurations‬ في أي نظام هي سلسلة من حلقات مترابطة تؤثر على بعضها ، فرفع قيمة‬ ‫معينة قد لا يجدي نفعا ً الا اذا خفضت قيمة أخرى ، و العكس صحيح ، اذا ً عليك أن تعرف مبدئيا ً أن‬ ‫التأثير الايجابي لتغيير العدادات يأتي من توليفه معينة من العدادات و ليس بتعديل كل خاصية على‬ ‫حده. لهذا السبب أيضا ً يتطلب الامر منك التجربة و العمل بطريقة المحاولة و الخطأ ‪
Trial & Error‬ و‬ ‫رصد كافة التغيرات التي تطرأ للوصول إلى التوليفة المناسبة لموقعك .‬

ملف الاعدادات الخاص بالاباتشى ‫ ‪httpd.conf‬‬

‫أولا ً : إختيار الـ ‪ MPM‬المناسب‬
‫سيرفر SERVERات الاباتشي يمكن بنائها بحيث تتضمن أحد هذه الانواع من وحدات المعالجة المتعددة - ‫‪‪Multi‬‬ Processing Modules ‬و التي تكون وظيفتها بشكل رئيسي تحديد طريقة اتصال‬ ‫السيرفر SERVER بالشبكة و معالجة الطلبات القادمة ‪ HTTP Requests‬و الرد عليها ‪ . HTTP Responses‬

وحدات‬ ‫المعالجة ‪ MPM‬في الاباتشي هي :‬

1- وحدة المعالجة ‪: Prefork
‬‬
‫- وحدة متعددة العمليات ‪ ، Processes‬كل عملية تحتوي على ‪ Thread‬واحدة ، و العملية ‪ Process ‬ هي التي‬ ‫تتولى عملية الرد على الطلبات ‪HTTP Requests / Responses‬‬

‫- كل عملية ‪ Process‬يمكن أن تعمل بحساب مستخدم موجود على النظام ، مما يجعل وحدة المعالجة‬ ‫‪ Prefork‬أفضل من الناحية الامنية‬

‫- لكون كل عملية ‪ Process‬تحتوي على ‪ Thread‬واحدة ، فإن وحدة المعالجة ‪ Prefork‬تستهلك ذاكرة‬ ‫أعلى و قدرتها الادائية أقل.‬

‫2- وحدة المعالجة ‪: Worker‬‬

‫- وحدة متعددة العمليات ‪ ، Processes‬كل عملية يمكن أن تحتوي على أكثر من ‪ ، Thread‬و الـ ‪Thread‬‬ ‫الواحد هو الذي يتولى عملية الرد على الـ ‪HTTP Requests / Responses‬‬




‫- أقل إستهلاكا للذاكرة و أدائها أفضل ، خيار مثالي اذا كان سرعة الاداء أولوية قصوى لك‬
‫- عمليات المعالجة غير معزولة بشكل كامل ، كل عملية ‪ Process‬يمكنها أن تقوم بعدد غير محدود من‬ ‫عمليات المعالجة لكون الـ ‪ Thread‬هو من يستقبل الطلب و ليس العملية ‪Process‬‬

‫3- وحدة المعالجة ‪Winnt‬‬

‫- اذا كنت تشغل الاباتشي على ويندوز ، فهذا هو الخيار الوحيد لك‬

‫- لأن ويندوز نظام يعالج الـ ‪ Threads‬بشكل أفضل من العمليات ‪ ، Processes‬فإن هذه الوحدة تعمل بـ ‫‪ Process‬واحدة فقط و عدد من الـ ‪. Threads‬‬

تذكر أنه يمكنك إختيار واحد فقط من هذه الوحدات لكي يعمل الاباتشي بها ، و يتم اختيارها عند عملية‬ ‫الـ ‪ . Compilation‬إختيار وحدة المعالجة ‪ MPM‬المناسبة يعتمد كليا ً على أولوياتك و على عدد من‬ ‫العوامل ، مثل دعم نظام التشغيل للـ ‪ Threads‬و عدد المعالجات و حجم الذاكرة و نوعيتها في السيرفر SERVER‬ و كذلك على طبيعة الترافيك القادمة للموقع و كمية الـ ‪ HTTP Requests‬

‫ثانيا ً : إعدادات وقت التشغيل ‪Run-Time‬‬

‫جميع الاعدادات التي سنتحدث عنها ستجدها في ملف ‪ httpd.conf‬وهو الملف المسؤول عن إعدادات‬ ‫الاباتشي . لاحظ هنا أنني سأشرح طريقة الاعدادات الخاصة بوحدة المعالجة ‪ Worker‬حيث أنها الوحدة التي‬ ‫ينصح بإستخدامها غالبا ً في السيرفر SERVERات الحديثة التي تدعم الـ ‪ ، Threads‬بعض الاعدادات التي سأشرح طريقةها‬ ‫مشتركة بين النوعين .

*ملحوظة:
صفحات الـ php تستخدم الـ thread safe لذلك تستخدم معها الـ prefork mpm.
ويمكن ايضا تشغيل الـ php على worker mpm مع mod_fcgid كما هو الحال مع الـ Nginx

*‬ لمعرفة الـ MPM المستخدم
قم بتطبيق هذا الامر :



عن طريق البحث عن الـ Module
prefork.c او worker.c
فى هذه الحالة الـ MPM المستخدم هو الـ prefork

‫1- ‪HostnameLookups‬‬

‫هذا الموجه ‪ Directive‬مستنزف حقيقي للترافك و الوقت من سيرفر SERVER ك ، حيث يقوم بعملية فحص للـ‬ ‫‪ ) DNS‬أو ما يعرف بـ ‪ ( DNS Lookup‬و ذلك لكل طلب يصل للسيرفر SERVER ! حيث يقوم بفحص أي بي الزائر‬ ‫و التحقق من مصدره و نطاقه لتسجيله في سجلت الدخول ‪ . access_log‬عملية لا أجد حاجة لها في‬ ‫معظم السيرفر SERVERات ، لذا تأكد أن قيمة هذا الموجه هي ‪. Off

“HostnameLookups Off‬‬ “

‫2- ‪AllowOverride‬‬

‫هذا الموجه ‪ Directive‬يخبر الباتشي ما اذا كانت ملفات الـ .‪ htaccess‬على السيرفر SERVER يمكن إعادة تجاوزها‬ ‫في أي مسار على السيرفر SERVER ، فمثل ً اذا كانت قيمة ‪ AllowOverride‬هي ‪ ، All‬و عند قدوم طلب لتصفح‬ ‫العنوان التالي /‪ index.php‬فإن الاباتشي سيقوم بالتجول في المجلدات الفرعية /1‪ sub‬و /2‪ sub1/sub‬و /‬ ‫‪ ! sub1/sub2/sub3‬تخيل ان هذه العملية تتم عند كل طلب ! لا داعي لذلك ، اذا احتجت استخدام ملفات‬ .‪ htaccess‬فأجعلها في كل مجلد في موقعك و ل تعتمد على أن السيرفر SERVER سيستطيع رؤيتها من أي‬ ‫مكان .‬

‫3- ‪MaxClients‬‬

‫‫قيمة هذا الموجه حساسة و مهمة للوصول إلى أفضل أداء ممكن ، سواء كنت تستخدم وحدة المعالجة‬ ‫‪ Prefork‬أو ‪ . Worker‬هنا يمكنك تحديد العدد الاقصى من العمليات ‪ Processes‬أو إجمالي عدد الـ ‪Threads‬‬ ‫التي ستعمل في السيرفر SERVER لخدمة الزوار و إستقبال الطلبات ‪ . HTTP Requests‬لو كنت تستخدم وحدة‬ ‫المعالجة ‪ Prefork‬فإن ضبط قيمة ‪ MaxClients‬سيكون سهل ، و لكن بما أننا قررنا الحديث عن وحدة‬ ‫المعالجة ‪ Worker‬فإن عملية الضبط ستكون أصعب بكثير.

‪ MaxClients‬في وحدة المعالجة ‪ Worker‬تعني‬ ‫عدد الطلبات ‪ HTTP Requests‬التي يمكن للسيرفر SERVER إستقبالها في نفس اللحظة . المشكلة هنا أنك تريد‬ ‫وضع رقم يسمح لسيرفر SERVER ك بتقديم أفضل أداء و لا يجعل الزائر ينتظر حتى يحصل على إتصال و بنفس‬ ‫الوقت لا تريد الرقم أن يصبح كبيرا ً جدا ً ليستهلك الذاكرة و يرهق موارد النظام . حسنا ً أظن أنك خمنت‬ ‫ الحل ، لا يوجد معادلة أو قيمة سحرية ، ذلك يعتمد كليا ً على طبيعة الطلبات التي ترد لموقعك وحجمها‬ ‫و تزامنها ، لذلك فأنت تحتاج إلى تجربة عدة قيم حتى تصل للقيمة المثلى. أبقي عينيك على إستهلاك‬ ‫الذاكرة مع كل تغيير . كما حاول تغيير ‪ ThreadsPerChild‬و التي سنتحدث عنه بعد قليل.‬

‫4- ‪ThreadsPerChild‬‬
‫في وحدة المعالجة ‪ Worker‬من يقوم بعملية استقبال الطلب و معالجته فعليا ً هو الـ ‪ Thread‬و ليس الـ‬ ‫‪ ، Process‬لذلك فإن تحديد عدد الـ ‪ Threads‬لكل عملية ‪ Process‬قائمة هو أمر مهم. هذا الموجه‬ ‫‪ Directive‬سيعتمد عليه الباتشي في تحديد عدد العمليات الـ ‪ Processes‬التي سينشأها الاباتشي . حين‬ ‫يضطر الاباتشي لانشاء ‪ Process‬جديدة ، فإنه يقوم بإنشاء ‪ Threads‬بالعدد الذي تحدده هنا ، سواء كان‬ ‫هناك طلبات إتصال بهذا العدد أو لا ، فإن جميع الـ ‪ Threads‬سيتم إنشائها بمجرد إنشاء الـ ‪Process‬‬ ‫الجديدة ، لذلك كن حذر من رفع العدد بصورة مبالغ فيها. الخطورة هنا تكمن في أن حدوث مشكلة‬ ‫جذرية في أحد الـ ‪ Threads‬قد يؤدي إلى توقف الـ ‪ Process‬ كاملها عن العمل و قتلها من قبل النظام .‬ ‫أحد أكثر الاسباب التي تؤدي إلى ذلك هو رفع قيمة الـ ‪ ThreadsPerChild‬إلى قيمة أعلى مما ينبغي.‬

‫5- ‪StartServers‬‬

‫هذا الموجه ‪ Directive‬الذي يسمح لك بتحديد عدد الـ ‪ Processes‬الذي سيبدأ فيه الباتشي عند أول‬ تشغيل له ، كل ‪ Process‬بالتأكيد ستقوم بإنشاء عدد من الـ ‪ Threads‬المحدد في الموجه‬ ‫‪. ThreadsPerChild‬‬

‫6- ‪MinSpareThreads‬‬

‫أقل عدد من الـ ‪ Threads‬سيبقيه الاباتشي متواجد و متصل لخدمة الطلبات القادمة ، حتى لو لم يكن‬ ‫هناك حاجة لها في تلك اللحظة. سيقوم الباتشي بإنشاء ‪ Process‬جديدة لضمان هذا الحد الدنى من الـ‬ ‫‪ Threads‬اذا لزم الامر.‬

‫7- ‪MaxSpareThreads‬‬

‫أقصى عدد من الـ ‪ Threads‬سيبقيه الاباتشي متواجد و متصل لخدمة الطلبات القادمة كإحتياطي )أي‬ ‫في حال عدم وجود طلب على السيرفر SERVER يستدعي هذا الحد(. سيقوم الاباتشي بإنهاء أي ‪ Process‬تعمل و‬ ‫ذلك لتخفيض عدد الـ ‪ Threads‬تحت هذا العدد.‬

‫8 – ‪MaxRequestsPerChild‬‬

‫هذا هو عدد الطلبات ‪ HTTP Requests‬الذي ستقوم الـ ‪ Process‬بخدمتها بكل الـ ‪ Threads‬المتواجدة فيها ،‬ قبل أن تعلن إعتزالها و تخرج من الذاكرة ! لو فرضنا أن العدد هو 0001 ، هذا يعني ان كل ‪Process‬‬ ‫ستقوم بخدمة ألف طلب ثم تغلق جميع المنافذ ويقوم الباتشي بإنهاء خدماتها !. القيمة الافتراضية‬ ‫لهذه الخاصية هي 0 )صفر( ، و التي تعني انه ل حدود لعدد الطلبات التي سيتولى تلبيتها كل ‪ Process‬و‬ ‫لن يتم إنهاء خدمات أي منها ال اذا كان الغرض من الانهاء الوصول إلى ‪ MaxSpareThreads‬في حالة قلة‬ ‫الطلب على السيرفر SERVER.‬
‫و لكن ، لماذا يكون من الضروري أحيانا ً ان يقوم الباتشي بإنهاء خدمات أي ‪ Process‬بعد تأديتها عدد من‬ ‫الطلبات ؟ حسنا ً ، هذا يفيد لتفادي مشاكل تسرب الذاكرة ‪ Memory Leak‬التي تنتج بسبب بقاء العملية‬ ‫لوقت طويل جد ا ً في الذاكرة مما يجعل مخلفات هذه العملية تتراكم بسبب خلل في عملية تجميع‬ ‫المخلفات ‪ . Garbage Collection‬اضف إلى ذلك حاجة السيرفر SERVER بشكل عام إلى إستخدام أجزاء من‬ ‫الذاكرة لعمليات أخرى مختلفة ليس لها علاقة بالاباتشي.‬

‫9- ‪mod_deflate‬‬

‫هذه الوحدة ‪ Module‬يمكنك تضمينها من خلل ملف ‪ httpd.conf‬و ستعمل على ضغط الردود ‪HTTP‬‬ ‫‪ Responses‬على الطلبات مما يوفر الترافك بنسبة تصل إلى 57 % في بعض الحيان. يمكنك تحديد‬ ‫أنواع الملفات التي ستتعرض للضغط . لحظ ان عملية الضغط بحد ذاتها تستغرق وقت ، لذا يجب عليك‬ ‫الموازنه بين حاجتك لضغط الملفات لتسريع نقلها و بين الوقت الذي ستسغرقه عملية الضغط هذه.‬

‫10 – ‪mod_expires‬‬

‫هذه الوحدة مسؤولة عن عملية التحكم بالتخزين المؤقت ‪ Caching‬على جهاز المستخدم و ذلك بتحديد‬ ‫تاريخ إنتهاء صلاحية المحتوى حسب عدة عوامل مثل تاريخ التعديل أو تاريخ الوصول للملف. مثل ً :‬

‫‪”ExpiresByType text/html “access plus 1 month 15 days 2 hours‬‬

‫في هذا السطر حددت تاريخ صلاحية ملفات الـ ‪ HTML‬لمدة شهر واحد و 51 يوم و ساعتين و ذلك من‬ ‫تاريخ الوصول اليها ، بمعنى عند تصفح الزائر لصفحتك لول مرة فأنها ستخزن في ملفاته المؤقته و‬ ‫سيستمر في تصفحها من الملفات المؤقته لمدة شهر و 51 يوم و ساعتين عند طلبها مجددا ً ، سيلغى‬ ‫هذا الشرط اذا حذف الزائر ملفاته المؤقته أو طلب بشكل صريح أحدث نسخة من الصفحة
CTRL + F5
‫هناك تطبيقات و خصائص كثيرة لهذا الـ ‪ ، Module‬أنصح بالقراءة عنه بشكل متعمق.

‫11- ‪KeepAlive‬‬

‫لبقاء الاتصال مفتوحا ً مع الزائر ، هذه الخاصية تسمح بسرعة تنفيذ الطلبات بدل ً من إغلاق الاتصال و‬ ‫فتحه عند كل طلب يأتي من نفس الزائر ، يمكنك السماح بها ‪ On‬أو إغلقها ‪ . Off‬هناك خاصيتان‬ ‫مرتبطتان بهذا الموجه:‬

‫‪ : KeepAliveTimeout‬عدد الثواني الذي سيظل التصال فيها مفتوحا ً مع الزائر قبل أن يتم إغلاقه ، رفع‬ ‫هذه القيمة قد يؤدي إلى حجز عدد كبير من التصالت لمدة طويلة مع عدد محدد من الزوار مما يؤخر‬ ‫خدمة زوار آخرين ! في وحدة المعالجة ‪ Worker‬قد تكون0 1 أو 51 ثانية قيمة عادلة. ولكن ذلك يعتمد‬ ‫كليا ً على عدد العناصر في صفحات موقعك و حجمها و سرعة التحميل و تدفق الزوار في نفس‬
‫اللحظة !‬
‫‪ : MaxKeepAliveRequests‬عدد الطلبات التي سيرد عليها الـ ‪ Thread‬أثناء عملية الاتصال الواحدة ‪TCP‬‬ ‫‪ Connection‬قبل أن يقوم بإغلق الاتصال مجبرا ً متصفح الزائر على طلب إتصال جديد. أيضا ً تعتمد هذه‬ ‫الخاصية على عدد العناصر في صفحات موقعك و طبيعة تصفح زوار الموقع لموقعك وسرعة تنقلهم‬ ‫بين الصفحات.‬

‫12 - ‪ExtendedStatus‬‬

‫قم باغلاق هذه الخاصية بوضعها على الوضع ‪ Off‬و ذلك لن الاباتشي سيقوم بعدد من العمليات مع كل‬ ‫طلب يأتي اذا كانت هذه الخاصية في الوضع ‪ . On‬هذه الخاصية تقوم بتحديث update إحصائيات السيرفر SERVER و عدد‬ ‫الطلبات التي يخدمها في اللحظه . لا تحتاج لهذا في الغالب الا لتتبع مشكلة ، قم بإغلقها و شغلها فقط‬ ‫عند الحاجة.


13 – ‪Timeout‬‬

‫في حال فشل أحد الطلبات في الوصول بشكل كامل و صحيح للسيرفر SERVER ، فكم ثانية يجب على الـ‬ ‪ Thread‬أن تنتظر قبل أن تعلن إنتهاء الوقت و فشل الطلب و الانتقال لخدمة طلب آخر. قم بتقليل هذه‬ ‫المدة إلى حد معقول. تقليلها بشكل مبالغ فيه قد يؤدي إلى إغلاق الاتصالات بشكل متزايد في وجه‬ ‫الطلبات التي تستغرق ثواني إضافية كي يكتمل وصولها !!‬ ‬ ‬

والله ولى التوفيق

Source: geeker.co




https://fbcdn-sphotos-d-a.akamaihd.net/hphotos-ak-ash4/482113_236967293114455_1193518507_n.png (http://www.dzbatna.com)
©المشاركات المنشورة تعبر عن وجهة نظر صاحبها فقط، ولا تُعبّر بأي شكل من الأشكال عن وجهة نظر إدارة المنتدى (http://www.dzbatna.com)©

استعمل مربع البحث في الاسفل لمزيد من المواضيع


سريع للبحث عن مواضيع في المنتدى