یک وب‌سرور با TLS و هدرهای درست هنوز می‌تواند زیر بار نامتناسب از دسترس خارج شود. امشب زمان‌ها، اندازهٔ درخواست و ظرفیت کارگر را با رفتار برنامه هماهنگ می‌کنیم.

این جلسه بخشی از دورهٔ آپاچی در ۵۰ شب است. قرارداد نام‌ها، مسیرها و روش اعمال تغییر را در راهنمای دوره بخوان.

محیط: VM lab با منابع ثبت‌شده؛ ماژول reqtimeout حاضر؛ آزمون‌ها با تعداد محدود درخواست روی lab انجام می‌شوند.

زمان خواندن درخواست#

در global config:

Timeout 30
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 2
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500

KeepAlive اتصال قابل استفادهٔ دوباره را نگه می‌دارد. RequestReadTimeout برای خواندن header/body از کلاینت است؛ با timeout پاسخ backend و heartbeat WebSocket یکسان نیست. از config بسته شروع کن و تفاوت‌ها را ثبت کن؛ برخی توزیع‌ها همین policy را از قبل دارند.

برای event در lab می‌توان از مجموعهٔ سازگار زیر شروع کرد:

ServerLimit 4
ThreadsPerChild 25
MaxRequestWorkers 100
MaxConnectionsPerChild 1000

این اعداد نسخهٔ پیشنهادی عمومی برای production نیستند. MaxRequestWorkers حد هم‌زمانی کارگرهاست؛ ظرفیت PHP-FPM و دیتابیس می‌تواند خیلی کمتر باشد. تغییر ServerLimit به restart کامل نیاز دارد. حافظه، صف و صدک زمان پاسخ را قبل و بعد اندازه بگیر.

اندازهٔ body و upload#

در سایت ثابت LimitRequestBody 1048576 یعنی حداکثر یک MiB؛ در سایت WordPress مقدار را با نیاز upload و post_max_size و upload_max_filesize PHP هماهنگ کن. اگر Apache اجازهٔ 16 MiB و PHP upload حداکثر 8 MiB دارد، سربار multipart نیز باید جا داشته باشد. از مقدار نامحدود بدون نیاز استفاده نکن.

یک endpoint آزمایشی مجاز برای POST بساز؛ درخواست کوچک و کمی بزرگ‌تر از حد به آن بفرست. انتظار رد شدن مورد بزرگ در لایهٔ مربوط است؛ کد 413 Apache را از خطای محدودیت PHP و احراز هویت WordPress جدا کن. فایل endpoint را بعداً حذف کن.

تمرین و بازگشت: با بار کوچک، لاگ رسیدن FPM به max_children و زمان انتظار Apache را ببین؛ افزایش هم‌زمان همهٔ limitها تشخیص را دشوار می‌کند. فایل global و pool را از backup بازیابی و restart لازم را انجام بده. این کنترل‌ها تضمین مقاومت در برابر DDoS حجمی نیستند؛ ظرفیت شبکه و ورودی بالادست نیز تعیین‌کننده‌اند.

منبع: mod_reqtimeout ، پارامترهای ظرفیت MPM ، LimitRequestBody .