1. مستندات
  2. سرور اختصاصی
  3. کانفیگ وب‌سرور و PHP برای مدیریت ترافیک بالا در سرور اختصاصی

کانفیگ وب‌سرور و PHP برای مدیریت ترافیک بالا در سرور اختصاصی

Calendar

انتشار:

1404/12/20
Update Calendar

به روز رسانی:

1404/12/20

در این مقاله قصد داریم نحوه کانفیگ وب‌سرور و PHP را برای مدیریت ترافیک بالا در سرور اختصاصی بررسی کنیم. هدف این آموزش این است که مدیر سرور بداند چگونه لایه اجرای سایت را طوری تنظیم کند که در زمان شلوغی سایت دچار کندی یا خطا نشود.

کانفیگ وب‌سرور برای درخواست‌های هم‌زمان

وب‌سرور در سایت پرترافیک باید بتواند تعداد زیادی درخواست هم‌زمان را بدون ایجاد صف طولانی مدیریت کند. اگر این لایه درست تنظیم نشود حتی با وجود CPU و رم کافی سایت کند می‌شود یا کاربران خطای اتصال دریافت می‌کنند. در سرورهای لینوکسی معمولاً از Nginx یا Apache استفاده می‌شود که هرکدام مدل پردازش متفاوتی دارند و باید متناسب با سخت‌افزار تنظیم شوند.

در Nginx پردازش درخواست‌ها به‌صورت event-driven انجام می‌شود و یک پردازش می‌تواند تعداد زیادی اتصال را مدیریت کند. به همین دلیل مهم‌ترین تنظیمات مربوط به تعداد workerها و تعداد اتصال هم‌زمان هر worker است. تعداد worker_processes باید برابر با تعداد هسته‌های CPU تنظیم شود تا همه هسته‌ها درگیر پردازش شوند و فشار فقط روی یک هسته نباشد. اگر این مقدار کمتر باشد بخشی از توان پردازشی سرور بلااستفاده می‌ماند.

در فایل تنظیمات اصلی Nginx معمولاً این بخش بررسی می‌شود.

worker_processes auto;
events {
    worker_connections 4096;
}

گزینه auto باعث می‌شود Nginx به‌صورت خودکار تعداد هسته‌ها را تشخیص دهد. مقدار worker_connections مشخص می‌کند هر پردازش چند اتصال هم‌زمان را می‌تواند نگه دارد. در سایت پرترافیک اگر این عدد پایین باشد یا حتی اگر CPU و رم آزاد باشد کاربران در زمان شلوغی با خطای اتصال مواجه می‌شوند. مجموع اتصال‌های هم‌زمان تقریباً برابر است با حاصل‌ضرب تعداد workerها در worker_connections.

همچنین باید توجه داشت که keepalive connections اگر درست تنظیم نشود می‌تواند باعث اشغال طولانی اتصال‌ها شود. در سایت‌هایی که کاربران درخواست‌های کوتاه و زیاد دارند بهتر است keepalive_timeout منطقی تنظیم شود تا اتصال‌های بلااستفاده سریع‌تر آزاد شوند.

در Apache اگر از MPM prefork استفاده شود فشار زیادی به رم وارد می‌شود و برای سایت پرترافیک توصیه نمی‌شود. در سرورهای جدید بهتر است MPM event یا worker فعال باشد تا پردازش‌ها سبک‌تر و هم‌زمانی بهتر مدیریت شود. در این حالت تنظیم MaxRequestWorkers و ServerLimit اهمیت زیادی دارد. اگر این مقدارها کم باشند درخواست‌ها صف می‌شوند و اگر بیش از حد بالا باشند رم سرور تمام می‌شود.

نکته مهم این است که وب‌سرور نباید فایل‌های استاتیک را با PHP پردازش کند. فایل‌هایی مثل تصویر، CSS و JavaScript باید مستقیم توسط Nginx یا Apache سرو شوند تا PHP فقط روی پردازش منطق سایت تمرکز کند. این کار فشار PHP را در ترافیک بالا به‌شدت کاهش می‌دهد.

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

بهینه‌سازی PHP برای پردازش سریع‌تر

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

اولین قدم این است که مدیر سرور مطمئن شود نسخه درست PHP فعال است و فایل‌های تنظیمات به‌درستی بارگذاری می‌شوند. بررسی نسخه و مسیر فایل پیکربندی کمک می‌کند تغییرات در جای درست اعمال شوند.

php -v
php --ini
php -i | grep -E "Loaded Configuration File|memory_limit|max_execution_time|upload_max_filesize|post_max_size"

