بهینه سازی تنظیمات وب سرور آپاچی



بهینه سازی وب سرور apache

تنظیم و بهینه سازی وب سرور آپاچی تاثیر زیادی بر عملکرد پاسخگویی درخواست های شما در وب سرور دارد. چندین ابزار برای بررسی بیشتر عملکرد apache web server وجود دارد که میتونین برای بهینه سازی وب سرور از این موارد استفاده کنین. در این مقاله درباره ماینتورینگ بر روی بعضی پردازش ها و منابعی مصرفی سیستم برای اثر بخشی بهینه سازی وب سرور apache مرور میکنیم، البته یادآوری میکنم قبل از انجام هرگونه تنظیمات، حتما از فایل های پیکربندی web server بکاپ تهیه کنین.

بهینه سازی تنظیمات وب سرور آپاچی

انواع ابزارهایی وجود دارند که بعد از خرید vps به شما میتونن کمک کنند که با بررسی ها به شما اطلاع بدن که آیا نیاز به تغییر منابع یا بهینه سازی دارید، یکی از اینها دستور top هست که در اینجا با نوع مصرف ram , cpu بصورت خلاصه آشنا میشیم. با استفاده از دستور ps میتونیم مصرف منابع رو بررسی کنیم، دستور ps برای گزارش گیری پردازش های سرور شما هست، در دستور اول میزان مصرف ram و در دستور دوم میزان مصرف cpu نمایش داده میشه :

 

echo [PID]  [MEM]  [PATH] &&  ps aux | awk '{print $2, $4, $11}' | sort -k2rn | head -n 20


ps -eo pcpu,pid,user,args | sort -k 1 -r | head -20

 

 

Apache mod_status

Apache mod_status یا mod_status اطلاعات عملکرد سرور شمارو بصورت دقیق با توضیحات در یک صفحه ارایه میده. برای اینکار باید تنظیمات وب سایتتون رو پیدا و ویرازش کنین ، این فایل رو برای سیستم عامل های Debian/Ubuntu در مسیر :

/etc/apache2/sites-available/hostname.example.com.conf

و برای سیستم عامل های CentOS/Fedora ، در مسیر زیر باید پیدا کنین

/etc/httpd/conf.d/vhost.conf

 

کد زیر رو در بلاک <virtual_hosts> قرار میدیم

/etc/apache2/sites-available/hostname.example.com.conf (Debian/Ubuntu)
<Location /server-status>
     SetHandler server-status
     Order Deny,Allow
     Deny from all
  Allow from localhost
</Location>

 

آپاچی mod_status همچنین گزینه ای به نام ExtendedStatus ارائه می کند که اطلاعات بیشتری را درباره هر درخواستی که به Apache داده می شود، ارائه می دهد برای فعال کردن ExtendedStatus، فایل پیکربندی آپاچی خود را ویرایش کنید و خط زیر را اضافه کنید:
/etc/apache2/apache2.conf (Debian/Ubuntu)
ExtendedStatus On

 

سپس وب سرور را ریستارت میکنیم

Debian/Ubuntu:
systemctl restart apache2
 CentOS/Fedora: systemctl restart httpd

 

برای مشاهده صفحه ایجاد شده، مرورگر متنی Lynx رو نصب میکنیم و فایل رو مشاهده میکنیم

 

Debian/Ubuntu:
apt-get install lynx
Fedora/CentOS:
yum install lynx
 Open the file: lynx http://localhost/server-status

 

Apache2Buddy

اسکریپت Apache2Buddy یک اسکریپت مشابه MySQLTuner برای بهینه سازی است که تنظیمات وب سرور آپاچی شما را بررسی میکنه و پیشنهاداتی برای پردازش های وب سرور آپاچی و رم به شما ارایه میده ، اگرچه این یک برنامه نسبتا پایه است، که بر دستورالعمل MaxClients متمرکز است، Apache2Buddy یک اسکریپت مفید است. شما می توانید اسکریپت را با دستور زیر اجرا کنید:

curl -sL https://raw.githubusercontent.com/richardforth/apache2buddy/master/apache2buddy.pl | sudo perl

 

Multi Processing Modules

آپاچی نسخه version 2.4 سه ماژول پردازش چندگانه Multi Processing Modules (MPM) برای مدیریت تنظیمات شما پیشنهاد میده. هر ماژول پردازش های چند فرزندی (child processes) رو ایجاد می کنه، اما در چگونگی رفتار آنها متفاوت است.

 

