انجیناکس؛ شب ۲۱: محدودیت همزمانی، body و اتصال کند
فهرست نوشته
نرخ درخواست با تعداد درخواستهای همزمان یکی نیست. امشب اتصالهای فعال، اندازهٔ ورودی و زمان خواندن را جدا محدود میکنیم.
این جلسه بخشی از دورهٔ انجیناکس در ۵۰ شب است. قرارداد آزمایشگاه، مسیرها و روال اعمال تغییر در راهنمای دوره آمده است.
محیط: www، limit_conn موجود؛ آزمایش بار کوچک و کنترلشده روی lab، با فایل large.bin چند MiB.
همزمانی مستقل از نرخ#
در http:
limit_conn_zone $binary_remote_addr zone=connections:10m;
در server:
location = /large.bin {
limit_conn connections 2;
limit_conn_status 429;
limit_rate 16k;
try_files $uri =404;
}
client_header_timeout 10s;
client_body_timeout 15s;
send_timeout 15s;
client_max_body_size 1m;
keepalive_timeout 15s;
limit_conn پس از خواندن header و برای درخواست فعال حساب میکند؛ هر TCP بیکار را به همین شکل نمیشمارد. در HTTP/2 درخواستهای همزمان نیز جدا در محاسبه وارد میشوند. timeoutهای body و send معمولاً فاصلهٔ بیفعالیتیاند، نه الزاماً کل مدت عملیات.
آزمایش اتصال آهسته#
limit_rate در این endpoint سرعت ارسال پاسخ را هم محدود میکند تا Nginx فایل را سریع به بافر socket تحویل ندهد و درخواست پیش از آزمون سوم تمام نشود. این تنظیم فقط ابزار تمرین همزمانی است و با limit_req فرق دارد.
از یک کلاینت دو curl همزمان با --http1.1 --limit-rate 1k برای large.bin اجرا کن تا پاسخها باز بمانند. سومین درخواست همان مسیر باید 429 بگیرد. سپس یکی را متوقف و درخواست تازه را آزمایش کن. rate limit شب قبل فقط rate-lab.txt را محدود میکند و نباید نتیجهٔ این آزمون را مخلوط کند.
برای body، یک endpoint مجاز POST در بخش برنامهها انتخاب کن و payload کمتر و بیشتر از حد بفرست؛ پاسخ 413 Nginx را از محدودیت PHP و احراز هویت جدا کن. سایت ثابت که POST را نمیپذیرد شاهد مناسب آزمون body برنامه نیست.
ظرفیت میزبان#
worker_connections، محدودیت file descriptor و حافظه همگی سقف عملی دارند. ارتباط proxy میتواند هم اتصال کلاینت و هم upstream داشته باشد؛ تعداد worker ضربدر connections بهتنهایی ظرفیت واقعی سرویس نیست.
بازگشت: curlهای آزمون را متوقف، فایل بزرگ را حذف و limitها را از backup بازیابی کن. برای streaming، upload و WebSocket زمانهای اختصاصی لازماند؛ افزایش کور همهٔ timeoutها مشکل ظرفیت را درمان نمیکند.
منبع: limit_conn ، timeoutها و body .