
PHP-FPM چیست؟ آموزش بهینهسازی تنظیمات PHP-FPM
در این مقاله میخوانید
PHP-FPM (FastCGI Process Manager) روشی برای مدیریت پردازشهای fastCGI است که بیشتر برای وبسایتهایی با ترافیک فراوان استفاده میشود. در این روش، صفحات PHP با انواع وب سرور مانند Apache و Nginx پیادهسازی و همین امر باعث میشود تا اسکریپتهای PHP با سرعت بیشتری از روشهای سنتی مبتنیبر CGI مثل SUPHP یا mod_php اجرا شوند.
مزیت اصلی روش PHP-FPM استفاده کمتر از منابع مانند RAM و CPU است. باتوجهبه اهمیت این موضوع، در این مطلب از بلاگ پارس پک قصد داریم تا درباره بهینهسازی تنظیمات PHP-FPM با شما صحبت کنیم و علاوهبر توضیح نکات موردنیاز در این زمینه، روش انجام این کار را به شما آموزش دهیم؛ پس تا پایان با ما همراه باشید.
FastCGI چیست و چرا باید از آن استفاده کرد؟
وب سرورها در ابتدا از CGI (Common Gateway Interface) بهعنوان روشی برای اجرای برنامهها بهمنظور ایجاد محتوای داینامیک وب استفاده میکردند. بااینحال، مشکل این بود که هریک از ریکوئستهای CGI باعث میشد که وب سرور بهنوعی پردازشی جدید را آغاز کند و طی آن، زمان اجرا را مقداردهی اولیه و اسکریپت را بارگذاری و درنهایت برنامه را برای تولید محتوا اجرا کند. این روند برای اسکریپتهای ساده عالی بود؛ اما وقتی پای اپلیکیشنهای پیچیده بهمیان میآمد، بار بسیار زیادی به وب سرور تحمیل یا منابع زیادی درگیر میکرد.
برای حل این مشکل، وب سرور آپاچی ماژول mod-php را معرفی کرد که با استفاده از آن، PHP در خودِ Apache اجرا میشد. اگرچه با این راهکار مشکل سربار Request هریک از فرایندها حل شد، مشکل اساسی دیگری همچنان پابرجا بود: این روش فقط میتوانست بهصورت Vertical مقیاسبندی شود و همین مسئله باعث میشد که فقط در سرورهای بزرگتر کاربردی باشد. علاوهبراین، احتمالاً مشکلات امنیتی و موضوعات زمان اجرا (Runtime) به مشکلات اضافه میشد.
درمقابل، FastCGI اپلیکیشن را به فرایندی جداگانه در خارج از وب سرور و حتی به یک یا چند سرور هدایت میکند و به اپلیکیشن اجازه میدهد تا بهصورت افقی (Horizontal) نیز مقیاس شود. بدینترتیب، مشکلاتی که از قبل وجود داشت و در بالا به آنها اشاره کردیم، با استفاده از FastCGI حل شد.
PHP-FPM چیست؟
هنگامیکه کاربر اینترنت Request خود را ازطریق مرورگر یا هر اپلیکیشن دیگری بهسمت سرور ارسال میکند، PHP مسئولیت برقراری اولین نقطه تماس را برعهده ندارد. درواقع، این وظیفه را سرورهای HTTP برعهده میگیرند که مهمترین آنها نیز وب سرور Apache و Nginx هستند. در گام بعدی، این وب سرورها باید تصمیم بگیرند که چگونه به PHP وصل شوند و نوع Request و دادهها و Headerها را به آن منتقل کنند. تصویر زیر میتواند به درک عمیقتر این مفهوم به شما کمک کند:
PHP-FPM چیست؟
در اپلیکیشنهای مدرن PHP، بخش Find File که در تصویر بالا نیز بهوضوح نشان داده شده است، در فایل index.php قرار گرفته و سرور برای واگذاری تمامی Requestها به آن پیکربندی شده است. بهطورخلاصه، زمانیکه Apache بهعنوان وب سرور غالب در پروژهها استفاده میشد، PHP ماژولی بود که درون سرور گنجانده میشد.
همانطورکه گفتیم، این مسئله سبب میشد که پس از دریافت هر Request، سرور فرایند جدیدی را شروع کند که بهطورخودکار شامل اجرای PHP نیز بود. این همان روش mod_php است که درباره محدودیتهای آن توضیحات لازم را ارائه دادیم و Nginx توانست با PHP-FPM این مشکل را حل کند؛ اگرچه باید به این نکته نیز توجه کرد که PHP-FPM با هر دو وب سرور Apache و Nginx کار میکند.
در PHP-FPM، فرایندهای مرتبط با برنامه PHP درون سرور است که مسئولیت مدیریت PHP را برعهده دارد. درواقع، وب سرور اهمیتی نمیدهد که PHP شما در کجا قرار دارد؛ بلکه تنها موضوع مهم این است که دیتاها چطور برای آن ارسال یا از آن دریافت میشود.
اجازه دهید تا موضوع را با وب سرور Nginx شروع کنیم و سپس بهسراغ وب سرور محبوب Apache برویم. اگر تنظیمات Nginx را بهدرستی انجام داده یا فقط به آن دسترسی داشته باشید (یعنی قبل از شما این تنظیمات بهدرستی انجام گرفته باشد)، باید با کدهایی مانند کدهای زیر مواجه شوید:
location ~ .php$ { try_files $uri =404; fastcgi_split_path_info ^(.+.php)(/.+)$; fastcgi_pass unix:/run/php/php7.2-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }
کدهای مشابه برای وب سرور آپاچی از قرار زیر است:
<VirtualHost *:80> ServerName example.com ServerAlias www.example.com DocumentRoot /var/www/html <Directory /var/www/html> Options -Indexes +FollowSymLinks +MultiViews AllowOverride All Require all granted </Directory> <FilesMatch \.php$> SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost/" </FilesMatch> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
به کدهای درجشده برای وب سرور Nginx بازگردید و کمی روی این خط کد متمرکز شوید:
astcgi_pass unix:/run/php/php7.2-fpm.sock;
این همان خطی است که تقریباً همه کارهای موردنیازمان را انجام میدهد؛ یعنی به Nginx میگوید که ازطریق سوکتی به نام php7.2-fpm.sock با فرایند PHP ارتباط برقرار کند. بنابراین، Nginx برای هریک از Requestهای دریافتشده، دادهها را ازطریق همین فایل مینویسد و با دریافت خروجی، آن را به مرورگر کاربر ارسال میکند.
اگرچه در پشتپرده انجام این فرایند ممکن است واقعاً پیچیده باشد، بهنظر میرسد که فعلاً تا همینجا کافی است. برای اینکه این مباحث بهخوبی در ذهنتان دستهبندی شود، اجازه دهید مطالب گفتهشده تا اینجای مقاله را خلاصه کنیم:
- PHP مستقیماً Requestهای ارسالی مرورگر کاربر را دریافت نمیکند؛ بلکه وب سرورهایی مانند Nginx هستند که در ابتدا این درخواستها را رهگیری میکنند.
- وب سرورها میدانند که چطور باید به فرایند PHP متصل شوند و تمامی دادههای Requestها را به PHP ارسال خواهند کرد.
- هنگامیکه PHP کار خود را بهپایان رساند، Response مناسب را به وب سرور ارسال میکند و درنهایت نیز این پاسخ به مرورگر کاربر یا اصولاً هر اپلیکیشنی که از آن استفاده میکند، برگردانده میشود. تصویر زیر میتواند این مفهوم را بهصورت تصویری توضیح دهد:
عملیات بهینهسازی PHP-FPM با وب سرور انجینایکس
آموزش بهینهسازی تنظیمات PHP-FPM
برای اینکه بتوانید تنظیمات PHP-FPM را بهینه کنید، مراحل زیر را بهترتیب انجام دهید:
۱. فایل php.ini متناسب با نسخه PHP نصبشده روی سرور را پیدا کنید.
۲. بعد از پیداکردن این فایل، مقادیر متغیرهای زیر را براساس نیاز خود افزایش دهید:
- post_max_size
- upload_max_filesize
- max_execution_time
- max_input_time
- memory_limit
۳. وب سرور خود را Restart کنید.
۴. با قراردادن فایل phpinfo.php، میتوانید مقادیر تنظیمشده را مشاهده کنید.
درصورتیکه از کنترل پنل cPanel برای مدیریت سرور خود استفاده میکنید، انجام این کار با استفاده از گزینه MultiPHP INI Editor بهراحتی امکانپذیر است. این گزینه در زیرشاخه Software قرار دارد و نحوه دسترسی به آن، در تصویر زیر نیز نشان داده شده است:
انتخاب گزینه MultiPHP INI Editor برای بهینهسازی تنظیمات PHP-FPM
اگر کنترل پنل نصبشده روی سرور دایرکت ادمین باشد، این موارد را باید بهصورت دستی و بهترتیبی که در ابتدای مطلب گفتیم، اصلاح کنید.
وب سرور چیست و چگونه کار میکند؟ انواع وب سرورها از نظر عملکرد چه تفاوتی باهم دارند؟ در مقاله زیر بخوانید.
جمعبندی
FastCGI پروتکلی باینری است که از آن برای ارتباط اپلیکیشنهای داینامیک با وب سرور استفاده میشود. برای پیادهسازی این پروتکل، روشهای متفاوتی وجود دارد که یکی از این روشهای بهروز و کارآمد PHP-FPM است و بهخصوص در وبسایتها و اپلیکیشنهایی با ترافیک فراوان استفاده میشود. برای استفاده بهتر و مؤثرتر از این روش، باید تنظیماتی را روی فایل PHP خود انجام دهید. در این مقاله از بلاگ پارس پک، نحوه اعمال این تنظیمات را بهطورکامل توضیح دادهایم.
سؤالات متداول
۱. FastCGI چیست؟
FastCGI پروتکلی است که براساس آن، اپلیکیشنها و وبسایتهای دارای محتوای پویا با وب سرور ارتباط برقرار میکنند.
۲. PHP-FPM چیست؟
PHP-FPM یکی از روشهایی است که با استفاده از آن، میتوان پروتکل FastCGI را پیادهسازی کرد. این روش بهعنوان جایگزینی برای روشهای سنتی قبلی مانند SUPHP یا php_mod شناخته میشود.
۳. PHP-FPM مخفف چیست؟
FPM مخفف عبارت FastCGI Process Manager است.
۴. چطور میتوان PHP-FPM را بهینهسازی کرد؟
برای این منظور، باید تغییراتی در برخی از متغیرهای فایل php.ini خود ایجاد کنید.