Prefork

ماژول prefork تعدادی از فرآیندهای فرزندی را در زمان راه اندازی ایجاد میکنه و هر فرزند فقط یک موضوع را مدیریت میکنه. از آنجا که این فرایندها تنها با یک رشته در یک زمان سر و کار دارند، اگر تعداد زیادی درخواست همزمان باشد سرعت پاسخگویی پایین میاد. وقتی هم که این اتفاق میافته ، برخی از درخواست ها باید منتظر بمونن. برای حل کردن این مشکل ، میتونین تعداد child processes هارو زیاد کنین ، اگر چه افزایش باعث افزایش مصرف Ram خواهد شد. Prefork امن ترین ماژول است و باید هنگام استفاده از کتابخانه های غیر ایمن استفاده شود. بصورت خلاصه و قابل فهم، یک پردازش به صورت Parent ایجاد شده که مسئولیت آن مدیریت کردن درخواست و ارجاع آنها به Child Process می باشد. در این مدل هر Child Process تنها مسئول هندل کردن یک Request می باشد.

 

ماژول Prefork

ماژول Prefork

 

Worker

ماژول worker، پردازش child processes (پردازش فرزندی) یا چند پردازنده (multi-process) چند رشته ای با ایجاد تعداد زیادی رشته برای هر پردازش و برای پذیرش درخواست های جدید است و این اجازه رو برای ورود تعداد زیادی از درخواست ها میده که در عوض منابع ram کمتری رو درگیر میکنه و برای سایت های پربازدید مناسب است، به طور کلی، ماژول Worker عملکرد بالاتر را ارائه میده، اما کمتر از ماژول prefork امن است و پیشنهاد نمیشه با ماژول هایی که امنیت کمتری دارند مورد استفاده قرار بگیره و بصورت خلاصه و قابل فهم، MPM Worker حالتی است برگرفته از Prefork با این تفاوت که هر Child Process با استفاده از مکانیزم Multi-Threading میتواند به ده ها درخواست به صورت موازی پاسخ دهد.

ماژول Worker

ماژول Worker

Event

ماژول event تنها در نسخه آپاچی 2.4 قابل دسترس است و برگرفته از worker MPM است. همانند ماژول worker میتونه چندین رشته در هر پردازش فرزند رو ایجاد کنه، ماژول چندپردازنده (Multi-Processing) event طوری طراحی شده است که اجازه می دهد درخواست های بیشتری به طور همزمان با ارسال برخی از پردازش ها به رشته های پردازشی انجام شود، این چیز خیلی خوبی برای اتصال متعدد چندین کانکشن است، مخصوصا برای کانکشن هایی که همزمان فعال نیستن و درخواست ها گاه به گاه انجام میشود.

 

هنگامی که MPM را انتخاب میکنین، باید مقادیر داخل پیکربندی رو تغییر بدین

Debian/Ubuntu
/etc/apache2/apache2.conf CentOS/Fedora etc/httpd/conf/httpd.conf

 

فایل تنظیمات prefork به شکل زیر است.

<IfModule mpm_prefork_module>
       StartServers              4
       MinSpareServers          20
       MaxSpareServers          40
       MaxRequestWorkers       200
       MaxConnectionsPerChild 4500
</IfModule>

برای استفاده از ماژول worker  یا event  باید به جای <IfModule mpm_prefork_module> ، مقدار <IfModule mpm_worker_module> یا <IfModule mpm_event_module> رو قرار بدین و بعد از انجام تغییرات وب سرور رو ریستارت کنین

 

On Debian/Ubuntu:

sudo systemctl restart apache2

On CentOS/Fedora:

sudo systemctl restart httpd.service

 

اما مقادیر و عباراتی که در بالا دیدیم رو بررسی میکنیم

 

StartServers

مقدار StartServers نشان دهنده تعداد پروسه های فرزند ایجاد شده در هنگام راه اندازی است و به صورت داینامیکی در هنگام لود کنترل میشود. اغلب دلیل کمی برای تغییر این شماره وجود دارد، مگر اینکه سرور شما به طور مرتب مجددا راه اندازی شود و شامل تعداد زیادی درخواست پس از راه اندازی مجدد شود. اغلب دلیل کمی برای تغییر این عدد وجود دارد، مگر اینکه سرور شما به طور مرتب مجددا راه اندازی شود و شامل تعداد زیادی درخواست پس از راه اندازی مجدد باشد.

 

