~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 قرار دارند. هنگام ویرایش این فایل باید نقطهها را با آندرلاین جایگزین کنید.
| Key | Name | Default |
|---|---|---|
| daemonize | daemonize | no |
| emergency_restart_interval | emergency_restart_interval | 0 |
| error_log | error_log | /opt/cpanel/.../php-fpm/error.log |
| log_level | log_level | notice |
| pid | pid | /opt/cpanel/.../php-fpm.pid |
| process_control_timeout | process_control_timeout | 10 |
هشدار: هرگونه اشتباه در فایل YAML باعث اختلال در سرویسها میشود. قبل از ویرایش، حتماً بکاپ بگیرید.
Pool Name Directives
هر دامنه در PHP-FPM یک Pool جداگانه دارد. این تنظیمات در فایل system_pool_defaults.yaml قرار دارند.
| Key | Name | Default |
|---|---|---|
| catch_workers_output | catch_workers_output | yes |
| chdir | chdir | [% homedir %] |
| group | group | nobody |
| listen | listen | "[% socket_path %]" |
| listen_mode | listen.mode | 0660 |
| pm | pm | ondemand |
| pm_max_children | pm.max_children | 5 |
| pm_max_requests | pm.max_requests | 20 |
| pm_process_idle_timeout | pm.process_idle_timeout | 10 |
| user | user | "[% 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 فراهم کنید.
نوشته و پژوهش شده توسط دکتر شاهین صیامی