برای محدود کردن تعداد درخواستهای HTTP که مشتری میتواند در یک بازه زمانی معین انجام دهد از روش های محدود کردن تعداد درخواست اتصالات در NGINX استفاده میشود.
محدودیتها بر حسب درخواست در ثانیه (یا RPS) محاسبه میشوند. نمونه ای از یک درخواست، درخواست GET برای صفحه ورود به سیستم یک برنامه یا درخواست POST در فرم ورود به سیستم یا POST در نقطه پایانی API است.
در این آموزش نحوه محدود کردن تعداد درخواست اتصالات در NGINX را بررسی خواهیم کرد! تا پایان این مقاله برای محدود کردن یک تکنیک مدیریت ترافیک همراه ما باشید.
نحوه محدود کردن تعداد درخواست اتصالات در NGINX
برای محدود کردن تعداد درخواست با استفاده از دستورالعمل limit_req_zone شروع کنید. پارامترهای مورد نیاز کلیدی برای شناسایی کلاینتها، یک حافظه مشترک است که وضعیت کلید و تعداد دفعات دسترسی آن به URL محدود شده توسط درخواست و تعداد را ذخیره میکند.
دستورالعمل limit_req_zone در زمینه HTTP معتبر است.
limit_req_zone $binary_remote_addr zone=limitreqsbyaddr:20m rate=10r/s;
همچنین، با استفاده از دستورالعمل limit_req_status که در زمینههای HTTP، سرور و موقعیت مکانی معتبر است. کد وضعیت پاسخ را تنظیم کنید که به درخواستهای رد شده بازگردانده شود.
limit_req_status 429;
اکنون می توانید از دستورالعمل limint_conn برای فعال کردن محدودیت تعداد درخواست در زمینه های HTTP، سرور و مکان استفاده کنید.
limit_req zone=limitreqsbyaddr;
به عنوان مثال پیکربندی زیر محدود کردن نرخ درخواست به API برنامه وب را نشان میدهد. حجم حافظه مشترک 20 مگابایت و محدودیت 10 درخواست در ثانیه می باشد.
upstream api_service { server 127.0.0.1:9051; server 10.1.1.77:9052; } limit_req_zone $binary_remote_addr zone=limitreqsbyaddr:20m rate=10r/s; limit_req_status 429; server { listen 80; server_name testapp.admin.com; root /var/www/html/testapp.admin.com/build; index index.html; #include snippets/error_pages.conf; proxy_read_timeout 600; proxy_connect_timeout 600; proxy_send_timeout 600; location / { try_files $uri $uri/ /index.html =404 =403 =500; } location /api { limit_req zone=limitregsbyaddr; proxy_pass http://api_service; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
فایل پیکربندی خود را ذخیره کرده و ببندید. سپس با استفاده از دستور زیر بررسی کنید که آیا نحوه پیکربندی NGINX درست است:
$ sudo nginx -t
پس از آن، سرویس NGINX را مجددا بارگیری کرده و آخرین تغییرات را اعمال کنید:
$ sudo systemctl reload nginx
هنگامی که یک کلاینت به /api/ از محدودیت 10 درخواست در ثانیه فراتر رفت، NGINX خطای “429 Too many requests” را به کاربر نمایش می دهد.
همچنین حادثه را در گزارش خطا ثبت می کند.
2022/04/29 00:30:38 [error] 3145846#0: *131039 limiting requests, excess: 0.990 by zone "limitreqsbyaddr", client: 192.168.1.10, server: testapp.admin.com, request: "GET /api/v1/app/meta-data HTTP/1.1", host: "testapp.admin.com", referrer: "https://testapp.admin.com/"
گاهی اوقات بسته به ماهیت برنامه یا API شما، کلاینت باید درخواست های زیادی را به یکباره ارسال کند و سپس قبل از درخواست بیشتر، نرخ آن را برای مدتی کاهش دهد.
NGINX همچنین میتواند درخواست های اضافی را در یک صف بافر کرده و آن ها را به سرعت برای راحتی شما پردازش کند.
شما می توانید این رفتار را در محدود کردن تعداد با استفاده از پارامتر burst با دستور limit_req فعال کنید. برای فعال کردن صف بدون تاخیر، پارامتر nodelay را اضافه کنید.
limit_req zone=limitregsbyaddr burst=20 nodelay;
یک مشکل با محدودیت تعداد بر اساس IP مشتری وجود دارد، به خصوص برای کاربرانی که از همان شبکه به برنامه شما دسترسی دارند و با NAT کار می کنند.
در این صورت تمام درخواست های آنها از همان آدرس IP منشا می گیرد. در چنین سناریویی، می توانید از متغیرهای دیگری برای شناسایی کاربران مانند session cookie استفاده کنید.
امنیت اولین و مهم ترین مورد در بستر وب سایت شماست، که با خرید سرور مجازی و اختصاصی مخصوص شما در آذرسیس با کیفیت بالا به راحتی می توانید آن را تامین کنید.
نتیجه گیری
در این آموزش نحوه محدود کردن تعداد درخواست اتصالات در NGINX را بررسی کردیم. همچنین دلایل زیادی برای محدود کردن تعداد درخواستها به برنامههای کاربردی وب وجود دارد که یکی از آن ها امنیت است.
همانند محافظت در برابر درخواست های سریع سوءاستفاده کننده، امیدواریم این مقاله برای شما مفید بوده باشد. نظرات خود را از طریق فرم زیر با ما به اشتراک بگذارید.