گلوگاه عملکردی بین Apache و PHP‑FPM و نحوهٔ تنظیم صحیح Child Processها

این مقاله توضیح می‌دهد چرا در سرورهایی که Apache با MPM نوع prefork و PHP‑FPM اجرا می‌شود، ممکن است گلوگاه (Bottleneck) ایجاد شود. همچنین نحوهٔ رفع مشکل با هماهنگ‌سازی تعداد Apache Workers و PHP‑FPM Child Processes را توضیح می‌دهد. در ادامه، یک راهنمای کامل از تنظیمات PHP‑FPM و مقادیر پیش‌فرض آن ارائه شده است.

apache php-fpm performancephp-fpm configuration cpanelprefork mpm bottleneck

~3 دقیقه مطالعه • بروزرسانی ۲۶ بهمن ۱۴۰۴

Apache vs. PHP-FPM Bottleneck with Child Processes


آخرین ویرایش: 11 مارس 2021


Overview

در سرورهایی که Apache با MPM نوع prefork اجرا می‌شود، اگر تعداد Apache Server Instances کمتر از تعداد PHP-FPM Child Processes باشد، ممکن است مشکلات جدی عملکردی ایجاد شود. این مقاله نحوهٔ رفع این مشکل را توضیح می‌دهد.


مشکل چگونه ایجاد می‌شود؟

فرض کنید تنظیمات PHP-FPM اجازهٔ ایجاد 20 Child Process را می‌دهد، اما Apache فقط 5 Server Instance دارد.

نمونهٔ تنظیمات PHP-FPM:


pm_max_children: 20
pm_max_requests: 20

نمونهٔ تنظیمات Apache (prefork MPM):


StartServers: 5
MinSpareServers: 10
MaxSpareServers: 10

اگر Apache هم‌زمان 20 درخواست دریافت کند، فقط 5 پردازشگر دارد و مجبور است درخواست‌ها را به‌صورت دسته‌ای به PHP-FPM ارسال کند. این باعث ایجاد صف، تأخیر و افت شدید عملکرد می‌شود.

هشدار: در سرورهای پرترافیک، این پیکربندی می‌تواند باعث کندی شدید و حتی Down شدن سرویس شود.


راه‌حل

برای رفع مشکل، باید تعداد Apache Workers را حداقل برابر با مقدار pm_max_children در PHP-FPM تنظیم کنید.

در WHM به مسیر زیر بروید:

WHM » Home » Service Configuration » Global Configuration

و مقادیر زیر را تنظیم کنید:

  • Minimum Spare Servers
  • Maximum Spare Servers
  • Max Request Workers

این مقادیر باید بزرگ‌تر یا مساوی مقدار pm_max_children باشند.




Configuration Values of PHP-FPM


آخرین ویرایش: 5 دسامبر 2023


Overview

این بخش تمام تنظیمات PHP-FPM و مقادیر پیش‌فرض آن‌ها را توضیح می‌دهد. برخی از این تنظیمات از طریق WHM و بخش MultiPHP Manager قابل مدیریت هستند.

هشدار: فعال‌سازی PHP-FPM فقط زمانی توصیه می‌شود که سرور حداقل 2GB RAM یا حداقل 30MB RAM برای هر دامنه داشته باشد. در غیر این صورت، سرور با مشکلات شدید عملکردی مواجه می‌شود.


Global Directives

این تنظیمات در فایل /var/cpanel/ApachePHPFPM/system.yaml قرار دارند. هنگام ویرایش این فایل باید نقطه‌ها را با آندرلاین جایگزین کنید.

KeyNameDefault
daemonizedaemonizeno
emergency_restart_intervalemergency_restart_interval0
error_logerror_log/opt/cpanel/.../php-fpm/error.log
log_levellog_levelnotice
pidpid/opt/cpanel/.../php-fpm.pid
process_control_timeoutprocess_control_timeout10

هشدار: هرگونه اشتباه در فایل YAML باعث اختلال در سرویس‌ها می‌شود. قبل از ویرایش، حتماً بکاپ بگیرید.


Pool Name Directives

هر دامنه در PHP-FPM یک Pool جداگانه دارد. این تنظیمات در فایل system_pool_defaults.yaml قرار دارند.

KeyNameDefault
catch_workers_outputcatch_workers_outputyes
chdirchdir[% homedir %]
groupgroupnobody
listenlisten"[% socket_path %]"
listen_modelisten.mode0660
pmpmondemand
pm_max_childrenpm.max_children5
pm_max_requestspm.max_requests20
pm_process_idle_timeoutpm.process_idle_timeout10
useruser"[% username %]"

نکات مهم YAML

  • برای رشته‌هایی که شامل " هستند، باید از ' استفاده کنید.
  • برای استفاده از " داخل رشته، باید از \ استفاده کنید.
  • کلیدها فقط باید شامل حروف، اعداد و آندرلاین باشند.

افزودن یک مقدار جدید

نمونهٔ یک خط کامل تنظیم:


php_value_open_basedir: { name: 'php_value[open_basedir]', value: "[% documentroot %]" }

افزودن یک مقدار ناشناخته

برای افزودن مقادیری که به‌صورت پیش‌فرض وجود ندارند:


php_admin_value_ldap_max_links: { name: 'php_admin_value[ldap.max_links]', value: -1 }

هشدار: اگر از php_value یا php_flag استفاده کنید، مقدار جدید جایگزین php.ini در .htaccess می‌شود.


Conclusion

هماهنگ‌سازی صحیح Apache و PHP-FPM برای جلوگیری از گلوگاه‌های عملکردی ضروری است. همچنین شناخت کامل تنظیمات PHP-FPM به شما کمک می‌کند تا بهترین عملکرد را برای سایت‌ها و اپلیکیشن‌های PHP فراهم کنید.


نوشته و پژوهش شده توسط دکتر شاهین صیامی