![Divu faktoru autentifikācija Apple ID](/f/027d16b9520fd8d31271ed1324463a58.jpg?width=100&height=100)
Mūsu pēdējā rakstā, kas ir daļa no mūsu NGINX satiksmes pārvaldības sērijas, mēs apspriedām, kā ierobežot savienojumu skaits NGINX. Šajā rokasgrāmatā mēs apskatīsim, kā ierobežot pieprasījumu skaitu NGINX.
Likmes ierobežošana ir satiksmes pārvaldības paņēmiens, ko izmanto, lai ierobežotu skaitu HTTP pieprasījumi, ko klients var veikt noteiktā laika periodā – likmes limiti tiek aprēķināti Pieprasījumi sekundē (vai RPS).
Pieprasījuma piemērs ir a GŪT lietojumprogrammas pieteikšanās lapas pieprasījums vai a POSTĪT pieprasījums uz pieteikšanās veidlapas vai a POSTĪT uz an API galapunkts.
Ir daudz iemeslu, lai ierobežotu pieprasījumu skaitu jūsu tīmekļa lietojumprogrammām vai API pakalpojumiem, viens no tiem ir drošība: aizsardzība pret ļaunprātīgiem ātriem pieprasījumiem.
Sāciet ar ātruma ierobežošanas parametru definēšanu, izmantojot limit_req_zone
direktīva. Nepieciešamie parametri ir atslēga klientu identificēšanai, koplietotās atmiņas zona, kurā tiks saglabāts atslēgas stāvoklis un tas, cik bieži tā ir piekļuvusi pieprasījuma ierobežotam URL, kā arī ātrums.
The limit_req_zone
direktīva ir derīga HTTP kontekstā.
limit_req_zone $binary_remote_addr zone=limitreqsbyaddr: 20m rate=10r/s;
Tāpat iestatiet atbildes statusa kodu, kas tiek atgriezts noraidītajiem pieprasījumiem, izmantojot limit_req_status
direktīva, kas ir derīga HTTP, servera un atrašanās vietas kontekstā.
limit_req_status 429;
Tagad jūs varat izmantot limint_conn
direktīvu, lai iespējotu pieprasījuma ātruma ierobežošanu HTTP, servera un atrašanās vietas kontekstā. Tas aizņem atmiņas zonu kā parametru un citus izvēles parametrus.
limit_req zone=limitreqsbyaddr;
Šajā konfigurācijas piemērā ir parādīts pieprasījuma ātruma ierobežojums tīmekļa lietojumprogrammas API. Koplietojamās atmiņas apjoms ir 20 MB, un pieprasījuma ātruma ierobežojums ir 10 pieprasījumi sekundē.
upstream api_service { serveris 127.0.0.1:9051; serveris 10.1.1.77:9052; } limit_req_zone $binary_remote_addr zone=limitreqsbyaddr: 20m rate=10r/s;limit_req_status 429; serveris {klausies 80; servera_nosaukums testapp.tecmint.com; sakne /var/www/html/testapp.tecmint.com/build; indekss index.html; #include snippets/error_pages.conf; proxy_read_timeout 600; proxy_connect_timeout 600; proxy_send_timeout 600; atrašanās vieta / { try_files $uri $uri/ /index.html =404 =403 =500; } atrašanās vieta /api { limit_req zone=limitregsbyaddr;proxy_pass http://api_service; proxy_set_header X-Real-IP $ attālās_adrese; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; starpniekserveris_http_versija 1.1; proxy_set_header Jauninājums $http_upgrade; proxy_set_header Savienojuma "upgrade"; } }
Saglabājiet konfigurācijas failu un aizveriet to.
Pēc tam pārbaudiet, vai NGINX konfigurācijas sintakse ir pareiza, izmantojot šādu komandu:
$ sudo nginx -t.
Pēc tam atkārtoti ielādējiet NGINX pakalpojums piemēro jaunākās izmaiņas:
$ sudo systemctl pārlādēt nginx.
Kad likmes ierobežojums 10 pieprasījumu sekundē pārsniedz viens klients, kas piekļūst /api/
, NGINX atgriež “429 Pārāk daudz pieprasījumu” kļūdu klientam.
Tas arī reģistrē incidentu kļūdu žurnālā.
2022/04/29 00:30:38 [kļūda] 3145846#0: *131039 ierobežojošie pieprasījumi, pārsniegums: 0,990 pēc zonas "limitreqsbyaddr", klients: 192.168.1.10, serveris: testapp.tecmint.com, pieprasījums: "GET /api/v1/app/meta-data HTTP/1.1", resursdators: "testapp.tecmint.com", novirzītājs: " https://testapp.tecmint.com/"
Dažreiz atkarībā no jūsu lietojumprogrammas vai API veida klientam būs jāiesniedz vairāki pieprasījumi vienlaikus un pēc tam uz noteiktu laiku jāsamazina tā likme, pirms tiek veikti vairāki pieprasījumi. NGINX var arī buferizēt visus liekos pieprasījumus rindā un nekavējoties tos apstrādāt.
Varat iespējot šo darbību ātruma ierobežošanā, izmantojot pārsprāgt
parametrs ar limit_req
direktīva. Lai bez kavēšanās iespējotu rindu, pievienojiet mezgla aizkave
parametrs.
limit_req zone=limitregsbyaddr burst=20 nodelay;
Pastāv problēma ar ātruma ierobežošanu, pamatojoties uz klienta IP, jo īpaši lietotājiem, kuri piekļūst jūsu lietojumprogrammai no tā paša tīkla un darbojas aiz NAT. Šajā gadījumā visi viņu pieprasījumi būs no vienas IP adreses. Šādā gadījumā klientu identificēšanai varat izmantot citus mainīgos, piemēram, sesijas sīkfailu.
Lai iegūtu papildinformāciju par pieprasījumu skaita ierobežošanu, skatiet šo NGINX ātruma ierobežojums NGINX vietnē. Tālāk mēs apskatīsim, kā ierobežot joslas platuma lietojumu NGINX.