Eine kurze Diskussion über zwei Strombegrenzungsmethoden in Nginx

Eine kurze Diskussion über zwei Strombegrenzungsmethoden in Nginx

Die Belastung wird im Allgemeinen während des Systemdesigns geschätzt. Wenn das System dem öffentlichen Netzwerk ausgesetzt ist, können böswillige Angriffe oder normaler Burst-Verkehr dazu führen, dass das System überlastet wird. Die Strombegrenzung ist eine der Schutzmaßnahmen. Die Strombegrenzung dient zur Steuerung des Flusses. In diesem Artikel werden zwei Strombegrenzungseinstellungen von Nginx aufgezeichnet.

„Aktuelle Einschränkung“ im Leben?

Strombegrenzung ist nichts Neues und in unserem täglichen Leben allgegenwärtig. Hier einige Beispiele:

Museen: Begrenzung der Besucherzahl pro Tag zum Schutz kultureller Relikte

Sicherheitskontrolle im Hochgeschwindigkeitszug: Es gibt mehrere Sicherheitskontrollen. Die Passagiere stellen sich der Reihe nach an und das Personal entscheidet anhand der Geschwindigkeit der Sicherheitskontrolle, ob Personen eingelassen werden. Während der Ferien können Sie Sicherheitskontrollpunkte hinzufügen, um die Verarbeitungskapazität zu verbessern (horizontale Erweiterung) und gleichzeitig die Länge des Wartebereichs zu erhöhen (Zwischenspeichern ausstehender Aufgaben).

Zur Abwicklung von Bankgeschäften gilt: Jeder muss zunächst eine Nummer erhalten und jedes Schalterbüro ruft diese Nummer zur Bearbeitung auf. Die Bearbeitungsgeschwindigkeit der einzelnen Schalter hängt vom jeweiligen Geschäft des Kunden ab. Jeder muss sich lediglich anstellen und warten, bis seine Nummer aufgerufen wird. Wenn es fast Zeit ist, Feierabend zu machen, sagen Sie dem Kunden, dass er morgen wiederkommen soll (lehnen Sie den Verkehr ab).

Staudamm-Abfluss: Staudämme können durch Schleusen die Abflussrate (die Verarbeitungsgeschwindigkeit) regeln.

Die oben genannten Beispiele zur „Strombegrenzung“ ermöglichen es den Dienstanbietern, ihren Kunden einen stabilen Dienst bereitzustellen.

Nginx-Ratenbegrenzung

Nginx bietet zwei Methoden zur Strombegrenzung: Eine dient zur Steuerung der Rate und die andere zur Steuerung der Anzahl gleichzeitiger Verbindungen.

Kontrollrate

Normale Strombegrenzung

Das Modul ngx_http_limit_req_module bietet die Möglichkeit, die Anforderungsverarbeitungsrate mithilfe des Leaky-Bucket-Algorithmus zu begrenzen. Das folgende Beispiel verwendet die nginx-Direktiven „limit_req_zone“ und „limit_req“, um die Anforderungsverarbeitungsrate einer einzelnen IP zu begrenzen.

Fügen Sie in nginx.conf http eine aktuelle Begrenzungskonfiguration hinzu:

Format: limit_req_zone Schlüsselzonenrate

http {
 limit_req_zone $binary_remote_addr Zone=myRateLimit:10m Rate=10r/s;
}

Konfigurieren Sie den Server so, dass er mit der Direktive „limit_req“ eine Strombegrenzung anwendet.

Server {
 Standort / {
 limit_req zone=meinRatenlimit;
 Proxy-Passwort http://mein_Upstream;
 }
}

Schlüssel: definiert das aktuelle Begrenzungsobjekt. binary_remote_addr ist ein Schlüssel, der die aktuelle Begrenzung basierend auf remote_addr (Client-IP) bedeutet. Der Zweck von binary_ besteht darin, die Speichernutzung zu komprimieren.

Zone: Definiert eine gemeinsam genutzte Speicherzone zum Speichern von Zugriffsinformationen. myRateLimit:10m gibt einen Speicherbereich mit einer Größe von 10 M und dem Namen myRateLimit an. 1 MB kann Zugriffsinformationen von 16.000 IP-Adressen speichern, und 10 MB können Zugriffsinformationen von 16W IP-Adressen speichern.

