La limitació de velocitat (rate limiting) és una tècnica utilitzada per controlar la quantitat de sol·licituds que un servidor pot rebre en un període de temps determinat. Això és especialment útil per prevenir abusos, atacs de denegació de servei (DoS) i per assegurar que els recursos del servidor es distribueixin de manera equitativa entre tots els usuaris.
Conceptes clau
- Burst: El nombre màxim de sol·licituds que es poden gestionar en un curt període de temps abans que s'apliqui la limitació.
- Rate: La taxa de sol·licituds per segon que es permet.
- Zone: Una àrea de memòria compartida on es guarda l'estat de la limitació de velocitat.
Configuració bàsica de limitació de velocitat
NGINX proporciona dos mòduls principals per a la limitació de velocitat:
ngx_http_limit_req_module
: Limita la velocitat de sol·licituds per adreça IP.ngx_http_limit_conn_module
: Limita el nombre de connexions simultànies per adreça IP.
Limitació de sol·licituds (ngx_http_limit_req_module
)
Per configurar la limitació de sol·licituds, primer hem de definir una zona de memòria compartida on es guardarà l'estat de la limitació. Després, aplicarem aquesta limitació a una ubicació específica.
Exemple de configuració
http { # Definim una zona de memòria compartida anomenada 'mylimit' amb una mida de 10 MB limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s; server { listen 80; server_name example.com; location / { # Aplicar la limitació de sol·licituds limit_req zone=mylimit burst=5 nodelay; proxy_pass http://backend; } } }
Explicació del codi
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
: Defineix una zona de memòria compartida anomenadamylimit
amb una mida de 10 MB. La taxa de sol·licituds es limita a 1 sol·licitud per segon per adreça IP.limit_req zone=mylimit burst=5 nodelay;
: Aplica la limitació de sol·licituds a la ubicació/
. Permet un màxim de 5 sol·licituds en un curt període de temps (burst) abans d'aplicar la limitació. L'opciónodelay
fa que les sol·licituds excedents siguin rebutjades immediatament en lloc de ser posades en cua.
Limitació de connexions (ngx_http_limit_conn_module
)
Aquest mòdul limita el nombre de connexions simultànies per adreça IP.
Exemple de configuració
http { # Definim una zona de memòria compartida anomenada 'addr' amb una mida de 10 MB limit_conn_zone $binary_remote_addr zone=addr:10m; server { listen 80; server_name example.com; location / { # Aplicar la limitació de connexions limit_conn addr 10; proxy_pass http://backend; } } }
Explicació del codi
limit_conn_zone $binary_remote_addr zone=addr:10m;
: Defineix una zona de memòria compartida anomenadaaddr
amb una mida de 10 MB.limit_conn addr 10;
: Aplica la limitació de connexions a la ubicació/
. Permet un màxim de 10 connexions simultànies per adreça IP.
Exercicis pràctics
Exercici 1: Configurar la limitació de sol·licituds
- Defineix una zona de memòria compartida anomenada
req_limit
amb una mida de 5 MB i una taxa de 2 sol·licituds per segon. - Aplica aquesta limitació a la ubicació
/api
amb un burst de 10 sol·licituds.
Solució
http { limit_req_zone $binary_remote_addr zone=req_limit:5m rate=2r/s; server { listen 80; server_name example.com; location /api { limit_req zone=req_limit burst=10 nodelay; proxy_pass http://backend; } } }
Exercici 2: Configurar la limitació de connexions
- Defineix una zona de memòria compartida anomenada
conn_limit
amb una mida de 5 MB. - Aplica aquesta limitació a la ubicació
/download
amb un màxim de 20 connexions simultànies.
Solució
http { limit_conn_zone $binary_remote_addr zone=conn_limit:5m; server { listen 80; server_name example.com; location /download { limit_conn conn_limit 20; proxy_pass http://backend; } } }
Errors comuns i consells
- Error: "limiting requests, excess: 0.000 by zone": Això indica que la limitació de sol·licituds s'està aplicant correctament. Si veus aquest missatge massa sovint, potser necessites ajustar la taxa o el burst.
- Consell: Utilitza
limit_req_log_level
ilimit_conn_log_level
per ajustar el nivell de registre dels esdeveniments de limitació, facilitant la depuració.
Conclusió
La limitació de velocitat és una eina poderosa per protegir el teu servidor NGINX contra abusos i assegurar una distribució equitativa dels recursos. Amb els mòduls ngx_http_limit_req_module
i ngx_http_limit_conn_module
, pots configurar fàcilment la limitació de sol·licituds i connexions per adreça IP. Practica amb els exemples i exercicis proporcionats per dominar aquesta tècnica essencial.
Curs de NGINX
Mòdul 1: Introducció a NGINX
Mòdul 2: NGINX com a servidor web
- Servint contingut estàtic
- Llistats de directoris
- Pàgines d'error personalitzades
- Registre i formats de registre