Jak hodnotit limit v NGINX

Omezení rychlosti v NGINX je zásadní funkcí pro řízení objemu provozu, který váš server zpracovává. Pomáhá chránit váš server před zahlcením příliš mnoha požadavky v krátké době, které mohou způsobit škodlivé útoky, jako je DDoS nebo vysoké špičky provozu. Implementace omezení rychlosti zajišťuje, že vaše zdroje budou využívány efektivně a legitimní uživatelé budou mít přístup k vašim službám bez přerušení.

Tato příručka ukáže, jak nakonfigurovat omezení rychlosti v NGINX, a poskytne jasné pokyny, které vám pomohou efektivně řídit a řídit příchozí provoz.

Porozumění směrnicím o omezení rychlosti v NGINX

Klíčové směrnice NGINX omezující sazby

NGINX konfiguruje omezení rychlosti pomocí specifických direktiv, z nichž každá slouží jedinečné funkci:

  • limit_req_zone: Direktiva limit_req_zone v NGINX nastavuje zónu sdílené paměti pro ukládání informací omezujících rychlost. Umístěný v kontextu http určuje přípustnou míru požadavků a účinně nastavuje základní linii pro limity rychlosti.
  • limit_req: Direktiva limit_req, použitá v kontextu umístění, vynucuje rychlostní limit stanovený limit_req_zone. Tato omezení aplikuje na konkrétní umístění nebo adresy URL, čímž řídí frekvenci přístupu k těmto koncovým bodům.
  • limit_req_status: Direktiva limit_req_status umístěná v kontextu umístění určuje stavový kód HTTP vrácený, když rychlost požadavků překročí limit. Tento mechanismus zpětné vazby je zásadní pro informování uživatelů nebo automatizovaných systémů, když překročí povolenou frekvenci požadavků.

Vytvoření konfigurace omezení rychlosti

Chcete-li implementovat omezení rychlosti v NGINX, vložte příslušné direktivy do konfiguračního souboru NGINX. Zvažte tento základní příklad:

http {
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r/s;

    server {
        ...
        location / {
            limit_req zone=mylimit burst=10;
            ...
        }
    }
}

V této konfiguraci direktiva limit_req_zone zřizuje paměťovou zónu s názvem 'mylimit', povolující 5 požadavků za sekundu (5 r/s) z každé IP adresy klienta ($binary_remote_addr). Direktiva limit_req pak aplikuje tento limit rychlosti na kořenové umístění (/) s kapacitou shluku 10 požadavků, což nabízí rovnováhu mezi přísným omezením rychlosti a flexibilitou pro legitimní špičky provozu.

Limit sazby v NGINX: Praktické příklady

Konfigurace základního omezení rychlosti

Tato část prozkoumá základní konfiguraci omezující rychlost aplikovanou na celém serveru v NGINX. Cílem je omezit požadavky uživatelů na server, zajistit stabilní výkon a zmírnit riziko přetížení.

Příklad: Server-Wide Rate Limit

Zvažte následující konfiguraci NGINX:

http {
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;

    server {
        listen 80;
        server_name example.com;

        location / {
            limit_req zone=mylimit burst=5;
            proxy_pass http://backend;
        }
    }
}

Tato konfigurace nastavuje limit 2 požadavků za sekundu pro každého klienta, jak je definováno jeho IP adresou ($binary_remote_addr). Pojďme si rozebrat klíčové komponenty:

  • limit_req_zone: Definuje paměťovou zónu (mylimit) pro ukládání stavů omezení rychlosti o velikosti 10 megabajtů. Nastavuje limit rychlosti na 2 požadavky za sekundu (2 r/s).
  • blok serveru: Poslouchá na portu 80 příchozí provoz na example.com.
  • lokační blok: Použije omezení rychlosti na kořenovou adresu URL (/). Parametr burst umožňuje shluk až 5 požadavků, což poskytuje flexibilitu pro krátké špičky v provozu. Direktiva proxy_pass předá požadavek na zadaný backend server.
  • Parametr burst: Nastavení burst=5 v direktivě limit_req umožňuje krátkodobé zvýšení požadavků až o 5 dalších požadavků nad nastavenou rychlost. Tato funkce je zásadní pro zvládnutí náhlého, legitimního nárůstu provozu, aniž by to ovlivnilo uživatelský dojem.
  • Proxy Pass: Proxy_pass http://backend; direktiva předává provoz na backend server. To se běžně používá ve scénářích vyvažování zátěže nebo když NGINX funguje jako reverzní proxy.

Příklady pokročilého omezení rychlosti

