نرخ درخواست با تعداد درخواست‌های هم‌زمان یکی نیست. امشب اتصال‌های فعال، اندازهٔ ورودی و زمان خواندن را جدا محدود می‌کنیم.

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

محیط: 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 .