بازگشت به مجله
وب سرورتیم فنی هایوهاست۱۰ دقیقه مطالعه

تنظیم PHP-FPM برای وردپرس و لاراول

مقدار پیشفرض max_children روی سرورهای کوچک باعث خطای ۵۰۲ و روی سرورهای بزرگ باعث هدر رفتن حافظه میشود.

تنظیم پردازش

اگر سایت پی اچ پی شما در ساعت های شلوغ خطای ۵۰۲ میدهد یا با وجود منابع کافی کند است، احتمال زیادی هست که مشکل از تنظیمات PHP-FPM باشد. مقادیر پیشفرض برای اینکه روی کوچکترین سرورها هم بالا بیایند انتخاب شده اند و تقریبا هیچوقت برای بار واقعی مناسب نیستند.

1

PHP-FPM چطور کار میکند

وب سرور خودش کد پی اچ پی را اجرا نمیکند؛ درخواست را به PHP-FPM میدهد و آن مجموعه ای از پردازش های آماده دارد که هر کدام یک درخواست را همزمان پردازش میکنند.

نتیجه مهم این ساختار: تعداد این پردازش ها سقف درخواست های همزمان شماست. اگر همه مشغول باشند، درخواست بعدی در صف میماند و اگر صف پر شود، خطای ۵۰۲ یا ۵۰۳ برمیگردد.

نمایش استخر پردازش های PHP-FPM و اینکه با پر شدن ظرفیت، درخواست بعدی با خطا روبرو میشود
تعداد پردازش ها سقف درخواست های همزمان شماست؛ فراتر از آن یعنی صف و خطا.
2

محاسبه تعداد پردازش بر اساس حافظه

این مهمترین عدد است و باید محاسبه شود نه حدس زده. اول ببینید هر پردازش پی اچ پی روی سایت شما به طور میانگین چقدر حافظه مصرف میکند.

سپس حافظه ای که میتوانید به پی اچ پی اختصاص دهید را بر این عدد تقسیم کنید. توجه کنید که باید برای پایگاه داده، وب سرور و خود سیستم عامل هم حافظه کنار بگذارید.

میانگین مصرف حافظه هر پردازش
ps -ylC php-fpm8.3 --sort:rss | awk '{sum+=$8; n++} END {print sum/n/1024 " MB"}'
حافظه کل و در دسترس
free -m
3

تنظیم استخر پردازش

فایل تنظیمات استخر پیشفرض را باز کنید و مقادیر را بر اساس محاسبه قبلی تنظیم کنید. مقادیر زیر برای سروری با حدود دو گیگ حافظه قابل اختصاص به پی اچ پی مناسب هستند.

گزینه max_requests را نادیده نگیرید. این مقدار باعث میشود هر پردازش بعد از تعداد مشخصی درخواست بازسازی شود و اگر افزونه ای نشت حافظه داشته باشد، اثر آن انباشته نشود.

باز کردن فایل استخر
sudo nano /etc/php/8.3/fpm/pool.d/www.conf
مقادیر پیشنهادی برای شروع
pm = dynamic
pm.max_children = 20
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 6
pm.max_requests = 500
4

کدام حالت را انتخاب کنیم

سه حالت وجود دارد و انتخاب درست به منابع و الگوی ترافیک شما بستگی دارد.

  • حالت dynamic برای بیشتر سایت ها مناسب است و تعادل خوبی بین سرعت و مصرف حافظه دارد.
  • حالت ondemand برای سرورهای کم حافظه یا سایت های کم بازدید مناسب است.
  • حالت static فقط وقتی منطقی است که حافظه فراوان و ترافیک پایدار و بالا دارید.
5

نشانه های تنظیم اشتباه

لاگ PHP-FPM دقیقا به شما میگوید که به سقف رسیده اید یا نه. اگر این پیام را دیدید، یعنی تعداد پردازش ها کم است؛ اما قبل از افزایش آن حتما حافظه در دسترس را بررسی کنید.

بررسی لاگ برای پیام رسیدن به سقف
sudo grep -i "max_children" /var/log/php8.3-fpm.log
6

فعال کردن opcache

این قابلیت کد کامپایل شده را در حافظه نگه میدارد تا در هر درخواست دوباره تفسیر نشود. تاثیر آن روی سایت های پی اچ پی معمولا چشمگیر است و فعال کردنش کار سختی نیست.

یک هشدار مهم: اگر مقدار validate_timestamps را صفر کنید، تغییرات فایل ها تا بارگذاری مجدد سرویس دیده نمیشوند. این تنظیم برای محیط تولید مناسب است اما در محیط توسعه گیج کننده خواهد بود.

تنظیم در فایل php.ini
opcache.enable=1
opcache.memory_consumption=192
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0
اعمال تغییرات
sudo systemctl reload php8.3-fpm
sudo systemctl reload nginx

پرسش های پرتکرار

مقدار مناسب pm.max_children چقدر است؟

این مقدار را از تقسیم حافظه قابل اختصاص بر میانگین مصرف هر پردازش به دست بیاورید. مثلا اگر دو گیگ برای پی اچ پی در نظر دارید و هر پردازش حدود صد مگابایت مصرف میکند، حدود بیست عدد مناسب است.

تفاوت حالت dynamic و ondemand چیست؟

در حالت dynamic تعدادی پردازش همیشه آماده نگه داشته میشود که پاسخ دهی را سریعتر میکند. در حالت ondemand پردازش ها فقط هنگام نیاز ساخته میشوند که حافظه کمتری مصرف میکند اما اولین درخواست کمی کندتر است.

چرا بعد از افزایش max_children سرور کندتر شد؟

چون مجموع حافظه مورد نیاز از حافظه فیزیکی بیشتر شده و سیستم وارد استفاده از swap شده است. این مقدار را همیشه بر اساس حافظه در دسترس محاسبه کنید نه بر اساس حدس.

به راهنمای بیشتری نیاز دارید؟

تیم پشتیبانی هایوهاست برای انتخاب و مدیریت سرویس کنار شماست.

گفتگو با پشتیبانی

ادامه یادگیری

مشاهده همه