Kif tillimita r-Rata ta' Konnessjonijiet (Talbiet) f'NGINX


Fl-aħħar artiklu tagħna li huwa parti mis-serje tagħna ta 'ġestjoni tat-traffiku NGINX, iddiskutejna kif nillimitaw in-numru ta' konnessjonijiet f'NGINX. F'din il-gwida, se nħarsu lejn kif nillimitaw ir-rata ta 'talbiet f'NGINX.

Il-limitazzjoni tar-rata hija teknika ta’ ġestjoni tat-traffiku użata biex tirrestrinġi n-numru ta’ talbiet HTTP li klijent jista’ jagħmel f’perjodu ta’ żmien partikolari – il-limiti tar-rata huma kkalkulati f’Talbiet Per Sekondi (jew RPS).

Eżempju ta' talba huwa talba GET għall-paġna ta' login ta' applikazzjoni jew talba POST fuq formola ta' login jew POST fuq endpoint tal-API.

Hemm ħafna raġunijiet biex tiġi limitata r-rata ta' talbiet għall-applikazzjonijiet tal-web jew is-servizzi tal-API tiegħek, waħda hija s-sigurtà: il-protezzjoni minn talbiet rapidi abbużivi.

Limitazzjoni tar-Rata ta' Konnessjonijiet f'NGINX

Ibda billi tiddefinixxi l-parametri għal-limitazzjoni tar-rata billi tuża d-direttiva limit_req_zone. Il-parametri meħtieġa huma ċavetta għall-identifikazzjoni tal-klijenti, żona ta 'memorja kondiviża li se taħżen l-istat taċ-ċavetta u kemm-il darba tkun aċċessat URL ristrett għal talba, u r-rata.

Id-direttiva limit_req_zone hija valida fil-kuntest HTTP.

limit_req_zone $binary_remote_addr zone=limitreqsbyaddr:20m rate=10r/s;

Ukoll, issettja kodiċi tal-istatus tar-rispons li jiġi rritornat għal talbiet miċħuda, billi tuża d-direttiva limit_req_status li hija valida fil-kuntesti HTTP, sever u post.

limit_req_status 429;

Issa tista' tuża d-direttiva limint_conn biex tippermetti l-limitazzjoni tar-rata tat-talba fil-kuntesti HTTP, sever u post. Huwa jieħu żona tal-memorja bħala parametru u parametri oħra fakultattivi.

limit_req zone=limitreqsbyaddr;

L-eżempju ta' konfigurazzjoni li ġej juri li r-rata ta' talba tiġi limitata għal API ta' applikazzjoni tal-web. Id-daqs tal-memorja kondiviża huwa 20 MB u l-limitu tar-rata tat-talba huwa 10 talbiet kull sekonda.

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.linux-console.net;
    root /var/www/html/testapp.linux-console.net/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=limitreqsbyaddr;
        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";

       
   }
}

Issejvja l-fajl tal-konfigurazzjoni tiegħek u agħlaq.

Imbagħad iċċekkja jekk is-sintassi tal-konfigurazzjoni NGINX hijiex korretta billi tuża l-kmand li ġej:

$ sudo nginx -t

Wara dan, reload is-servizz NGINX applika l-aħħar bidliet:

$ sudo systemctl reload nginx

Ladarba l-limitu tar-rata ta' 10 talbiet kull sekonda jinqabeż minn klijent wieħed li jaċċessa /api/, NGINX jirritorna żball \429 Wisq talbiet” lill-klijent.

Jirreġistra wkoll l-inċident fil-ġurnal tal-iżbalji.

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.linux-console.net, request: "GET /api/v1/app/meta-data HTTP/1.1", host: "testapp.linux-console.net", referrer: "https://testapp.linux-console.net/"

Xi drabi skont in-natura tal-applikazzjoni jew tal-API tiegħek, klijent ikollu jagħmel ħafna talbiet kollha f'daqqa, u mbagħad inaqqas ir-rata tiegħu għal perjodu ta 'żmien qabel ma jagħmel aktar. NGINX jista 'wkoll ibaffera kwalunkwe talba żejda fi kju u jipproċessahom fil-pront.

Tista' tattiva din l-imġieba fil-limitazzjoni tar-rata billi tuża l-parametru burst bid-direttiva limit_req. Biex tippermetti l-kju mingħajr dewmien, żid il-parametru nodelay.

limit_req zone=limitreqsbyaddr burst=20 nodelay;

Hemm tfixkil bil-limitazzjoni tar-rata bbażata fuq l-IP tal-klijent, partikolarment għall-utenti li jaċċessaw l-applikazzjoni tiegħek mill-istess netwerk u joperaw wara NAT. F'dan il-każ, it-talbiet kollha tagħhom joriġinaw mill-istess indirizz IP. F'xenarju bħal dan, tista' tuża varjabbli oħra biex tidentifika klijenti bħal cookie tas-sessjoni.

Għal aktar informazzjoni dwar il-limitazzjoni tar-rata tat-talbiet, iċċekkja din il-limitazzjoni tar-rata NGINX fuq il-websajt NGINX. Sussegwentement, għandna nkopru kif nillimitaw l-użu tal-bandwidth f'NGINX.