افزایش سرعت و بهینه سازی PHP-FPM در سرور مجازی
ظرفیت واقعی یک سرور مجازی که روی آن سایت راه اندازی شده، برای مدیریت بازدید کنندگان همزمان، مستقیما به تنظیمات مدیریت پردازش PHP یا همان PHP-FPM بستگی دارد. بسیاری از خطاهای رایج مانند 503 Service Unavailable و 504 Gateway Timeout و کندی سایت، نه به دلیل ضعف سختافزار، بلکه به دلیل محدودیتهای اعمالشده توسط تنظیمات پیشفرض PHP-FPM رخ میدهد.
این راهنمای فنی که توسط ایرج زاهدی مدیر فنی بلوسرور نوشته شده است، به صورت عملی به شما نشان میدهد که چگونه این تنظیمات کلیدی را برای افزایش محسوس ظرفیت سرور و جلوگیری از خطاهای ناگهانی بهینه کنید.
PHP-FPM به زبان ساده
هر بازدید کننده ای که وارد سایت شما میشود، مانند یک مشتری است که به فروشگاه شما وارد میشود. برای اینکه به این مشتری سرویس داده شود، باید یک صندوق دار آزاد وجود داشته باشد تا سفارش او را پردازش کند. در دنیای سرور، این صندوق دارها همان «پردازشهای PHP» یا Worker ها هستند.
نرم افزار PHP-FPM (FastCGI Process Manager) دقیقا مدیر این صندوق دارها است. وظیفه او این است که تصمیم بگیرد چه تعداد صندوق دار همیشه آماده به کار باشند، در زمان شلوغی چه تعداد صندوق دار جدید اضافه شوند و چه زمانی صندوق دارهای بیکار به خانه فرستاده شوند تا هزینه اضافی ایجاد نکنند.
به طور خلاصه: هر پردازش PHP-FPM یک کارگر برای پاسخ به درخواستهای کاربران است. اگر تعداد کارگران کافی نباشد، مشتریان (بازدیدکنندگان) در صف منتظر میمانند و اگر صف طولانی شود، با خطا مواجه شده و فروشگاه (سایت) شما را ترک میکنند.
PHP-FPM سه روش برای مدیریت این کارگران دارد:
- Dynamic (پویا): این مدیر یک تعداد مشخص کارگر را همیشه آماده نگه میدارد. اگر سرش شلوغ شد، کارگران جدیدی را تا یک سقف مشخص استخدام میکند و پس از خلوت شدن، کارگران اضافی را مرخص میکند. این حالت، محبوب ترین و متعادل ترین روش است.
- Static (ثابت): این مدیر همیشه یک تعداد ثابت و مشخص کارگر را در فروشگاه نگه میدارد، چه سرش شلوغ باشد و چه خلوت. این حالت بیشترین سرعت را دارد اما منابع بیشتری (حافظه RAM) مصرف میکند.
- Ondemand (بر اساس تقاضا): این مدیر هیچ کارگری را آماده نگه نمیدارد. فقط زمانی که مشتری وارد میشود، یک کارگر را صدا میزند. این حالت کمترین مصرف منابع را دارد اما برای پاسخ به اولین درخواست تاخیر ایجاد میکند و برای سایتهای فعال توصیه نمیشود.
کدام حالت PHP-FPM برای کدام سرور بهتر است؟
انتخاب حالت مناسب به نوع کاربری سرور شما بستگی دارد. جدول زیر یک راهنمای سریع برای تصمیمگیری است:
| نوع سایت یا کاربرد | حالت مناسب | دلیل فنی |
|---|---|---|
| سایت وردپرسی با ترافیک کم تا متوسط | Dynamic | بهترین تعادل بین مصرف بهینه منابع و عملکرد سریع. |
| فروشگاه آنلاین یا API پرترافیک | Static | با آماده نگه داشتن تمام پردازشها، تاخیر را حذف کرده و پاسخگوی درخواستهای همزمان و کوتاه است. |
| سرورهای توسعه یا سایتهای بسیار کمترافیک | Ondemand | کمترین مصرف حافظه در زمان بیکاری سرور. |
انتخاب حالت مناسب PHP-FPM اولین قدم در بهینهسازی سرور برای سایتهای وردپرسی است. برای آشنایی کامل با نیازمندیهای سختافزاری و نرمافزاری، میتوانید راهنمای تخصصی ما در مورد انتخاب سرور مجازی برای وردپرس را مطالعه کنید.
این انتخابها به خصوص زمانی اهمیت پیدا میکنند که شما در حال راهاندازی یک وبسایت روی یک زیرساخت باکیفیت مانند سرور مجازی آلمان هستید که به دلیل پایداری و قدرت پردازشی بالا، برای میزبانی وبسایتهای حرفهای بسیار محبوب است.
چگونه تنظیمات PHP-FPM را بهینه کنیم؟
اکنون که با مفاهیم آشنا شدیم، به بخش عملی میرسیم. تنظیمات PHP-FPM در یک فایل متنی به نام www.conf ذخیره میشود.
توجه داشته باشید که این راهنما برای کاربرانی است که به سرور خود دسترسی روت (root) دارند. اگر هنوز زیرساخت مناسبی ندارید، اولین مرحله خرید vps از بین پلن ها و سخت افزارهای مختلف با منابع کافی است تا بتوانید این بهینهسازیها را به درستی پیادهسازی کنید.
مرحله اول: پیدا کردن فایل تنظیمات
ابتدا باید با دسترسی SSH به سرور خود متصل شوید. سپس با استفاده از دستورات زیر میتوانید مسیر فایل www.conf را پیدا کنید. این مسیر معمولا بسته به نسخه PHP شما کمی متفاوت است:
مسیرهای رایج:
/etc/php/8.3/fpm/pool.d/www.conf
/etc/php/8.1/fpm/pool.d/www.conf
/etc/php/7.4/fpm/pool.d/www.confپس از پیدا کردن فایل، آن را با یک ویرایشگر متن مانند nano باز کنید:
nano /etc/php/8.1/fpm/pool.d/www.conf
مرحله دوم: محاسبه مقدار درست برای pm.max_children
مهمترین پارامتر در این فایل، pm.max_children است. این عدد به PHP-FPM میگوید که حداکثر چند کارگر (پردازش) میتواند به صورت همزمان فعال باشد. اگر این عدد خیلی کم باشد، سایت شما در ترافیک بالا از دسترس خارج میشود. اگر خیلی زیاد باشد، حافظه RAM سرور شما پر شده و کل سرور کند یا از دسترس خارج میشود.
برای محاسبه یک عدد مناسب، ابتدا باید بفهمیم هر پردازش PHP به طور متوسط چقدر از حافظه RAM را اشغال میکند. دستور زیر را در ترمینال سرور خود اجرا کنید:
ps -eo size,command | grep php-fpm | awk '{hr=$1/1024 ; sum += hr} END {print sum/NR,MB}'
این دستور به شما یک عدد میانگین میدهد (مثلا 30MB). حالا با استفاده از فرمول زیر، میتوانید یک عدد مناسب برای pm.max_children محاسبه کنید:
(کل حافظه RAM سرور – حافظه مصرفی سیستم عامل و سرویسهای دیگر) / میانگین مصرف هر پردازش PHP
برای مثال، فرض کنید شما یک سرور مجازی با 4GB (حدود 4000MB) رم دارید و هر پردازش PHP شما به طور متوسط 30MB رم مصرف میکند. همچنین فرض میکنیم که سیستم عامل، دیتابیس و سرویسهای دیگر حدود 1000MB رم را اشغال کرده اند.
محاسبه به این شکل خواهد بود:
(4000 - 1000) / 30 = 100
بنابراین، عدد ۱۰۰ یک مقدار شروع مناسب برای pm.max_children در سرور شماست.
مرحله سوم: تنظیم پارامترهای دیگر (برای حالت Dynamic)
اگر از حالت pm = dynamic استفاده میکنید (که برای اکثر کاربران توصیه میشود)، پارامترهای دیگر را بر اساس pm.max_children تنظیم کنید:
- pm.max_children: حداکثر تعداد پردازشها (کارگران). (بر اساس محاسبه بالا)
- pm.start_servers: تعداد کارگرانی که در زمان راه اندازی سرویس، آماده به کار میشوند. (معمولا ۲۵٪ از `max_children`)
- pm.min_spare_servers: حداقل تعداد کارگران بیکار که همیشه باید آماده باشند. (معمولا ۱۵٪ از `max_children`)
- pm.max_spare_servers: حداکثر تعداد کارگران بیکار. اگر تعدادشان از این بیشتر شود، PHP-FPM آنها را مرخص میکند. (معمولا ۳۵٪ از `max_children`)
یک نمونه تنظیمات برای سرور با 4GB رم:
pm = dynamic
pm.max_children = 100
pm.start_servers = 25
pm.min_spare_servers = 15
pm.max_spare_servers = 35
بهینه سازی عملی روی سرور مجازی بلوسرور
برای نمایش تاثیر واقعی این تنظیمات، یک تست روی یکی از سرورهای مجازی ۲ هستهای با ۴ گیگابایت رم انجام دادیم. پیش از بهینهسازی، میانگین مصرف رم هر پردازش PHP حدود ۷۰ مگابایت بود. پس از تنظیم دقیق pm.max_children = 35 (بر اساس حافظه آزاد سرور) و فعالسازی OPcache، میانگین مصرف هر پردازش به ۴۵ مگابایت کاهش یافت. مهمتر از آن، زمان پاسخ سرور (TTFB) تحت بار ترافیکی، از ۴۰۰ میلیثانیه به ۱۸۰ میلیثانیه رسید. این دادهها نشان میدهد که بهینهسازی صحیح میتواند عملکرد سرور را تا دو برابر بهبود دهد.
مرحله چهارم: ذخیره و راه اندازی مجدد سرویس
پس از انجام تغییرات، فایل را ذخیره کنید (در ویرایشگر nano با فشردن Ctrl+X، سپس Y و Enter). در نهایت، سرویس PHP-FPM را ری استارت کنید تا تنظیمات جدید اعمال شوند:
sudo systemctl restart php8.3-fpmنکته: حتما نسخه PHP خود را در دستور بالا جایگزین کنید (مثلا php7.4-fpm).
بررسی مصرف منابع PHP-FPM لحظه ای
پس از اعمال تنظیمات جدید، باید مطمئن شوید که سرور شما به درستی کار میکند. ابزارهای زیر به شما کمک میکنند تا مصرف منابع و وضعیت پردازشهای PHP-FPM را در لحظه مشاهده کنید:
- htop: برای نمایش زنده و کلی مصرف CPU و RAM توسط تمام سرویسها.
- ps -ylC php-fpm –sort:rss: برای مشاهده دقیق حافظه RAM مصرفی توسط هر کدام از پردازشهای PHP-FPM به صورت مجزا.
- systemctl status php8.3-fpm: برای بررسی وضعیت کلی سرویس و مشاهده خطاهای اخیر در اجرای آن.
برای نظارت پیشرفتهتر، میتوانید مسیر وضعیت (Status Path) را در فایل www.conf فعال کنید. این کار به شما یک صفحه وب ساده میدهد که آمار دقیقی از تعداد پردازشهای فعال، بیکار و صف درخواستها را نمایش میدهد و برای ابزارهای مانیتورینگ مانند Zabbix کاربردی است.
مقایسه PHP-FPM با روشهای دیگر اجرای PHP
در این جدول تفاوت میان سه روش متداول اجرای PHP یعنی PHP-FPM، mod_php و LSPHP را از نظر ساختار، کارایی و مصرف منابع مشاهده میکنید:
| روش اجرا | نحوه پردازش | کارایی در ترافیک بالا | مصرف RAM | مناسب برای |
|---|---|---|---|---|
| PHP-FPM | پردازش جدا از وبسرور (FastCGI) | عالی | متوسط | Nginx، Apache با Proxy یا سرورهای مجازی |
| mod_php | پردازش درون Apache (mod) | متوسط | زیاد | هاستهای قدیمی یا محیطهای ساده |
| LSPHP | پردازش داخلی در LiteSpeed Server | عالی | کم | LiteSpeed Enterprise و CyberPanel |
در اغلب سرورهای مدرن، استفاده از PHP-FPM بهدلیل انعطافپذیری، کنترل بهتر Worker Pool و سازگاری با Nginx، بهترین گزینه محسوب میشود.
بهینه سازی های بیشتر برای افزایش کارایی PHP
تنظیمات PHP-FPM تنها بخشی از بهینهسازی عملکرد است. برای کاهش بار روی پردازنده و افزایش سرعت کلی، موارد زیر را نیز در نظر بگیرید:
درک عملکرد OPcache و تاثیر آن بر پردازشهای PHP-FPM
OPcache یک ابزار کش داخلی در PHP است که کدهای کامپایلشده اسکریپتهای شما را در یک حافظه اشتراکی (Shared Memory) در RAM ذخیره میکند. پردازشهای PHP-FPM (کارگران ما) به جای اینکه برای هر درخواست، فایلهای PHP را از دیسک بخوانند و آنها را کامپایل کنند، مستقیما به این حافظه اشتراکی مراجعه کرده و از نسخه آماده استفاده میکنند. این فرآیند بار پردازنده (CPU) و عملیات دیسک (I/O) را به شدت کاهش میدهد.
نکته مهم این است که تمام کارگران PHP-FPM از یک حافظه مشترک استفاده میکنند. اگر تعداد کارگران (pm.max_children) بیش از حد بالا باشد و این کارگران به طور مداوم ایجاد و حذف شوند (به خصوص در حالت dynamic)، ممکن است باعث ایجاد پدیده Fragmentation یا تکه تکه شدن در حافظه OPcache شوند. این وضعیت باعث میشود حافظه کش بهینه عمل نکند و مجبور به کامپایل مجدد کدها شود که نتیجه آن کاهش کارایی است.
توصیه عملی: همیشه تنظیمات
pm.max_childrenرا در هماهنگی با حافظه اختصاص داده شده به OPcache (opcache.memory_consumptionدر فایلphp.ini) در نظر بگیرید. برای سایتهای پرترافیک، استفاده از حالتstaticدر PHP-FPM میتواند با کاهش نرخ ایجاد و حذف پردازشها، به پایداری حافظه OPcache کمک کند.
- تنظیم realpath_cache_size: افزایش این مقدار در فایل
php.iniبه PHP کمک میکند مسیر فایلها را سریعتر پیدا کند و عملیات I/O دیسک را کاهش دهد. - تنظیم request_terminate_timeout: با تنظیم یک مقدار مشخص (مثلا 60 ثانیه)، از اجرای بیش از حد طولانی اسکریپتها که ممکن است سرور را درگیر کنند، جلوگیری میکنید.
خطاهای رایج در تنظیم PHP-FPM و راه حل آنها
- خطای 503 Service Unavailable: این خطا مستقیمترین نتیجه پر شدن ظرفیت PHP-FPM است و زمانی رخ میدهد که تمام کارگران شما مشغول هستند و صف انتظار نیز پر است، در نتیجه سرور دیگر قادر به پذیرش درخواستهای جدید نیست. راه حل: راه حل اصلی، افزایش مقدار
pm.max_childrenبر اساس منابع RAM سرور شماست. - خطای 504 Gateway Timeout: این خطا زمانی رخ میدهد که یک کارگر PHP درگیر یک پردازش بسیار طولانی (مانند یک کوئری سنگین دیتابیس) شده و وبسرور از منتظر ماندن برای پاسخ، منصرف میشود. راه حل: ابتدا اسکریپتهای کند را بهینه کنید. اگر پردازشها واقعا زمانبر هستند، مقدار
request_terminate_timeoutدر PHP-FPM و `proxy_read_timeout` در Nginx را افزایش دهید. - خطای Out of Memory (تمام شدن حافظه): اگر مقدار
pm.max_childrenرا بیش از ظرفیت حافظه RAM سرور خود تنظیم کنید، سرور با کمبود حافظه مواجه شده و ممکن است پردازشها را از بین ببرد. راه حل: مقدارpm.max_childrenرا بر اساس فرمول ارائه شده کاهش دهید. - خطای Too many open files: این خطا نشان میدهد که محدودیت سیستم عامل برای تعداد فایلهای باز، پایین است. راه حل: مقدار
LimitNOFILEرا در فایل سرویس systemd برای PHP-FPM افزایش دهید.
سوالات متداول درباره بهینه سازی PHP-FPM
آیا تنظیم PHP-FPM روی هاست اشتراکی ممکن است؟
خیر، این تنظیمات نیازمند دسترسی روت (root) به سرور است و فقط در سرورهای مجازی (VPS) یا سرورهای اختصاصی قابل انجام است.
چگونه بفهمم تنظیمات جدید بهتر عمل کردهاند؟
با استفاده از ابزارهایی مانند GTmetrix یا PageSpeed Insights، زمان پاسخ اولیه سرور (TTFB) را قبل و بعد از تغییرات اندازه گیری کنید. کاهش این زمان، نشانه بهبود عملکرد است.
تفاوت PHP-FPM با mod_php چیست؟
PHP-FPM پردازشهای PHP را به صورت مستقل از وب سرور (مانند Apache) مدیریت میکند. این معماری مدرنتر، مصرف منابع بهینهتری دارد و در محیطهای با ترافیک بالا پایداری بیشتری ارائه میدهد.
نتیجه گیری: کدام حالت PHP-FPM برای سایت شما مناسب است؟
بهینه سازی PHP-FPM یکی از موثرترین کارها برای افزایش پایداری و ظرفیت سرور مجازی شماست.
- برای ۹۰٪ سایتها (حتی فروشگاه های آنلاین): استفاده از حالت Dynamic با تنظیمات محاسبه شده، بهترین تعادل بین مصرف منابع و عملکرد را ارائه میدهد.
- برای سایتهای بسیار پرترافیک و سرورهای قدرتمند: اگر سرور شما منابع RAM بالایی دارد و همیشه ترافیک سنگینی را تجربه میکنید، استفاده از حالت Static میتواند با حذف تاخیر در ایجاد پردازشهای جدید، بهترین عملکرد ممکن را ارائه دهد. در این حالت، شما فقط مقدار
pm.max_childrenرا تنظیم میکنید و سرور همیشه آن تعداد پردازش را آماده نگه میدارد.
با درک این مفاهیم و اعمال این تنظیمات، شما کنترل بسیار بیشتری بر عملکرد سرور خود خواهید داشت و میتوانید با اطمینان بیشتری به استقبال ترافیکهای سنگین بروید. البته این بهینهسازیها روی یک زیرساخت قدرتمند بهترین نتیجه را میدهند و اگر سرور فعلی شما قدیمی است، شاید زمان خرید vps جدید فرا رسیده باشد. اگر پس از این بهینهسازیها همچنان با کندی مواجه هستید، ممکن است مشکل در لایههای دیگر مانند وبسرور باشد که در این صورت مطالعه راهنمای بهینه سازی وب سرور آپاچی توصیه میشود، یا مشکل از کوئریهای بهینه نشده دیتابیس باشد.
بهینهسازی واقعی زمانی معنا دارد که زیرساخت شما پاسخگو باشد.
حتی بهترین تنظیمات PHP-FPM بدون سختافزار سریع، شبکه پایدار و دیسکهای NVMe نتیجهای ندارد.
سرورهای مجازی بلوسرور بر پایه پردازندههای نسل جدید و کانفیگ حرفهای PHP طراحی شدهاند تا از تمام پتانسیل FPM بهره ببرید.
فهرست تیترها
نویسنده: ایرج زاهدی، بنیانگذار و معمار فنی بلوسرور. محتوای این مقالات بر پایه تجربه عملی در طراحی، پیادهسازی و مدیریت پروژههای متنوع میزبانی وب در ایران و خارج از کشور، در طول بیش از یک دهه فعالیت مداوم نوشته شده است. به عنوان متخصص در بهینهسازی عملکرد و عیبیابی سیستمهای هاستینگ (از VPS تا هاست اشتراکی)، هدف من به اشتراکگذاری تجربیات و راهکارهای فنی است؛ همان دانشی که امروز ستون اصلی پایداری و کیفیت در سرویسهای بلوسرور محسوب میشود.
