Fără o limitare strictă a ratei de cereri, endpoint-urile critice ale aplicațiilor tale (cum ar fi rutele de autentificare `/api/login` sau căutarea în baza de date) pot fi doborâte cu ușurință de scripturi malițioase sau atacuri de tip brute-force.
Nginx implementează un sistem de Rate Limiting de înaltă performanță bazat pe algoritmul Leaky Bucket. În contextul `http`, se definește o zonă de memorie partajată prin directiva limit_req_zone (care stochează stările IP-urilor cu un consum minim de RAM).
În blocul de `location`, directiva limit_req impune limita dorită (de exemplu maxim 5 cereri pe secundă). Parametrul opțional burst permite mici vârfuri temporare de trafic legitim fără a bloca utilizatorul, în timp ce nodelay procesează cererile conforme imediat, returnând eroarea HTTP 429 sau 503 doar celor care abuzează.
Sintaxă, opțiuni și concepte cheie
| Opțiune / Concept | Descriere practică |
|---|---|
limit_req_zone $binary_remote_addr zone=nume:10m rate=10r/s |
Definește zona de memorie de 10MB indexată după IP-ul binar. |
limit_req zone=nume burst=5 nodelay |
Aplică limita în locație cu o toleranță de 5 cereri în buffer. |
limit_req_status 429 |
Instruiește Nginx să returneze codul standard ‘429 Too Many Requests’ în loc de 503. |
$binary_remote_addr |
Reprezentarea binară compactă a adresei IP (ocupă doar 4 octeți pentru IPv4 și 16 octeți pentru IPv6). |
Exemple practice și cod
Exemplul 1: Protejarea rutei de autentificare /login împotriva atacurilor de brute-force
Configurația completă pentru limitare strictă pe login.
# În /etc/nginx/nginx.conf (blocul http):
limit_req_zone $binary_remote_addr zone=protectie_login:10m rate=2r/s;
limit_req_status 429;
# În fișierul de site (blocul server):
server {
listen 443 ssl;
server_name dexblog.ro;
# Rută de login strict protejată (maxim 2 cereri/s cu burst de 4):
location /wp-login.php {
limit_req zone=protectie_login burst=4 nodelay;
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
}
Rezultat & Impact
Blocare instantanee a oricărui atac automat de dicționar pe formularul de autentificare.
Greșeli frecvente și bune practici
- Folosirea variabilei `$remote_addr` în loc de `$binary_remote_addr` în definirea zonei, ceea ce irosește de 4 ori mai multă memorie RAM.
- Omiterea parametrului `nodelay` la setarea unui burst mare, ceea ce face ca Nginx să introducă întârzieri artificiale frustrante pentru utilizatorii legitimi.