Hur man använder hastighetsbegränsning på Nginx

0
128

Prisbegränsning styr hur många förfrågningar användare kan göra till din webbplats. Detta sätts vanligtvis på för att stoppa missbrukande robotar, begränsa inloggningsförsök och kontrollera API -användning, vilket kan förhindra att din server saktar ner under belastning.

Hastighetsbegränsning kan inte alltid rädda dig från massiva trafikpikar, så om din server verkligen behöver skydd är det bra att sätta upp en fullständig CDN framför, eller åtminstone konfigurera HAProxy-belastningsbalansering för att dela belastningen på flera servrar.

Så här aktiverar du hastighetsbegränsning i Nginx

Först måste vi definiera en hastighetsbegränsande “ zon. ” Du kan ha flera zoner konfigurerade och tilldela olika platsblock till varje zon. Låt oss för tillfället skapa en grundzon genom att lägga till följande rad till din server eller http -kontextblock:

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

Kommandot limit_req_zone definierar en zon med $ binar_remote_addr som identifierare. Detta är klientens IP -adress, men du kan också använda något som $ server_name för att begränsa den per server.

Zonflaggan heter zonen (i detta fall “ foo ”) och tilldelar ett minnesblock för zonen. Nginx måste lagra IP -adresser för att kontrollera mot, så det behöver minne för varje zon. I det här fallet tilldelar 10m 10 megabyte minne, tillräckligt för 160 000 anslutningar per sekund (vilket du sannolikt aldrig kommer att se på en enda server).

Annonsering

Den slutliga flaggan är hastigheten, som definierar standardantalet anslutningar som varje klient är tillåten. Här är den inställd på 5 förfrågningar per sekund, med 10 som max, även om du kan ställa in det långsammare genom att formatera det som 30r/m (för 30 förfrågningar per minut).

När zonen är konfigurerad, det är dags att använda den.

location {limit_req zone = foo burst = 10 nodelay; //gör webservergrejer}

Limit_req -direktivet gör tunga lyft och tilldelar en begränsningszon ett platsblock. Burstparametern ger klienten lite vickrum och gör att de kan göra extra förfrågningar så länge de inte överskrider hastigheten i genomsnitt.

Under huven lägger den till burst -begäranden i en “ kö ” som slår ner var 100: e ms. Detta kan få din webbplats att se långsam ut, så nodelay -parametern tar bort denna köfördröjning. Med den aktuella konfigurationen, om du gjorde 10 förfrågningar på en gång, skulle nodelay -parametern tillåta alla 10 förfrågningar och sedan begränsa följande begäran till 5 förfrågningar per sekund. Om du har gjort ytterligare 6 förfrågningar tillåter det 5, och avvisar den 6: e eftersom det är över gränsen. När klienten slutar göra förfrågningar går kön ner med en hastighet beroende på din hastighet.

Begränsning i två steg

Genom att manuellt ställa in fördröjningsvariabeln är det möjligt att tillåta några förfrågningar att inte ha någon fördröjning medan resten måste vänta i kön. Detta bildar en tvåstegsgräns, där du vill att de första förfrågningarna ska vara mycket snabba, uppföljningsförfrågningar ska saktas ner lite och sedan sätta in hastighetsgränsen.

Detta görs genom att tilldela en fördröjningsvärde i limit_req -direktivet:

limit_req zone = ip burst = 10 delay = 5; Annons

Här kommer de första 5 förfrågningarna direkt. Klienten får sedan ytterligare 5 förfrågningar var 100: e ms tills skuret fylls, varefter de begränsas av hastighetsvariabeln.

Rate Begränsning av bandbredd

Begränsning av begäranden blockerar de flesta skadliga attacker, men du kanske vill begränsa nedladdningshastigheten så att användarna inte saktar ner din server genom att ladda ner många filer.

< p>Du kan göra detta med limit_rate -direktivet, som inte behöver ha en begränsningszon konfigurerad för det.

limit_rate 100k limit_rate_after 1m

Detta anger den maximala nedladdningshastigheten till 100 Kbps efter att 1 megabyte har laddats ner. Detta mäts dock per anslutning, och användare kan öppna flera anslutningar. För att lösa detta måste du lägga till en anslutningsbegränsande zon bredvid begärningsbegränsningszonen:

limit_conn_zone $ binary_remote_address zone = bar: 10m limit_req_zone $ binary_remote_addr zone = foo: 10m rate = 5r/s;

Detta gör en 10 megabyte zon kallad “ bar ” som spårar baserat på IP -adress. Du kan använda detta tillsammans med ett limit_conn -direktiv för att aktivera anslutningsbegränsning.

server {limit_conn bar 5; location/static/{limit_conn bar 1; limit_rate 100k; limit_rate_after 1m; }}

Eftersom de flesta webbläsare öppnar flera anslutningar vid normal surfning vill vi ange den globala anslutningsgränsen högre och ställ sedan in gränsen till 1 anslutning för nedladdning.