Různé limity sazeb pro různé lokality

Ve složitějších scénářích možná budete muset použít různé limity pro různé části aplikace. To je zvláště užitečné, když jsou konkrétní koncové body náročnější na zdroje nebo náchylné ke zneužití.

Zvažte následující konfiguraci:

http {
    limit_req_zone $binary_remote_addr zone=low:10m rate=1r/s;
    limit_req_zone $binary_remote_addr zone=high:10m rate=10r/s;

    server {
        listen 80;
        server_name example.com;

        location /api/low {
            limit_req zone=low burst=3;
            proxy_pass http://backend;
        }

        location /api/high {
            limit_req zone=high burst=20;
            proxy_pass http://backend;
        }
    }
}

Tato konfigurace aplikuje nižší limit rychlosti (1 požadavek za sekundu) na umístění /api/low a vyšší limit rychlosti (10 požadavků za sekundu) na umístění /api/high.

Další příklady omezení rychlosti Nginx

Omezení sazby na základě typů požadavků

Omezení rychlosti můžete nakonfigurovat na základě konkrétních požadavků, jako jsou požadavky GET, POST nebo PUT. To je zvláště užitečné, když chcete chránit konkrétní koncové body, které jsou zranitelnější vůči zneužití nebo mají větší dopad na zdroje vašeho serveru.

Můžete použít direktivu if a proměnnou $request_method k použití omezení rychlosti na konkrétní typy požadavků. Zde je příklad:

http {
    limit_req_zone $binary_remote_addr zone=get_limit:10m rate=5r/s;
    limit_req_zone $binary_remote_addr zone=post_limit:10m rate=2r/s;

    server {
        listen 80;
        server_name example.com;

        location / {
            if ($request_method = GET) {
                limit_req zone=get_limit burst=10;
            }

            if ($request_method = POST) {
                limit_req zone=post_limit burst=5;
            }

            proxy_pass http://backend;
        }
    }
}

V této konfiguraci jsme nastavili dva samostatné limity rychlosti: jeden pro požadavky GET (5 požadavků za sekundu) a jeden pro požadavky POST (2 požadavky za sekundu).

Omezení sazby na základě User-Agent

Další užitečnou technikou je použití omezení rychlosti na základě hlavičky User-Agent zaslané klienty. To může pomoci chránit vaše služby před konkrétními roboty nebo prohledávači, kteří způsobují problémy.

Chcete-li implementovat omezení rychlosti na základě User-Agent, můžete použít direktivu map a proměnnou $http_user_agent.

Zde je příklad:

http {
    map $http_user_agent $limit_bots {
        default 0;
        ~*(Googlebot|Bingbot) 1;
    }

    limit_req_zone $binary_remote_addr zone=bot_limit:10m rate=1r/s;

    server {
        listen 80;
        server_name example.com;

        location / {
            if ($limit_bots) {
                limit_req zone=bot_limit burst=2;
            }

            proxy_pass http://backend;
        }
    }
}

V tomto příkladu jsme definovali direktivu map, která nastaví proměnnou $limit_bots na 1, pokud záhlaví User-Agent odpovídá „Googlebot“ nebo „Bingbot“. Na požadavky od těchto robotů pak použijeme limit 1 žádosti za sekundu.

Přidání IP adres na seznam povolených od Rate Limiting

Někdy můžete chtít vyjmout konkrétní IP adresy, jako jsou důvěryhodní partneři nebo interní služby, z omezení sazeb. Chcete-li toho dosáhnout, můžete použít direktivu geo spolu s if směrnice.

Zde je příklad:

http {
    geo $rate_limit {
        default 1;
        192.168.0.0/24 0;
        10.0.0.0/8 0;
    }

    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r/s;

    server {
        listen 80;
        server_name example.com;

        location / {
            if ($rate_limit) {
                limit_req zone=mylimit burst=10;
            }

            proxy_pass http://backend;
        }
    }
}

Omezení rychlosti škálování v distribuovaném prostředí

Když v distribuovaném prostředí běží více instancí Nginx, možná budete chtít zajistit, aby omezení rychlosti bylo konzistentní ve všech instancích. Chcete-li toho dosáhnout, můžete ke správě limitů rychlosti použít centralizované úložiště dat, jako je Redis. To vám umožní udržovat globální limit rychlosti sdílený mezi všemi instancemi Nginx.

Chcete-li nastavit omezení rychlosti pomocí Redis, musíte nainstalovat a nakonfigurovat modul nginx-module-redis. Jakmile modul nainstalujete, můžete aktualizovat konfiguraci Nginx tak, aby používala Redis pro omezení rychlosti.

