جدول محتوایی
درخواست ها در Nginx
در این راهنما، نحوه محدود کردن نرخ درخواست ها در NGINX را بررسی خواهیم کرد.
محدود کردن نرخ درخواست در Nginx یک تکنیک مدیریت ترافیک است که برای محدود کردن تعداد درخواستهای HTTP که مشتری میتواند در یک دوره زمانی معین انجام دهد استفاده میشود – محدودیتهای نرخ بر حسب درخواست در ثانیه (یا RPS) محاسبه میشوند.
یک مثال از یک درخواست، درخواست GET برای صفحه ورود به سیستم یک برنامه یا درخواست POST در فرم ورود به سیستم یا POST در نقطه پایانی API است.
دلایل متعددی برای محدود کردن نرخ درخواست ها در برنامههای کاربردی وب یا سرویسهای API وجود دارد. مهمترین آنها امنیت است.
محدود کردن نرخ درخواست ها در 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.tecmint.com; root /var/www/html/testapp.tecmint.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.tecmint.com, request: "GET /api/v1/app/meta-data HTTP/1.1", host: "testapp.tecmint.com", referrer: "https://testapp.tecmint.com/"
خرید vps ایران
گاهی اوقات با توجه به ماهیت برنامه یا API شما، یک کلاینت باید درخواست های زیادی را به یکباره ارسال کند و سپس قبل از درخواست بیشتر، نرخ آن را برای مدتی کاهش دهد. NGINX همچنین میتواند درخواست های اضافی را در یک صف بافر کرده و آنها را به سرعت پردازش کند.
می توانید این رفتار را در محدود کردن نرخ با استفاده از پارامتر burst با دستور limit_req فعال کنید. برای فعال کردن صف بدون تاخیر، پارامتر nodelay را اضافه کنید.
limit_req zone=limitregsbyaddr burst=20 nodelay;
یک مشکل با محدودیت نرخ بر اساس IP مشتری وجود دارد، به خصوص برای کاربرانی که از همان شبکه به برنامه شما دسترسی دارند و پشت NAT کار می کنند. در این صورت تمام درخواست های آنها از همان آدرس IP منشا می گیرد. در چنین سناریویی، می توانید از متغیرهای دیگری برای شناسایی مشتریان مانند کوکی جلسه استفاده کنید.
برای اطلاعات بیشتر در مورد محدود کردن نرخ درخواست ها، محدودیت نرخ NGINX را در وب سایت NGINX بررسی کنید.
منون از پست خوبتون
عالی عالی ممنون
ممنون بابت مطالب خوبتون
مثل همیشه عالی و جذاب
تخفیف سرور مجازی هم موجود کنید باز
ببخشید میشه یکم بیشتر توضیحات بدید در مورد بخش دوم
ایرانیکاسرور همیشه عالی هستید