Mit rate wird die maximale Zugriffsrate eingestellt. rate=10r/s bedeutet, dass maximal 10 Anfragen pro Sekunde verarbeitet werden. Nginx verfolgt Anforderungsinformationen tatsächlich mit einer Genauigkeit von Millisekunden, sodass 10 U/s tatsächlich eine Grenze darstellen: Alle 100 Millisekunden wird eine Anforderung verarbeitet. Dies bedeutet, dass eine weitere Anfrage, die innerhalb von 100 Millisekunden nach der Verarbeitung der vorherigen Anfrage eingeht, abgelehnt wird.

Umgang mit Datenverkehrsspitzen

Das obige Beispiel begrenzt die Rate auf 10r/s. Wenn der normale Verkehr plötzlich zunimmt, werden die Anfragen, die den Grenzwert überschreiten, abgelehnt und der Burst-Verkehr kann nicht verarbeitet werden. Dieses Problem kann durch Kombinieren des Burst-Parameters gelöst werden.

Server {
 Standort / {
 limit_req Zone=myRateLimit Burst=20;
 Proxy-Passwort http://mein_Upstream;
 }
}

Burst bezeichnet die Anzahl zusätzlicher Anfragen, die nach Überschreiten der festgelegten Verarbeitungsrate verarbeitet werden können. Bei einer Rate von 10 U/s wird 1 Sekunde in 10 Teile unterteilt, d. h. alle 100 ms kann 1 Anforderung verarbeitet werden.

Hier gilt **burst=20 **. Wenn 21 Anfragen gleichzeitig eintreffen, verarbeitet Nginx die erste Anfrage, stellt die restlichen 20 Anfragen in die Warteschlange und nimmt dann alle 100 ms eine Anfrage zur Verarbeitung aus der Warteschlange. Wenn die Anzahl der Anfragen größer als 21 ist, lehnt der Server die Verarbeitung der zusätzlichen Anfragen ab und gibt 503 zurück.

Allerdings ist es nicht praktikabel, nur den Burst-Parameter zu verwenden. Angenommen, Burst = 50 und die Rate beträgt immer noch 10 U/s. Obwohl 50 Anfragen in der Warteschlange alle 100 ms verarbeitet werden, muss die 50. Anfrage 50 x 100 ms oder 5 s warten. Eine so lange Verarbeitungszeit ist natürlich inakzeptabel.

Daher wird Burst häufig in Verbindung mit Nodelay verwendet.

Server {
 Standort / {
 limit_req Zone=myRateLimit Burst=20 Knotenlay;
 Proxy-Passwort http://mein_Upstream;
 }
}

nodelay steht für den Burst-Parameter. burst=20 nodelay bedeutet, dass diese 20 Anfragen sofort und ohne Verzögerung verarbeitet werden, was einer Sonderbehandlung von Sonderfällen entspricht. Selbst wenn diese 20 Burst-Anfragen sofort verarbeitet werden, werden nachfolgende Anfragen jedoch nicht sofort verarbeitet. Burst = 20 entspricht dem Belegen von 20 Slots in der Cache-Warteschlange. Selbst wenn die Anforderung verarbeitet wird, können diese 20 Slots nur alle 100 ms einzeln freigegeben werden.

Dadurch wird eine stabile Rate erreicht, gleichzeitig können plötzliche Verkehrsströme aber auch normal bewältigt werden.

Begrenzen Sie die Anzahl der Verbindungen

Das ngx_http_limit_conn_module bietet die Möglichkeit, die Anzahl der Verbindungen mit den Anweisungen limit_conn_zone und limit_conn zu begrenzen. Das Folgende ist ein offizielles Beispiel für Nginx:

Verbindungslimitzone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;

Server {
 ...
 limit_conn perip 10;
 Verbindungslimit für Server 100;
}

limit_conn perip 10 verwendet den Schlüssel $binary_remote_addr, was bedeutet, dass eine einzelne IP auf maximal 10 Verbindungen gleichzeitig beschränkt ist.

limit_conn perserver 100 Der Schlüssel ist $server_name, der die Gesamtzahl der gleichzeitigen Verbindungen angibt, die der virtuelle Host (Server) gleichzeitig verarbeiten kann.

Es ist zu beachten, dass die Verbindung erst gezählt wird, nachdem der Anforderungsheader vom Backend-Server verarbeitet wurde.

Einrichten einer Whitelist

