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:

  1. ngx_http_limit_req_module: Limita la velocitat de sol·licituds per adreça IP.
  2. 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 anomenada mylimit 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 anomenada addr 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

  1. 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.
  2. 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

  1. Defineix una zona de memòria compartida anomenada conn_limit amb una mida de 5 MB.
  2. 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 i limit_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.

© Copyright 2024. Tots els drets reservats