Giunsa Limitahan ang Rate sa mga Koneksyon (Mga Pangayo) sa NGINX


Sa among katapusan nga artikulo nga bahin sa among serye sa pagdumala sa trapiko sa NGINX, among gihisgutan kung giunsa limitahan ang gidaghanon sa mga koneksyon sa NGINX. Sa kini nga giya, atong tan-awon kung giunsa limitahan ang rate sa mga hangyo sa NGINX.

Ang limiting sa rate usa ka pamaagi sa pagdumala sa trapiko nga gigamit aron higpitan ang gidaghanon sa HTTP nga mga hangyo nga mahimo sa usa ka kliyente sa usa ka gihatag nga yugto sa panahon - ang mga limitasyon sa rate gikalkulo sa Requests Per Second (o RPS).

Usa ka pananglitan sa usa ka hangyo mao ang usa ka GET nga hangyo alang sa log-in nga panid sa usa ka aplikasyon o usa ka POST nga hangyo sa usa ka log-in nga porma o usa ka POST sa usa ka API endpoint.

Adunay daghang mga hinungdan nga limitahan ang rate sa mga hangyo sa imong mga aplikasyon sa web o mga serbisyo sa API, ang usa mao ang seguridad: pagpanalipod batok sa abusado nga paspas nga mga hangyo.

Limitado ang Rate sa Koneksyon sa NGINX

Sugdi pinaagi sa pagpasabot sa mga parametro para sa rate-limiting gamit ang limit_req_zone nga direktiba. Ang gikinahanglan nga mga parametro kay yawe sa pag-ila sa mga kliyente, usa ka shared memory zone nga magtipig sa estado sa yawe ug kung unsa ka subsob kini naka-access sa usa ka request-restricted URL, ug ang rate.

Ang direktiba nga limit_req_zone balido sulod sa konteksto sa HTTP.

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

Usab, magbutang ug response status code nga ibalik sa gisalikway nga mga hangyo, gamit ang limit_req_status nga direktiba nga balido sulod sa HTTP, sever, ug lokasyon nga konteksto.

limit_req_status 429;

Karon mahimo nimong gamiton ang direktiba nga limint_conn aron mahimo ang paglimit sa rate sa hangyo sulod sa konteksto sa HTTP, sever, ug lokasyon. Nagkinahanglan kini og memory zone isip parameter ug uban pang opsyonal nga mga parameter.

limit_req zone=limitreqsbyaddr;

Ang mosunod nga panig-ingnan sa pag-configure nagpakita sa paglimit sa rate sa hangyo sa usa ka web application API. Ang gipaambit nga gidak-on sa memorya mao ang 20 MB ug ang limitasyon sa rate sa hangyo mao ang 10 nga mga hangyo matag segundo.

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

       
   }
}

I-save ang imong configuration file ug isira kini.

Unya susiha kon ang NGINX configuration syntax husto ba gamit ang mosunod nga sugo:

$ sudo nginx -t

Pagkahuman niana, i-reload ang serbisyo sa NGINX gamita ang labing bag-ong mga pagbag-o:

$ sudo systemctl reload nginx

Sa higayon nga ang limitasyon sa rate nga 10 ka hangyo kada segundo malapas na sa usa ka kliyente nga nag-access sa /api/, ang NGINX magbalik ug \429 Daghan kaayong mga hangyo nga sayop ngadto sa kliyente.

Gi-log usab niini ang insidente sa log sa sayup.

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

Usahay depende sa kinaiyahan sa imong aplikasyon o API, ang usa ka kliyente kinahanglan nga maghimo daghang mga hangyo sa usa ka higayon, ug dayon pakunhuran ang rate niini sulod sa usa ka yugto sa panahon sa dili pa maghimo dugang. Ang NGINX mahimo usab nga mag-buffer sa bisan unsang sobra nga mga hangyo sa usa ka pila ug maproseso kini dayon.

Mahimo nimong palihokon kini nga pamatasan sa rate-limiting gamit ang parameter nga burst nga adunay direktiba nga limit_req. Aron mahimo ang pagpila nga walay paglangan, idugang ang parameter nga nodelay.

limit_req zone=limitreqsbyaddr burst=20 nodelay;

Adunay usa ka snag nga adunay limitasyon sa rate base sa IP sa kliyente, labi na alang sa mga tiggamit nga nag-access sa imong aplikasyon gikan sa parehas nga network ug naglihok sa luyo sa usa ka NAT. Sa kini nga kaso, ang tanan nilang mga hangyo magagikan sa parehas nga IP address. Sa ingon nga senaryo, mahimo nimong gamiton ang ubang mga variable aron mailhan ang mga kliyente sama sa cookie sa sesyon.

Para sa dugang nga impormasyon sa paglimit sa rate sa mga hangyo, tan-awa kini nga NGINX rate limiting sa NGINX website. Sunod, tabonan namon kung giunsa limitahan ang paggamit sa bandwidth sa NGINX.