اگر سایت پی اچ پی شما در ساعت های شلوغ خطای ۵۰۲ میدهد یا با وجود منابع کافی کند است، احتمال زیادی هست که مشکل از تنظیمات PHP-FPM باشد. مقادیر پیشفرض برای اینکه روی کوچکترین سرورها هم بالا بیایند انتخاب شده اند و تقریبا هیچوقت برای بار واقعی مناسب نیستند.
PHP-FPM چطور کار میکند
وب سرور خودش کد پی اچ پی را اجرا نمیکند؛ درخواست را به PHP-FPM میدهد و آن مجموعه ای از پردازش های آماده دارد که هر کدام یک درخواست را همزمان پردازش میکنند.
نتیجه مهم این ساختار: تعداد این پردازش ها سقف درخواست های همزمان شماست. اگر همه مشغول باشند، درخواست بعدی در صف میماند و اگر صف پر شود، خطای ۵۰۲ یا ۵۰۳ برمیگردد.
محاسبه تعداد پردازش بر اساس حافظه
این مهمترین عدد است و باید محاسبه شود نه حدس زده. اول ببینید هر پردازش پی اچ پی روی سایت شما به طور میانگین چقدر حافظه مصرف میکند.
سپس حافظه ای که میتوانید به پی اچ پی اختصاص دهید را بر این عدد تقسیم کنید. توجه کنید که باید برای پایگاه داده، وب سرور و خود سیستم عامل هم حافظه کنار بگذارید.
ps -ylC php-fpm8.3 --sort:rss | awk '{sum+=$8; n++} END {print sum/n/1024 " MB"}'free -mتنظیم استخر پردازش
فایل تنظیمات استخر پیشفرض را باز کنید و مقادیر را بر اساس محاسبه قبلی تنظیم کنید. مقادیر زیر برای سروری با حدود دو گیگ حافظه قابل اختصاص به پی اچ پی مناسب هستند.
گزینه max_requests را نادیده نگیرید. این مقدار باعث میشود هر پردازش بعد از تعداد مشخصی درخواست بازسازی شود و اگر افزونه ای نشت حافظه داشته باشد، اثر آن انباشته نشود.
sudo nano /etc/php/8.3/fpm/pool.d/www.confpm = dynamic
pm.max_children = 20
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 6
pm.max_requests = 500کدام حالت را انتخاب کنیم
سه حالت وجود دارد و انتخاب درست به منابع و الگوی ترافیک شما بستگی دارد.
- حالت dynamic برای بیشتر سایت ها مناسب است و تعادل خوبی بین سرعت و مصرف حافظه دارد.
- حالت ondemand برای سرورهای کم حافظه یا سایت های کم بازدید مناسب است.
- حالت static فقط وقتی منطقی است که حافظه فراوان و ترافیک پایدار و بالا دارید.
نشانه های تنظیم اشتباه
لاگ PHP-FPM دقیقا به شما میگوید که به سقف رسیده اید یا نه. اگر این پیام را دیدید، یعنی تعداد پردازش ها کم است؛ اما قبل از افزایش آن حتما حافظه در دسترس را بررسی کنید.
sudo grep -i "max_children" /var/log/php8.3-fpm.logفعال کردن opcache
این قابلیت کد کامپایل شده را در حافظه نگه میدارد تا در هر درخواست دوباره تفسیر نشود. تاثیر آن روی سایت های پی اچ پی معمولا چشمگیر است و فعال کردنش کار سختی نیست.
یک هشدار مهم: اگر مقدار validate_timestamps را صفر کنید، تغییرات فایل ها تا بارگذاری مجدد سرویس دیده نمیشوند. این تنظیم برای محیط تولید مناسب است اما در محیط توسعه گیج کننده خواهد بود.
opcache.enable=1
opcache.memory_consumption=192
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0sudo systemctl reload php8.3-fpm
sudo systemctl reload nginxپرسش های پرتکرار
مقدار مناسب pm.max_children چقدر است؟
این مقدار را از تقسیم حافظه قابل اختصاص بر میانگین مصرف هر پردازش به دست بیاورید. مثلا اگر دو گیگ برای پی اچ پی در نظر دارید و هر پردازش حدود صد مگابایت مصرف میکند، حدود بیست عدد مناسب است.
تفاوت حالت dynamic و ondemand چیست؟
در حالت dynamic تعدادی پردازش همیشه آماده نگه داشته میشود که پاسخ دهی را سریعتر میکند. در حالت ondemand پردازش ها فقط هنگام نیاز ساخته میشوند که حافظه کمتری مصرف میکند اما اولین درخواست کمی کندتر است.
چرا بعد از افزایش max_children سرور کندتر شد؟
چون مجموع حافظه مورد نیاز از حافظه فیزیکی بیشتر شده و سیستم وارد استفاده از swap شده است. این مقدار را همیشه بر اساس حافظه در دسترس محاسبه کنید نه بر اساس حدس.
به راهنمای بیشتری نیاز دارید؟
تیم پشتیبانی هایوهاست برای انتخاب و مدیریت سرویس کنار شماست.