آپاچی؛ شب ۴۴: محدودیت درخواست، اتصال کند و بودجهٔ منابع
فهرست نوشته
یک وبسرور با 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 .