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 وصل کن