Zde je příklad:

load_module modules/ngx_http_redis_module.so;

http {
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r/s;

    upstream redis_server {
        server 127.0.0.1:6379;
        keepalive 32;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            limit_req_redis zone=mylimit burst=10 redis_server=redis_server;
            proxy_pass http://backend;
        }
    }
}

V tomto příkladu jsme definovali upstream blok pro server Redis a aktualizovali blok umístění tak, aby používal direktivu limit_req_redis namísto standardní direktivy limit_req. Tato konfigurace zajišťuje, že limity rychlosti jsou vynucovány pomocí sdíleného úložiště dat Redis, což poskytuje konzistentní omezení rychlosti ve více instancích Nginx.

Dynamické omezení rychlosti

V některých situacích můžete chtít upravit limity rychlosti dynamicky na základě určitých podmínek nebo aktuálního zatížení vašeho serveru. Můžete například chtít použít přísnější limity rychlosti v době špičky, abyste mohli lépe spravovat zdroje serveru.

Chcete-li implementovat dynamické omezení rychlosti, můžete použít map směrnice k definování limitů sazeb na základě konkrétních podmínek.

Zde je příklad:

http {
    map $http_x_traffic $dynamic_rate {
        default "5r/s";
        high "2r/s";
    }

    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=$dynamic_rate;

    server {
        listen 80;
        server_name example.com;

        location / {
            limit_req zone=mylimit burst=10;
            proxy_pass http://backend;
        }
    }
}

V této konfiguraci používáme proměnnou $http_x_traffic odvozenou z vlastní hlavičky X-Traffic. Na základě této hodnoty záhlaví dynamicky nastavíme limit sazby. Když je hodnota záhlaví „vysoká“, použijeme přísnější limit rychlosti 2 požadavky za sekundu. Jinak používáme výchozí rychlost 5 požadavků za sekundu.

Všimněte si, že tento příklad předpokládá, že váš backendový server nebo jiná komponenta ve vaší infrastruktuře nastaví hlavičku X-Traffic na základě vašich požadovaných podmínek.

Testování vašeho rychlostního limitu v konfiguraci NGINX

Ověření omezení rychlosti s curlingem

Použití curl pro jednoduché testování požadavku

Chcete-li ověřit efektivitu vašeho nastavení omezení rychlosti v NGINX, curl, nástroj příkazového řádku pro odesílání požadavků HTTP, se ukazuje jako velmi užitečný. Může rychle odeslat více požadavků na váš server, což vám pomůže posoudit, zda jsou limity rychlosti aktivní.

for i in {1..10}; do curl -I http://example.com; done
  • Tento příkaz odešle na váš server 10 požadavků HEAD se zaměřením na http://example.com.
  • Analyzujte hlavičky HTTP odpovědí z těchto požadavků a ověřte funkčnost omezující rychlost.
  • NGINX by měl vrátit stavový kód 429 Too Many Requests, když četnost požadavků překročí váš určený limit.

Testování pomocí Apache Bench (ab)

Srovnávání odpovědí serveru pomocí Apache Bench

Apache Bench (ab) je účinný nástroj pro srovnávání ideální pro testování limitů rychlosti simulací podmínek s vysokým provozem. Pomáhá pochopit, jak se váš server NGINX chová pod náporem požadavků.

ab -n 100 -c 10 http://example.com/
  • Tento příkaz dává pokyn ab k odeslání 100 požadavků na http://example.com s úrovní souběžnosti 10.
  • Výstup z ab poskytuje pohled na účinnost omezující rychlost.
  • Zaměřte se na počet neúspěšných požadavků ve výstupu, který by měl být v souladu s nastavením vaší konfigurace omezující rychlost NGINX.

Použití nejlepších metod pro testování vaší konfigurace NGINX zajistí, že vaše pravidla omezující rychlost budou fungovat tak, jak mají.

Závěr

Nakonfigurováním omezení rychlosti v NGINX můžete chránit svůj server před nadměrným provozem a potenciálním zneužitím. To pomáhá udržovat výkon a dostupnost vašich služeb a zajišťuje lepší zážitek pro legitimní uživatele. Pravidelně sledujte a upravujte nastavení omezení rychlosti tak, abyste vyvážili bezpečnost a dostupnost. Implementace těchto ovládacích prvků je zásadní pro efektivní správu zdrojů vašeho serveru.

Joshua James
Následuj mě
Nejnovější příspěvky uživatele Joshua James (vidět vše)

Napsat komentář