بهینه سازی تنظیمات وب سرور آپاچی
بهینه سازی وب سرور 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>
/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 تعدادی از فرآیندهای فرزندی را در زمان راه اندازی ایجاد میکنه و هر فرزند فقط یک موضوع را مدیریت میکنه. از آنجا که این فرایندها تنها با یک رشته در یک زمان سر و کار دارند، اگر تعداد زیادی درخواست همزمان باشد سرعت پاسخگویی پایین میاد. وقتی هم که این اتفاق میافته ، برخی از درخواست ها باید منتظر بمونن. برای حل کردن این مشکل ، میتونین تعداد child processes هارو زیاد کنین ، اگر چه افزایش باعث افزایش مصرف Ram خواهد شد. Prefork امن ترین ماژول است و باید هنگام استفاده از کتابخانه های غیر ایمن استفاده شود. بصورت خلاصه و قابل فهم، یک پردازش به صورت Parent ایجاد شده که مسئولیت آن مدیریت کردن درخواست و ارجاع آنها به Child Process می باشد. در این مدل هر Child Process تنها مسئول هندل کردن یک Request می باشد.
ماژول worker، پردازش child processes (پردازش فرزندی) یا چند پردازنده (multi-process) چند رشته ای با ایجاد تعداد زیادی رشته برای هر پردازش و برای پذیرش درخواست های جدید است و این اجازه رو برای ورود تعداد زیادی از درخواست ها میده که در عوض منابع ram کمتری رو درگیر میکنه و برای سایت های پربازدید مناسب است، به طور کلی، ماژول Worker عملکرد بالاتر را ارائه میده، اما کمتر از ماژول prefork امن است و پیشنهاد نمیشه با ماژول هایی که امنیت کمتری دارند مورد استفاده قرار بگیره و بصورت خلاصه و قابل فهم، MPM Worker حالتی است برگرفته از Prefork با این تفاوت که هر Child Process با استفاده از مکانیزم Multi-Threading میتواند به ده ها درخواست به صورت موازی پاسخ دهد.
ماژول event تنها در نسخه آپاچی 2.4 قابل دسترس است و برگرفته از worker MPM است. همانند ماژول worker میتونه چندین رشته در هر پردازش فرزند رو ایجاد کنه، ماژول چندپردازنده (Multi-Processing) event طوری طراحی شده است که اجازه می دهد درخواست های بیشتری به طور همزمان با ارسال برخی از پردازش ها به رشته های پردازشی انجام شود، این چیز خیلی خوبی برای اتصال متعدد چندین کانکشن است، مخصوصا برای کانکشن هایی که همزمان فعال نیستن و درخواست ها گاه به گاه انجام میشود.
هنگامی که MPM را انتخاب میکنین، باید مقادیر داخل پیکربندی رو تغییر بدین
Debian/Ubuntu/etc/apache2/apache2.conf
CentOS/Fedoraetc/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” محسوب می شود.