Die Strombegrenzung gilt hauptsächlich für den externen Zugriff. Der Intranet-Zugriff ist relativ sicher und erfordert keine Strombegrenzung. Sie können einfach eine Whitelist einrichten. Dies kann mithilfe der beiden Nginx-Toolmodule ngx_http_geo_module und ngx_http_map_module erfolgen.

Konfigurieren Sie die Whitelist im http-Abschnitt von nginx.conf:

geo $limit {
 Standardwert 1;
 10.0.0.0/8 0;
 192.168.0.0/24 0;
 172.20.0.35 0;
}

Karte $limit $limit_key {
 0 "";
 1 $binäre_Remote_Adresse;
}

limit_req_zone $limit_key Zone=myRateLimit:10m Rate=10r/s;

Geo gibt 0 für Whitelist-IPs (entweder Subnetze oder IPs) und 1 für andere IPs zurück.

map konvertiert limit in limit_key. Wenn $limit 0 (Whitelist) ist, wird eine leere Zeichenfolge zurückgegeben; wenn es 1 ist, wird die tatsächliche IP-Adresse des Clients zurückgegeben.

Der Strombegrenzungsschlüssel limit_req_zone wird nicht mehr verwendet Stattdessen wird **limit_key verwendet, um den Wert dynamisch zu erhalten. Wenn es sich um eine Whitelist handelt, ist der Grenzwertschlüssel limit_req_zone eine leere Zeichenfolge und es gibt keine Begrenzung. Wenn es sich nicht um eine Whitelist handelt, wird die tatsächliche IP des Clients begrenzt.

Weiterführende Literatur

Zusätzlich zur Strombegrenzung bietet ngx_http_core_module auch die Möglichkeit, die Datenübertragungsgeschwindigkeit (allgemein als Downloadgeschwindigkeit bekannt) zu begrenzen.

Zum Beispiel:

Standort /flv/ {
 flv;
 Grenzrate nach 20 Min.;
 Grenzrate 100k;
}

Diese Begrenzung gilt für jede einzelne Anfrage, was bedeutet, dass die Geschwindigkeit des Clients beim Herunterladen der ersten 20 M nicht beschränkt ist und die nachfolgende Begrenzung bei 100 kb/s liegt.

Die obige kurze Diskussion über die beiden Strombegrenzungsmethoden in Nginx ist der gesamte Inhalt, den der Herausgeber mit Ihnen teilt. Ich hoffe, es kann Ihnen als Referenz dienen. Ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen.

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung zur Verwendung von Nginx + Consul + Upsync zum Erreichen eines dynamischen Lastausgleichs
  • Detailliertes Tutorial zur Konfiguration von Nginx für https-verschlüsselten Zugriff
  • So zeigen Sie den Nginx-Konfigurationsdateipfad und den Ressourcendateipfad an
  • Analyse des Prozesses zur Implementierung eines Nginx+Tomcat-Clusters unter Windwos
  • Die Vor- und Nachteile von Nginx und LVS und ihre geeignete Nutzungsumgebung
  • Konfigurationsvorgänge verschiedener Projekte im sekundären Verzeichnis, nachdem nginx den Domänennamen konfiguriert hat

<<:  Detaillierte Verwendung von Echarts in vue2 vue3

>>:  Detaillierte Erklärung des MySQL-Datenbankparadigmas

Artikel empfehlen

IIS7~IIS8.5 Löschen oder Ändern des Serverprotokollheaders Server

Anforderungen: Entfernen Sie HTTP-Antwortheader i...

Weitere beliebte und kreative Beispiele für Webdesign mit dunklem Hintergrund

Seitendesigns im dunklen Hintergrundstil sind seh...

MySQL-String-Splitting-Beispiel (String-Extraktion ohne Trennzeichen)

String-Extraktion ohne Trennzeichen Fragenanforde...

Praxis der Bereitstellung von in Python geschriebenen Webanwendungen mit Docker

Inhaltsverzeichnis 1. Docker installieren 2. Code...

Node.js erstellt ein einfaches Crawler-Case-Tutorial

Vorbereitung Zuerst müssen Sie nodejs herunterlad...

Erfahrungsaustausch über die Priorität des Ladens von CSS-Stilen

Während der Projektentwicklung bin ich gestern auf...

Mehrere Gründe, HTML nicht zu komprimieren

Der Grund ist einfach: In HTML-Dokumenten entsprec...