Com limitar la taxa de connexions (sol·licituds) a NGINX


Al nostre darrer article que forma part de la nostra sèrie de gestió de trànsit NGINX, vam parlar de com limitar el nombre de connexions a NGINX. En aquesta guia, veurem com limitar la taxa de sol·licituds a NGINX.

La limitació de velocitat és una tècnica de gestió del trànsit que s'utilitza per restringir el nombre de sol·licituds HTTP que un client pot fer en un període de temps determinat; els límits de velocitat es calculen en Sol·licituds per segon (o RPS).

Un exemple de sol·licitud és una sol·licitud GET per a la pàgina d'inici de sessió d'una aplicació o una sol·licitud POST en un formulari d'inici de sessió o una POST en un punt final de l'API.

Hi ha moltes raons per limitar la taxa de sol·licituds a les vostres aplicacions web o serveis de l'API, una de les quals és la seguretat: protegir-vos de les sol·licituds ràpides abusives.

Limitació de la taxa de connexions a NGINX

Comenceu definint els paràmetres per a la limitació de velocitat mitjançant la directiva limit_req_zone. Els paràmetres necessaris són una clau per identificar els clients, una zona de memòria compartida que emmagatzemarà l'estat de la clau i la freqüència amb què ha accedit a un URL restringit a la sol·licitud i la taxa.

La directiva limit_req_zone és vàlida dins del context HTTP.

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

A més, establiu un codi d'estat de resposta que es retorni a les sol·licituds rebutjades, utilitzant la directiva limit_req_status que és vàlida dins dels contextos HTTP, servidor i ubicació.

limit_req_status 429;

Ara podeu utilitzar la directiva limint_conn per habilitar la limitació de la velocitat de sol·licitud als contextos HTTP, servidor i ubicació. Pren una zona de memòria com a paràmetre i altres paràmetres opcionals.

limit_req zone=limitreqsbyaddr;

L'exemple de configuració següent mostra la limitació de la taxa de sol·licitud a una API d'aplicació web. La mida de la memòria compartida és de 20 MB i el límit de velocitat de sol·licitud és de 10 sol·licituds per segon.

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";

       
   }
}

Deseu el fitxer de configuració i tanqueu-lo.

A continuació, comproveu si la sintaxi de configuració de NGINX és correcta amb l'ordre següent:

$ sudo nginx -t

Després d'això, torneu a carregar el servei NGINX i apliqueu els darrers canvis:

$ sudo systemctl reload nginx

Un cop superat el límit de velocitat de 10 sol·licituds per segon per un sol client que accedeix a /api/, NGINX retorna un error 429 Massa sol·licituds al client.

També registra l'incident al registre d'errors.

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/"

De vegades, depenent de la naturalesa de la vostra aplicació o API, un client haurà de fer moltes sol·licituds alhora i, a continuació, reduir la seva tarifa durant un període de temps abans de fer-ne més. NGINX també pot emmagatzemar qualsevol sol·licitud en excés en una cua i processar-les ràpidament.

Podeu activar aquest comportament en la limitació de velocitat utilitzant el paràmetre burst amb la directiva limit_req. Per habilitar la cua sense retard, afegiu el paràmetre nodelay.

limit_req zone=limitreqsbyaddr burst=20 nodelay;

Hi ha un problema amb la limitació de velocitat basada en la IP d'un client, especialment per als usuaris que accedeixen a la vostra aplicació des de la mateixa xarxa i operen darrere d'un NAT. En aquest cas, totes les seves peticions s'originaran des de la mateixa adreça IP. En aquest escenari, podeu utilitzar altres variables per identificar clients, com ara una galeta de sessió.

Per obtenir més informació sobre com limitar la taxa de sol·licituds, consulteu aquesta limitació de tarifa NGINX al lloc web de NGINX. A continuació, tractarem com limitar l'ús d'ample de banda a NGINX.