بعد از این بررسی باید محدودیت‌های اصلی PHP متناسب با نوع سایت تنظیم شوند. در سایت پرترافیک اگر memory_limit خیلی پایین باشد پردازش‌ها در زمان شلوغی قطع می‌شوند و خطای ۵۰۰ دیده می‌شود. اگر این مقدار بیش از حد بالا باشد هر پردازش PHP رم زیادی مصرف می‌کند و تعداد پردازش هم‌زمان کاهش پیدا می‌کند. مقدار منطقی معمولاً بین 128 تا 256 مگابایت است و بسته به نوع سایت تغییر می‌کند.

اطلاعات php سرور

اگر max_execution_time بیش از حد بالا باشد درخواست‌هایی که گیر می‌کنند مدت زیادی منابع را اشغال می‌کنند. در سایت پرترافیک بهتر است این مقدار محدود باشد تا درخواست‌های معیوب سریع‌تر قطع شوند. تنظیم ناهماهنگ upload_max_filesize و post_max_size باعث ناقص شدن آپلود فایل‌ها و خطا در فرم‌ها می‌شود که در زمان ترافیک بالا بیشتر دیده می‌شود.

در سرورهای Ubuntu و Debian مسیر رایج تنظیمات PHP 8.3 برای FPM معمولاً به شکل زیر است:

sudo nano /etc/php/8.3/fpm/php.ini

اگر PHP به صورت Apache Module نصب شده باشد در این حالت فایل تنظیمات این مسیر را دارد(با توجه به نسخه php خودتان):

sudo nano /etc/php/8.1/apache2/php.ini

در این فایل معمولاً این مقادیر بررسی و اصلاح می‌شوند.

memory_limit = 256M
max_execution_time = 60
max_input_time = 60
max_input_vars = 5000
post_max_size = 64M
upload_max_filesize = 64M

php.ini

بعد از تنظیم php.ini نوبت به تنظیم pool در PHP-FPM می‌رسد. این بخش تعیین می‌کند چند پردازش PHP به‌صورت هم‌زمان ساخته شود و هر پردازش چقدر از منابع استفاده کند. اگر pm.max_children کم باشد درخواست‌ها صف می‌شوند و سایت کند می‌شود. اگر این مقدار بیش از حد بالا باشد رم سرور به‌سرعت پر می‌شود و کل سرویس از کار می‌افتد.

مسیر فایل تنظیم pool معمولاً به شکل زیر است:

sudo nano /etc/php/8.3/fpm/pool.d/www.conf

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

pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20

برای انتخاب عددهای منطقی باید مصرف رم هر پردازش PHP را بررسی کنید. ساده‌ترین روش این است که در ساعات شلوغ یک نمونه از پردازش‌های PHP-FPM را ببینید و مقدار مصرف رم را بررسی کنید. سپس با تقسیم رم قابل استفاده سرور بر مصرف هر پردازش تعداد مناسب max_children مشخص می‌شود.

ps -ylC php-fpm8.3 --sort:rss | head

یکی از مهم‌ترین بهینه‌سازی‌ها در سایت پرترافیک فعال بودن OPcache است. OPcache باعث می‌شود کدهای PHP هر بار از ابتدا کامپایل نشوند و نسخه کامپایل‌شده در حافظه نگه‌داری شود. این کار فشار CPU را کم می‌کند و زمان پاسخ را به‌شدت کاهش می‌دهد.

در همان فایل php.ini بخش OPcache را فعال و تنظیم می‌کنید.

opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.validate_timestamps=1
opcache.revalidate_freq=2

در پایان باید سرویس PHP-FPM ریستارت شود تا تغییرات اعمال شوند و سپس لاگ‌ها بررسی شوند تا خطای جدیدی ایجاد نشده باشد.

sudo systemctl restart php8.3-fpm
sudo systemctl status php8.3-fpm --no-pager
sudo tail -n 100 /var/log/php8.3-fpm.log 2>/dev/null || true
sudo tail -n 100 /var/log/nginx/error.log 2>/dev/null || true

با اجرای صحیح این مرحله محدودیت‌ها متعادل می‌شوند و در زمان ترافیک سنگین نه صف‌های طولانی ایجاد می‌شود و نه رم سرور بی‌دلیل مصرف می‌شود. این بهینه‌سازی‌ها باعث پایداری سایت در ساعات شلوغ و کاهش خطاهای ناگهانی می‌شود.


در این مقاله نحوه تنظیم وب‌سرور و PHP برای مدیریت بهتر ترافیک بالا در سرور اختصاصی توضیح داده شد. با اجرای این تنظیمات لایه اجرای سایت پایدارتر می‌شود و سایت در زمان شلوغی سریع‌تر و بدون خطا پاسخ می‌دهد.

آیا توانستیم چالش شما را حل کنیم؟