در این آموزش 5 نکته برای افزایش عملکرد Apache Web Server را بررسی خواهیم کرد! طبق گزارش اخیر Netcraft (یک شرکت اینترنتی معروف که در میان سایر خدمات آمار استفاده از مرورگر وب را ارائه می دهد). Apache همچنان پرکاربردترین وب سرور در بین سایت ها و رایانه های اینترنتی است.
علاوه بر این، Apache همچنان بیشترین رشد را در میان برترین سرورهای وب و به دنبال آن Nginx و IIS تجربه می کند. بنابراین، اگر یک مدیر سیستم مسئول مدیریت نصبهای Apache هستید. باید بدانید که چگونه مطمئن شوید وب سرور شما مطابق با نیازهای شما (یا مشتری) بهترین عملکرد را دارد.
در این مقاله ما چند نکته را مورد بحث قرار میدهیم که به شما کمک میکند مطمئن شوید که Apache به خوبی اجرا میشود. و میتواند تعداد درخواستهایی که از مشتریان راه دور انتظار دارید را مدیریت کند.
چنانه می خواهید روش های افزایش عملکرد وب سرور آپاچی را تست کنید ولی سرور مجازی لینوکس ندارید میتوانید از سرویس های سرور مجازی و سرور اختصاصی آذرسیس استفاده کنید.
به خاطر داشته باشید که Apache با هدف تنظیم رکوردهای معیار طراحی نشده است. اما، با این وجود، هنوز هم تقریباً در هر مورد استفاده ای که فکرش را بکنید، می تواند عملکرد بالایی ارائه دهد.
فهرست مطالب
5 نکته برای افزایش عملکرد Apache Web Server
نکته 1: همیشه Apache را به آخرین نسخه خود به روز نگه دارید.
نصب آخرین نسخه Apache احتمالاً یکی از اولین مواردی است که باید در نظر بگیرید. از 19 نوامبر 2015، آخرین نسخه Apache موجود در مخازن CentOS 7 2.4.6 است، در حالی که در Debian 2.4.10 است.
با این حال، ممکن است یک بهبود اخیر یا رفع اشکالی وجود داشته باشد که به نسخه پایدار تازه منتشر شده اضافه شده باشد. که سپس برای دانلود و نصب از منبع در دسترس قرار می گیرد. دستورالعملهای کامپایل و نصب نیز در اینجا ارائه شده است. فقط به یاد داشته باشید که اگر این روش بهروزرسانی را انتخاب کنید. ممکن است بخواهید برای احتیاط از فایلهای پیکربندی فعلی / سایتها / میزبانهای مجازی نسخه پشتیبان تهیه کنید.
در هر صورت، می توانید نسخه نصب شده فعلی خود را به شرح زیر بررسی کنید:
# httpd -v [On RedHat/CentOS based systems] # apache2 –v [On Debian/Ubuntu based systems]
به عنوان یک قاعده کلی، از روش بهروزرسانی ارائه شده توسط package manager انتخابی خود (بهروزرسانی yum httpd یا aptitude safe-upgrade apache2، به ترتیب برای CentOS یا Debian) استفاده کنید. مگر اینکه راه دیگری وجود نداشته باشد. میتوانید آخرین یادداشتهای انتشار را در بخش Apache Documentation در وبسایت پروژه سرور HTTP Apache بخوانید.
نکته 2: اگر از کرنل قدیمیتر از 2.4 استفاده میکنید، همین حالا ارتقاء دهید.
در نسخه های هسته 2.4 و بالاتر، فراخوانی سیستم هسته sendfile به طور پیش فرض فعال است. این به نوبه خود، انتقال فایل های شبکه با کارایی بالا را تسهیل می کند. (که در زمینه ارتباطات وب سرور و مشتری مورد نظر است). و Apache را قادر می سازد تا با انجام عملیات خواندن و ارسال همزمان، محتوای ثابت را سریعتر و با استفاده کمتر از CPU ارائه دهد.
می توانید هسته نصب شده فعلی خود را با موارد زیر مشاهده کنید:
# uname -r
و آن را با آخرین هسته پایدار در www.kernel.org مقایسه کنید. (4.3 در زمان نگارش این مقاله).
اگرچه این فرآیند که برای مبتدیان در نظر گرفته نشده است. اما ارتقای هسته شما تمرین جالبی برای کسب اطلاعات بیشتر در مورد داخلی لینوکس است.
نکته 3: Multi-Processing Module (MPM) را انتخاب کنید که برای پرونده شما مناسب می باشد.
در عمل، MPM ها عملکرد ماژولار Apache را گسترش می دهند. و به شما این امکان را می دهند که نحوه پیکربندی وب سرور برای اتصال به پورت های شبکه در دستگاه، پذیرش درخواست های مشتریان و استفاده از children processes (و threads, alternatively) برای رسیدگی به چنین درخواست هایی را افزایش دهید.
با شروع نسخه 2.4، Apache بسته به نیاز شما، سه MPM مختلف را ارائه می دهد:
- Prefork MPM از چندین child processes بدون threading استفاده می کند. هر فرآیند در یک زمان یک اتصال را بدون ایجاد رشته های جداگانه برای هر یک انجام می دهد. بدون پرداختن به جزئیات زیاد، میتوان گفت که از MPM فقط در هنگام اشکالزدایی برنامهای استفاده کنید. که برنامه شما با ماژول های غیر ایمن مانند mod_php سروکار داشته باشد.
- worker MPM از چندین رشته در هر child processes استفاده می کند، که در آن هر رشته در یک زمان یک اتصال را مدیریت می کند. این یک انتخاب خوب برای سرورهای پرترافیک است زیرا اجازه می دهد تا اتصالات همزمان بیشتری با رم کمتری نسبت به مورد قبلی انجام شود.
- در نهایت، event MPM همان default MPM در اکثر نصبهای Apache برای نسخههای 2.4 و بالاتر می باشد شبیه worker MPM است که در هر child process ، چندین رشته ایجاد میکند، اما یک مزیت دارد: باعث میشود اتصالات KeepAlive یا idle connections (در حالی که در آن حالت باقی میمانند) توسط یک رشته مدیریت شوند. بنابراین حافظهای را آزاد میکند که میتواند به موضوعات دیگر اختصاص داده شود. این MPM برای استفاده با ماژول های غیر ایمن مانند mod_php مناسب نیست که برای آن باید جایگزینی مانند PHP-FPM استفاده شود.
برای بررسی MPM مورد استفاده در نصب Apache، می توانید دستور زیر را انجام دهید:
# httpd -V
تصویر زیر نشان می دهد که این وب سرور خاص از Prefork MPM استفاده می کند.
برای تغییر این مورد، به صورت زیر ویرایش کنید:
# /etc/httpd/conf.modules.d/00-mpm.conf [On RedHat/CentOS based systems] # /etc/apache2/mods-available/<mpm>.load [On Debian/Ubuntu based systems]
جایی که <mpm> می تواند mpm_event، mpm_worker یا mpm_prefork باشد.
و دستوری را که ماژول مورد نظر را بارگذاری می کند، از حالت نظر خارج کنید:
LoadModule mpm_event_module modules/mod_mpm_event.so
توجه: برای اینکه رویداد MPM در دبیان کار کند، ممکن است مجبور شوید بسته libapache2-mod-fastcgi را از مخازن غیر رایگان نصب کنید.
علاوه بر این، برای CentOS به php-fpm (همراه با fcgi و mod_fcgid) نیاز دارید در حالی که در دبیان php5-fpm (به همراه apache2-mpm-event) نامیده می شود.
آخرین وب سرور و سرویس تازه نصب شده php-fpm (یا php5-fpm) را مجددا راه اندازی کنید:
On RedHat/CentOS
# systemctl restart httpd php-fpm && systemctl enable httpd php-fpm
On Debian/Ubuntu
# systemctl restart apache2 php5-fpm && systemctl enable apache2 php5-fpm
اگرچه میتوانید Apache را برای استفاده از یک MPM خاص تنظیم کنید، این پیکربندی میتواند بر اساس هر میزبان مجازی به همان روشی که قبلاً نشان داده شد لغو شود.
تگ های مربوطه را در فایل پیکربندی هر میزبان مجازی رها کنید و آماده شروع کار باشید – اما مطمئن شوید که تنها از یک MPM در هر vhost استفاده می کنید.
لطفاً توجه داشته باشید که صرف نظر از توزیع انتخابی شما، php-fpm به پیاده سازی FastCGI متکی است، به همین دلیل است که نصب بسته های اضافی را زودتر توصیه کردیم.
برای جزئیات بیشتر و مثالهایی درباره php-fpm و اینکه چگونه میتواند همراه با رویداد MPM باعث افزایش عملکرد Apache شود، باید به مستندات رسمی مراجعه کنید.
این چیزی است که پس از تغییر MPM پیش فرض از prefork به رویداد در همان کادر نشان داده شده در تصویر قبلی مشاهده می کنید:
در CentOS 7، باید مطمئن شوید که سرویسهای http و https از طریق فایروال فعال شدهاند و رابط(های) شبکه به درستی به منطقه پیشفرض اضافه شدهاند.
مثلا:
# firewall-cmd --zone=internal --add-interface=tun6to4 # firewall-cmd --zone=internal --add-interface=tun6to4 --permanent # firewall-cmd --set-default-zone=internal # firewall-cmd --add-service=http # firewall-cmd --add-service=https # firewall-cmd --add-service=http --permanent # firewall-cmd --add-service=https --permanent # firewall-cmd --reload
دلیل اینکه این موضوع را مطرح می کنیم این است که اخیراً مشکلی را تجربه کردیم که در آن تنظیمات پیکربندی فایروالد پیش فرض در VPS ابری مانع از پردازش فایل های php-fpm و Apache می شد.
به عنوان یک تست اولیه (می توانید به موارد پیچیده تر یا استرس زا فکر کنید)، یک فایل php ایجاد خواهید کرد که وجود فایل دیگری به نام test.php را در دایرکتوری مشابه دو سرور CentOS 7 با مشخصات سخت افزاری یکسان بررسی می کند، اما با MPM متفاوت. یکی از آنها از event و دیگری از prefork استفاده می کند:
این کد php است که در فایلی به نام checkiffileexists.php ذخیره کرده ایم:
<?php $filename = 'test.php'; if (file_exists($filename)) { echo "The file $filename exists"; } else { echo "The file $filename does not exist"; } ?>
سپس ابزار بنچمارک Apache (ab) را با 200 درخواست همزمان اجرا کنید تا زمانی که 2000 درخواست تکمیل شود:
# ab -k -c 100 -n 2000 localhost/checkiffileexists.php
تست را اجرا کرده و نتایج را با هم مقایسه کنید. به آمار عملکرد توجه کنید:
همانطور که می بینید، عملکرد سرور با event در هر جنبه ای از این تست بسیار برتر از همتای prefork خود است.
نکته 4: رم را هوشمندانه به Apache اختصاص دهید.
شاید مهم ترین مورد سخت افزاری که باید در نظر گرفته شود، مقدار RAM اختصاص داده شده برای هر فرآیند Apache باشد. در حالی که نمیتوانید مستقیماً این را کنترل کنید. میتوانید تعداد child processes را از طریق دستورالعمل MaxRequestWorkers (که قبلاً MaxClients در Apache 2.2 نامیده میشد) محدود کنید. که محدودیتهایی را برای استفاده از RAM توسط Apache ایجاد میکند. باز هم، می توانید این مقدار را بر اساس هر میزبان یا هر میزبان مجازی تنظیم کنید.
برای انجام این کار، باید به میانگین مقدار رم استفاده شده توسط Apache توجه داشته باشید. سپس آن را در تعداد MaxRequestWorkers ضرب کنید. و این مقدار حافظه ای است که برای پردازش های Apache تخصیص داده می شود. یکی از کارهایی که هرگز نمی خواهید وب سرور شما انجام دهد این است که شروع به استفاده از swap کند. زیرا این کار به طور قابل توجهی عملکرد آن را کاهش می دهد. بنابراین، شما باید همیشه استفاده از رم توسط Apache را در محدودهای که میتوانید بخرید نگه دارید و هرگز به تعویض آن متکی نباشید.
به عنوان مثال، بلوک زیر تعداد کلاینتهای همزمان را به 30 محدود میکند. اگر مشتریهای بیشتری به هاست ضربه بزنند، ممکن است با تاخیر یا خرابی لحظهای مواجه شوند. که میتوان آن را به راحتی با بهروزرسانی مرورگر حل کرد. اگرچه ممکن است این امر نامطلوب تلقی شود، اما برای سرور سالم تر و در دراز مدت برای سایت شما نیز بهترین است.
بسته به اینکه از CentOS یا Debian استفاده می کنید، می توانید این بلوک را در /etc/httpd/conf/httpd.conf یا /etc/apache2/apache2.conf قرار دهید.
لطفاً توجه داشته باشید که این اصل برای همه MPM ها صدق می کند.
از این رویداد در اینجا برای ادامه مفهومی که در نکته قبلی توضیح داده شد استفاده می کنیم.
StartServers 3 MinSpareThreads 25 MaxSpareThreads 75 ThreadLimit 64 ThreadsPerChild 25 MaxRequestWorkers 30 MaxConnectionsPerChild 1000 </IfModule>
در هر صورت، به شدت توصیه می شود که به اسناد Apache 2.4 مراجعه کنید. تا ببینید کدام دستورالعمل ها برای MPM انتخابی شما مجاز هستند.
نکته 5: برنامه های کاربردی خود را بشناسید.
به عنوان یک قاعده کلی، شما نباید هیچ ماژول Apache را که برای کارکرد برنامه شما به شدت مورد نیاز نیست، بارگذاری کنید. این حداقل به دانش کلی از برنامه های در حال اجرا بر روی سرور شما نیاز دارد. به خصوص اگر شما یک مدیر سیستم هستید و تیم دیگری مسئول توسعه است.
شما می توانید ماژول های بارگذاری شده فعلی را با موارد زیر لیست کنید:
# httpd -M [On RedHat/CentOS based systems] # apache2ctl -M [On Debian/Ubuntu based systems]
برای تخلیه/غیرفعال کردن ماژولها در CentOS، باید خطی را که با LoadModule شروع میشود، توضیح دهید. (یا در فایل پیکربندی اصلی یا در فایل کمکی داخل /etc/httpd/conf.modules.d).
از طرف دیگر، دبیان ابزاری به نام a2dismod برای غیرفعال کردن ماژول ها ارائه می دهد. و به صورت زیر استفاده می شود:
# a2dismod module_name
برای فعال کردن دوباره آن از دستور زیر استفاده کنید:
# a2enmod module_name
در هر صورت، به یاد داشته باشید که Apache را مجدداً راه اندازی کنید تا تغییرات اعمال شوند.
نتیجه گیری
در این آموزش 5 نکته برای افزایش عملکرد Apache Web Server را بررسی کردیم. علاوه بر این، باید به خاطر داشته باشید که بهینه سازی و عملکرد بدون امنیت بی معنی است. امیدوارم این مقاله برایتان مفید بوده باشد. نظرات خود را از طریق فرم زیر با ما به اشتراک بگذارید.