PHP-FPM Pool چیه و چطور تنظیمش کنیم؟

PHP-FPM Pool چیست و چطور آن را تنظیم کنیم؟

PHP-FPM (FastCGI Process Manager) روشی برای اجرای PHP روی وب سرور Nginx یا Apache هست اما Pool توی PHP-FPM یعنی یه گروه از پروسه های PHP که مخصوص یه سایت یا برنامه خاص تنظیم شدن


چرا Pool مهمه؟

  • ایزوله کردن سایت ها

هر سایت منابع خودش رو داره اگه یه سایت سنگین بشه سایت های دیگه کند نمیشن

  • امنیت بیشتر

هر Pool با یه کاربر لینوکسی جداگانه اجرا میشه اگه یه سایت هک بشه به فایل های سایت دیگه دسترسی نداره

  • تنظیمات اختصاصی

هر Pool میتونه تنظیمات PHP متفاوتی داشته باشه یه سایت upload_max_filesize بالا می‌خواد یه سایت دیگه memory_limit بیشتر

  • مدیریت منابع

میتونی برای هر سایت سقف منابع تعیین کنی که کل سرور رو قفل نکنه


فایل های Pool کجان؟

معمولا توی یکی از این مسیرها:

/etc/php/8.1/fpm/pool.d/    اوبونتو/دبیان
/etc/php-fpm.d/         CentOS/RHEL

هر Pool یه فایل با پسوند .conf توی این پوشست فایل پیش فرض معمولا www.conf نام داره


یه Pool جدید بسازیم

فرض کن میخوای برای یه سایت به اسم mysite یه Pool جداگونه بسازی:

ساخت فایل Pool

فایل /etc/php/8.1/fpm/pool.d/mysite.conf رو بساز:

[mysite]
user = mysite_user
group = mysite_group

listen = /run/php/php8.1-fpm-mysite.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

pm = dynamic
pm.max_children = 20
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 6
pm.max_requests = 500

php_admin_value[upload_max_filesize] = 50M
php_admin_value[post_max_size] = 50M
php_admin_value[memory_limit] = 256M

ریستارت PHP-FPM

sudo systemctl restart php8.1-fpm
توی Nginx اشاره کن به Socket جدید
location ~ \.php$ {
  fastcgi_pass unix:/run/php/php8.1-fpm-mysite.sock;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  include fastcgi_params;
}


تنظیمات مهم Pool

user و group

کاربر و گروه لینوکسی که پروسه های PHP باهاش اجرا میشن هر Pool رو با یه کاربر جداگانه اجرا کن امن تره

listen

پروسه‌های PHP از کجا درخواست گوش میدن:

listen = /run/php/php8.1-fpm-mysite.sock (Socket یونیکس - سریع تر و امن تر)
listen = 127.0.0.1:9001 (پورت TCP - برای سرورهای جدا)

pm (Process Manager)

نحوه مدیریت پروسه ها:

static: تعداد پروسه ها ثابته مثلا همیشه ۲۰ تا

dynamic: تعداد پروسه ها بر اساس ترافیک کم و زیاد میشه

ondemand: پروسه ها فقط وقتی درخواست بیاد ساخته میشن و بعد از بیکاری میمیرن برای سایت های کم بازدید خوبه

pm.max_children

حداکثر تعداد پروسه های هم زمان مهم ترین عدد اگه پر بشه درخواست های اضافی صف میافتن یا خطا میدن

فرمول حدودی برای محاسبه:

max_children = (رم کل سرور - رم مصرفی بقیه سرویس ها) ÷ رم مصرفی هر پروسه PHP

مثلا اگه سرور ۴ گیگ رم داره ۱ گیگ برای MySQL و Nginx هست و هر پروسه PHP حدود ۵۰ مگ میخوره:

max_children = 3000 ÷ 50 = 60

pm.start_servers

وقتی PHP-FPM راه میافته چندتا پروسه اولیه بسازه

pm.min_spare_servers

حداقل پروسه بیکار آماده به کار زیر این عدد پروسه جدید میسازه

pm.max_spare_servers

حداکثر پروسه بیکار بالای این عدد پروسه های اضافه رو میکشه

pm.max_requests

بعد از پردازش چند درخواست پروسه کلا ریستا


تنظیمات PHP مخصوص هر Pool

با php_admin_value و php_admin_flag میتونی تنظیمات PHP رو فقط برای این Pool تغییر بدی:

php_admin_value[memory_limit] = 256M
php_admin_value[upload_max_filesize] = 100M
php_admin_value[post_max_size] = 100M
php_admin_value[max_execution_time] = 300
php_admin_value[max_input_time] = 300
php_admin_flag[display_errors] = off
php_admin_value[error_log] = /var/log/mysite-php-error.log


چک کردن وضعیت Pool

ببین چندتا Pool فعاله:


ls /etc/php/8.1/fpm/pool.d/

وضعیت پروسه های هر Pool:


sudo systemctl status php8.1-fpm
ps aux | grep php-fpm

فعال کردن Status Page برای یه Pool:


pm.status_path = /status

بعد توی Nginx مسیر /status رو به این Socket وصل کن

 amir

amir

برنامه نویس python, php طراح سایت