Ce face limit_req
Limitarea ratei de cereri în Nginx se configurează în doi pași: întâi definești în contextul http zona de memorie și rata permisă cu limit_req_zone, apoi aplici limita cu limit_req doar în blocurile location sau server pe care vrei să le protejezi (de exemplu /login, /wp-login.php sau /api/).
Algoritmul folosit este leaky bucket (găleata care picură la ritm constant): o rată de 10r/s nu înseamnă doar „10 cereri într-o secundă”, ci „o cerere la fiecare 100 ms”. Dacă un browser deschide o pagină și trimite 5 cereri în același milisecund, fără parametrul burst 4 dintre ele ar fi respinse imediat!
De aceea, în practică se folosește aproape întotdeauna burst=N nodelay: permite un vârf scurt de N cereri simultane și le procesează pe loc (nodelay), dar nu permite ca media pe termen lung să depășească rate. Când limita este depășită, Nginx returnează implicit codul 503, pe care este recomandat să îl schimbi în 429 Too Many Requests cu limit_req_status 429;.
Opțiuni și argumente
| Opțiune / Parametru | Descriere |
|---|---|
$binary_remote_addr |
Cheia recomandată în limit_req_zone: ocupă doar 4 octeți pentru IPv4 (sau 16 pentru IPv6); într-o zonă de 10m încap ~160.000 de adrese IP. |
zone=nume:dimensiune |
Numele zonei de memorie partajate și mărimea ei (de exemplu zone=login:10m). |
rate=Nr/s sau Nr/m |
Rata medie permisă pentru fiecare cheie: cereri pe secundă (10r/s) sau pe minut (5r/m). |
burst=N |
Câte cereri peste rată pot sosi simultan fără a fi respinse. |
nodelay |
Procesează cererile din burst imediat, fără a le ține în așteptare. |
limit_req_status cod |
Codul HTTP returnat la depășirea limitei (implicit 503; recomandat 429). |
Exemple
Exemplul 1: Protejarea paginii de autentificare împotriva încercărilor brute-force
Permite cel mult 5 încercări pe minut de pe același IP, cu un vârf de 3 cereri:
# În contextul http (/etc/nginx/nginx.conf):
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=5r/m;
# În contextul server:
location = /login {
limit_req zone=login_limit burst=3 nodelay;
limit_req_status 429;
include proxy_params;
proxy_pass http://127.0.0.1:3000;
}
Exemplul 2: Limită generală pentru un API
20 de cereri pe secundă pe IP, cu un burst de 40 pentru încărcarea inițială a interfeței:
# În http:
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=20r/s;
# În server:
location /api/ {
limit_req zone=api_limit burst=40 nodelay;
limit_req_status 429;
include proxy_params;
proxy_pass http://127.0.0.1:8080;
}
Greșeli frecvente
- Folosirea
limit_req zone=...fărăburstpe pagini HTML normale: un utilizator care dă două click-uri rapide în mai puțin de 100 ms primește eroare. - Folosirea
$remote_addr(text) în loc de$binary_remote_addr: forma text ocupă de 2–3 ori mai multă memorie în zona partajată. - Dacă site-ul este în spatele unui proxy sau CDN (Cloudflare) și nu ai configurat
real_ip_header, toate cererile au același$binary_remote_addr(IP-ul proxy-ului) și își împart aceeași limită!
Comenzi înrudite
allow / deny / auth_basic: Restricționează accesul la o zonă după adresa IP (allow/deny) sau cu utilizator și parolă HTTP Basic (auth_basic).proxy_set_header: Setează sau modifică antetele HTTP trimise către backend (Host, X-Real-IP, X-Forwarded-For, X-Forwarded-Proto).access_log / error_log: Configurează jurnalele de acces și de erori (fișiere separate pe site, niveluri de severitate, dezactivare pe rute).