MinSpareServers

حداقل تعداد پردازش های فرزند بیکار (idle) را تنظیم می کند. اگر پردازش های کمتری نسبت به تعداد MinSpareServer وجود داشته باشد پردازش های بیشتر با سرعت یک در هر ثانیه در Apache 2.2 یا پایینتر ایجاد میشوند. در Apache 2.4 این میزان به طور نمادین با 1 شروع می شود و با 32 فرزند در هر ثانیه رشد می کند.توجه داشته باشید پردازش های بیش از حد بیکار Idle تاثیر منفی بر عملکرد سرور دارند و بهینه سازی این مقدار باید فقط در صورت نیاز در سایت های شلوغ باشه و توصیه نمیشه این مقدار به عدد بالایی تغییر کنه.

 

MaxSpareServers

این پارامتر حداکثر تعداد فرزند بیکار (dle child processes) رو نشون میده. اگر تعداد تعداد پردازش بیکاری بیشتر از این عدد فعال باشه، بنابراین بقیه پردازش ها از بین میرن (terminated) و متوقف میشن.مگر اینکه وبسایت شما بسیار مشغول باشد، این عدد نباید بیش از حد بالا باشد، زیرا حتی به پردازش های بیکار منابع صرف شده و منابع سرور را مصرف میکنند.

 

MaxRequestWorkers

این پارامتر حداکثر مقدار درخواستهایی را که می تواند به صورت همزمان ارائه شود و هر تعدادی که از قبل بیش از حد مجاز وجود دارد در صف قرار میگیره، اگر MaxRequestWorkers بسیار پایین تنظیم بشه ، کانکشن های باز شده به صف دچار time out میشن و اگه بیش از حد زیاد تنظیم بشه مصرف حافضه swap بالا میره، اگر این مقدار از 256 افزایش یافته باشد، مقدار ServerLimit نیز باید افزایش یابد. یکی از راه های محاسبه بهترین مقدار به این شکل است که مقدار رم استفاده شده توسط آپاچی را را تقسیم کنید به مقدار رم آزاد. همچنین از اسکریپت Apache2Buddy برای محاسبه این مقدار میتونین استفاده کنین.

 

MaxConnectionsPerChild

MaxConnectionsPerChild تعداد درخواستهایی که پردازش فرزند ( child process) در طول عمر خود دارد را محدود می کند. هنگامیکه محدودیت ایجاد میشود، پردازش فرزند میمیرد و اگر این مقدار برابر 0 تنظیم بشه ، پردازش فرزند هرگز منقضی نمیشه، برای جلوگیری از کمبود حافظه مقدار پیشنهاد شده چند هزار است. توجه داشته باشید که تنظیم این خیلی کم می تواند سیستم را کند کند، زیرا ایجاد پردازش های جدید منابع را مصرف میکند.

 

ServerLimit

در زمینه ماژول prefork تنظیمات ServerLimit بیشترین مقدار برای MaxRequestWorkers و برای کل چزخه زندگی پردازش آپاچی است ، یعنی اگر مقدار MaxRequestWorkers بالای 256 تنظیم میکنین ، مقدار ServerLimit رو هم باید همین مقدار قرار بدین.

هنگام استفاده از worker یا event – حداکثر مقدار ServerLimit و ThreadLimit را MaxRequestWorkers برای مدت زمان پردازش آپاچی تعیین میکنند.توجه داشته باشید که اگر ServerLimit به مقدار بالاتر از مقدار مورد نیاز تنظیم شود، حافظه به اشتراک گذاشته نشده استفاده شده کنار گذاشته خواهد شد.

 

KeepAlive

KeepAlive اجازه اتصال کاربران به یک تک کانکشن TCP برای ایجاد درخواست های متعدد را میدهند به جای باز کردن کانکشن جدید برای هر درخواست. این باعث کاهش زمان بارگذاری صفحه و کاهش مصرف CPU برای وب سرور شما می شود، و باعث افزایش مصرف Ram خواهد شد. اتصال KeepAlive به عنوان یک درخواست “MaxConnectionsPerChild” محسوب می شود.