
مقدمه
وبسرور آپاچی (Apache HTTP) در طول سالیان گذشته تکامل یافته است تا در محیطهای مختلفی کار کرده و نیازهای متفاوتی را برآورده سازد. یکی از مشکلات مهمی که آپاچی مانند هر وبسرور دیگری باید آن را حل کند، نحوه مدیریت پردازشها (Processes) برای پاسخگویی به درخواستهای پروتکل HTTP است. این فرآیند شامل باز کردن یک سوکت (Socket)، پردازش درخواست، نگه داشتن اتصال برای مدت زمان مشخص، مدیریت رویدادهای جدیدی که از طریق آن اتصال رخ میدهند و در نهایت بازگرداندن محتوای تولید شده توسط یک برنامه نوشته شده به زبانی خاص (مانند PHP، Perl یا Python) است. این وظایف توسط یک ماژول پردازش چندگانه (MPM یا Multi-Processing Module) انجام شده و کنترل میشوند.
وبسرور آپاچی با سه نوع MPM مختلف ارائه میشود:
- Pre-fork: برای هر اتصال جدیدی که به سرور میرسد، یک پردازش (Process) جدید ایجاد میشود. هر پردازش از بقیه ایزوله است، بنابراین حتی اگر در لحظهای در حال انجام فراخوانیهای یکسانی باشند، حافظهای بین آنها به اشتراک گذاشته نمیشود. این روشی امن برای اجرای برنامههایی است که به کتابخانههایی متصل هستند که از Threading پشتیبانی نمیکنند (معمولاً برنامهها یا کتابخانههای قدیمی).
- Worker: یک پردازش والد مسئول راهاندازی مجموعهای از پردازشهای فرزند است. برخی از این فرزندان به درخواستهای جدید گوش میدهند و سایرین محتوای درخواست شده را سرو میکنند. هر پردازش دارای Thread (نخ) است (یک Thread میتواند یک اتصال را مدیریت کند) بنابراین یک پردازش میتواند همزمان چندین درخواست را مدیریت کند. این روش منابع را بهتر استفاده میکند در حالی که پایداری را حفظ میکند.
- Event: این ماژول بر پایه Worker ساخته شده اما یک گام جلوتر است و نحوه زمانبندی وظایف توسط پردازش والد به پردازشهای فرزند و Threadهای مرتبط با آنها را بهینهسازی میکند. در آپاچی، یک اتصال به طور پیشفرض ۵ ثانیه باز میماند و اگر رویداد جدیدی رخ ندهد بسته میشود (این مقدار پیشفرض دستور keep-alive است). ماژول Event به پردازش اجازه میدهد تا Threadها را به گونهای مدیریت کند که برخی Threadها برای مدیریت اتصالات جدید آزاد باشند در حالی که سایرین به اتصالات زنده متصل میمانند. این توزیع مجدد وظایف باعث استفاده بهتر از منابع و افزایش عملکرد میشود.
PHP-FPM یا FastCGI Process Manager، مدیریت پردازشهای FastCGI برای PHP است. پروتکل FastCGI بر پایه رابط دروازه مشترک (CGI) بنا شده است که پلی بین برنامهها و وبسرورهایی مانند آپاچی ایجاد میکند. این به توسعهدهندگان اجازه میدهد برنامههای خود را جدا از رفتار وبسرورها بنویسند. برنامهها پردازشهای خود را مستقلاً اجرا کرده و خروجی خود را از طریق این پروتکل به وبسرور میفرستند.
با ترکیب ماژول MPM Event در آپاچی و PHP-FPM، یک وبسایت میتواند سریعتر بارگذاری شود و اتصالات همزمان بیشتری را با مصرف منابع کمتری مدیریت کند.
در این آموزش، شما عملکرد پشته LAMP خود را با تغییر ماژول پردازش چندگانه پیشفرض از Pre-fork به Event و استفاده از PHP-FPM (به جای ماژول کلاسیک mod_php در آپاچی) برای مدیریت کدهای PHP، بهبود خواهید بخشید.
پیشنیازها
پیش از شروع این راهنما به موارد زیر نیاز دارید:
- یک سرور اوبونتو 24.04 که طبق راهنمای راهاندازی اولیه سرور در پارمین کلود (Parmin Cloud) پیکربندی شده باشد، شامل یک کاربر غیر روت (non-root) با دسترسی sudo و فایروال.
- مجموعه LAMP روی سرور شما نصب باشد.
مرحله ۱ — تغییر ماژول پردازش چندگانه (MPM)
اوبونتو اسکریپتهایی را برای فعال یا غیرفعال کردن ماژولهای آپاچی از توزیع والد خود (دبیان) به ارث برده است. در این مرحله، شما از این ابزارها برای غیرفعال کردن ماژول Pre-fork و فعال کردن ماژول Event استفاده خواهید کرد.
ابتدا سرویس آپاچی را متوقف کنید:
sudo systemctl stop apache2
اکنون میتوانید ماژول PHP 8.3 را که به ماژول Pre-fork مرتبط است، غیرفعال کنید:
sudo a2dismod php8.3
سپس ماژول MPM Pre-fork را غیرفعال کنید:
sudo a2dismod mpm_prefork
اکنون ماژول MPM Event را فعال کنید:
sudo a2enmod mpm_event
شما با موفقیت MPM را از Pre-fork به Event تغییر دادید و اتصال ماژول PHP را بین PHP و آپاچی حذف کردید. در مرحله بعد، ماژول php-fpm و کتابخانههای مرتبط را نصب خواهید کرد.
مرحله ۲ — پیکربندی آپاچی برای استفاده از FastCGI Process Manager
در این مرحله شما پردازشگر PHP-FPM را نصب میکنید تا آپاچی بتواند دوباره برنامههای PHP را پردازش کند. همچنین کتابخانههای وابسته را نصب کرده و ماژولهای لازم را فعال میکنید تا این دو به روانی و سریعتر از قبل با هم همکاری کنند.
ابتدا php-fpm را نصب کنید. دستور زیر پکیج PHP-FPM را نصب کرده و سرویس php8.3-fpm را به طور خودکار فعال میکند تا در زمان بوت سرور راهاندازی شود:
sudo apt install php-fpm
برای برقراری ارتباط، آپاچی و PHP به کتابخانهای نیاز دارند که این قابلیت را فراهم کند. اکنون libapache2-mod-fcgid را نصب میکنید که میتواند به عنوان رابطی بین برنامهها و وبسرورها (مخصوص آپاچی) عمل کند. این ارتباط از طریق یک سوکت یونیکس (UNIX socket) انجام میشود:
sudo apt install libapache2-mod-fcgid
شما php-fpm و libapache2-mod-fcgid را نصب کردهاید، اما هنوز فعال نشدهاند.
ابتدا ماژول php-fpm را با دستور زیر فعال کنید:
sudo a2enconf php8.3-fpm
دوم، ماژول پروکسی آپاچی را فعال کنید:
sudo a2enmod proxy
سوم، ماژول پروکسی FastCGI را در آپاچی فعال کنید:
sudo a2enmod proxy_fcgi
اکنون همه چیز در جای خود قرار گرفته است. پیش از استارت کردن آپاچی، ابتدا یک بررسی پیکربندی انجام دهید:
sudo apachectl configtest
خروجی باید Syntax OK باشد:
Output
Syntax OK
پس از آن میتوانید آپاچی را ریاستارت کنید:
sudo systemctl restart apache2
شما ماژول php-fpm را نصب کردید، آپاچی را برای کار با آن پیکربندی نمودید و ماژولهای لازم را برای کار کردن پروتکل FastCGI فعال کردید.
مرحله ۳ — بررسی پیکربندی
برای اطمینان از اینکه تغییرات پیکربندی اعمال شدهاند، چند تست انجام میدهید. تست اول بررسی میکند که آپاچی از کدام ماژول پردازش چندگانه استفاده میکند. تست دوم تایید میکند که PHP از مدیر FPM استفاده میکند.
وبسرور آپاچی را با دستور زیر بررسی کنید:
sudo apachectl -M | grep 'mpm'
خروجی به شکل زیر خواهد بود:
Output
mpm_event_module (shared)
میتوانید همین کار را برای ماژول پروکسی و FastCGI تکرار کنید:
sudo apachectl -M | grep 'proxy'
خروجی نشان داده خواهد شد:
Output
proxy_module (shared)
proxy_fcgi_module (shared)
اکنون زمان آن است که بررسی کنید آیا PHP از FastCGI Process Manager استفاده میکند یا خیر. برای این کار یک اسکریپت کوچک PHP مینویسید که تمام اطلاعات مربوط به PHP را به شما نشان میدهد.
دستور زیر را برای ایجاد فایلی به نام info.php اجرا کنید:
sudo nano /var/www/your_domain/info.php
محتوای زیر را در فایل info.php اضافه کنید:
info.php
<?php phpinfo(); ?>
اکنون آدرس URL سرور خود را در مرورگر باز کرده و در انتهای آن info.php را اضافه کنید: http://your_domain/info.php.
مقدار مربوط به بخش Server API باید FPM/FastCGI باشد.
پس از این بررسی، فایل info.php را حذف کنید تا اطلاعاتی درباره سرور شما به صورت عمومی فاش نشود:
sudo rm /var/www/your_domain/info.php
شما وضعیت کارکرد ماژول MPM، ماژولهای مدیریت FastCGI و نحوه پردازش کدهای PHP را بررسی کردید.
نتیجهگیری
شما پشته LAMP اولیه خود را بهینهسازی کردید؛ به طوری که تعداد اتصالات برای ایجاد پردازشهای جدید آپاچی افزایش یافته، PHP-FPM کدهای PHP را کارآمدتر مدیریت میکند و استفاده کلی از منابع بهبود یافته است. برای اطلاعات بیشتر در مورد ماژولهای مختلف، میتوانید به مستندات رسمی پروژه وبسرور آپاچی مراجعه کنید.
از همراهی شما با پارمین کلود سپاسگزاریم.




