Detaillierte Erläuterung der Nginx-Strombegrenzungskonfiguration

Detaillierte Erläuterung der Nginx-Strombegrenzungskonfiguration

Dieser Artikel erläutert anhand von Beispielen die Strombegrenzungskonfiguration von Nginx von der einfachsten bis zur komplexesten und stellt eine positive Ergänzung zur kurzen offiziellen Dokumentation dar.

Nginx verwendet den Leaky-Bucket-Algorithmus, um den Strom zu begrenzen. Wenn Sie sich für den Algorithmus interessieren, können Sie ihn zunächst auf Wikipedia nachlesen. Wenn Sie diesen Algorithmus jedoch nicht verstehen, wird dies Ihre Lesbarkeit des Artikels nicht beeinträchtigen.

Eimer leeren

Beginnen wir mit der einfachsten Strombegrenzungskonfiguration:

limit_req_zone $binary_remote_addr Zone=IP-Limit:10m Rate=10r/s;

Server {
  Standort /login/ {
    limit_req Zone=IP-Limit;
    Proxy-Passwort http://login_upstream;
  }
}

  • $binary_remote_addr begrenzt den Fluss der Client-IP;
  • zone=ip_limit:10m Der Name der Strombegrenzungsregel ist ip_limit, wodurch 10 MB Speicherplatz zur Verfügung stehen, um den der IP-Adresse entsprechenden Strombegrenzungsstatus aufzuzeichnen.
  • Rate = 10 Anfragen pro Sekunde. Das aktuelle Limit beträgt 10 Anfragen pro Sekunde.
  • Standort /login/ Anmeldefluss begrenzen

Die Ratenbegrenzung beträgt 10 Anfragen pro Sekunde. Wenn 10 Anfragen gleichzeitig bei einem inaktiven Nginx eintreffen, können sie dann alle ausgeführt werden?

Aus dem undichten Eimer gehen Anfragen mit einer gleichmäßigen Rate verloren. Wie können 10 U/s eine konstante Geschwindigkeit sein? Alle 100 ms geht eine Anfrage verloren.

In dieser Konfiguration ist der Bucket leer und alle Anfragen, die nicht in Echtzeit weitergegeben werden können, werden abgelehnt.

Wenn also 10 Anfragen gleichzeitig eintreffen, kann nur eine Anfrage ausgeführt werden und die anderen werden abgelehnt.

Das ist nicht sehr benutzerfreundlich. In den meisten Geschäftsszenarien hoffen wir, dass diese 10 Anfragen ausgeführt werden können.

Platzen

Ändern wir die Konfiguration, um das Problem im vorherigen Abschnitt zu lösen.

limit_req_zone $binary_remote_addr Zone=IP-Limit:10m Rate=10r/s;

Server {
  Standort /login/ {
    limit_req Zone=IP-Limit Burst=12;
    Proxy-Passwort http://login_upstream;
  }
}

burst=12 Die Größe des Leaky Buckets wird auf 12 gesetzt

Logischerweise wird dies als „Leaky Bucket“ bezeichnet und als FIFO-Warteschlange implementiert, die Anfragen, die nicht ausgeführt werden können, vorübergehend zwischenspeichert.

Auf diese Weise beträgt die Leckgeschwindigkeit immer noch 100 ms pro Anforderung, aber die gleichzeitigen Anforderungen, die vorübergehend nicht ausgeführt werden können, können zuerst zwischengespeichert werden. Erst wenn die Warteschlange voll ist, werden neue Anfragen abgelehnt.

Auf diese Weise begrenzt der undichte Eimer nicht nur den Durchfluss, sondern übernimmt auch die Funktion der Spitzenreduzierung und Talfüllung.

Wenn in dieser Konfiguration 10 Anfragen gleichzeitig eintreffen, werden sie nacheinander ausgeführt, also alle 100 ms eine.

Obwohl es ausgeführt wurde, erhöhte sich die Verzögerung aufgrund der Warteschlangenausführung erheblich, was in vielen Szenarien immer noch nicht akzeptabel ist.

Keine Verzögerung

Ändern Sie die Konfiguration weiter, um das Problem der erhöhten Verzögerung durch zu lange Verzögerung zu lösen

limit_req_zone $binary_remote_addr Zone=IP-Limit:10m Rate=10r/s;

Server {
  Standort /login/ {
    limit_req Zone=IP_Limit Burst=12 Knotenanzahl;
    Proxy-Passwort http://login_upstream;
  }
}

Nodelay beschleunigt die Zeit bis zum Beginn der Ausführung von Anfragen. Bisher wurde die Ausführung verzögert, bis die Anfrage den Bucket verließ. Jetzt gibt es keine Verzögerung mehr und die Ausführung beginnt, sobald sie den Bucket erreicht.

Entweder wird es sofort ausgeführt oder abgelehnt, und die Anforderung wird aufgrund der aktuellen Begrenzung nicht verzögert.

Da die Anforderungen mit gleichmäßiger Geschwindigkeit aus dem Bucket austreten und der Bucket-Speicherplatz festgelegt ist, werden im Durchschnitt 5 Anforderungen pro Sekunde ausgeführt und der Zweck der Strombegrenzung wird erreicht.

Dies hat jedoch auch Nachteile. Der Durchfluss ist begrenzt, die Begrenzung ist jedoch nicht so gleichmäßig. Nehmen wir die obige Konfiguration als Beispiel: Wenn 12 Anfragen gleichzeitig eintreffen, können diese 12 Anfragen sofort ausgeführt werden, und die nachfolgenden Anfragen können nur mit gleichmäßiger Geschwindigkeit in den Bucket gelangen, wobei alle 100 ms eine Anfrage ausgeführt wird. Wenn über einen bestimmten Zeitraum keine Anforderungen vorliegen und der Bucket leer ist, können 12 gleichzeitige Anforderungen zusammen ausgeführt werden.

In den meisten Fällen ist diese ungleichmäßige Strombegrenzung kein großes Problem. Nginx bietet jedoch auch einen Parameter zur Steuerung der Anzahl gleichzeitiger Ausführungen, d. h. Nodelay-Anfragen.

limit_req_zone $binary_remote_addr Zone=IP-Limit:10m Rate=10r/s;

Server {
  Standort /login/ {
    limit_req Zone=IP_Limit Burst=12 Verzögerung=4;
    Proxy-Passwort http://login_upstream;
  }
}

delay=4 startet die Verzögerung ab der fünften Anfrage im Bucket

Auf diese Weise kann durch Steuern des Werts des Verzögerungsparameters die Anzahl der gleichzeitig auszuführenden Anforderungen angepasst werden, um die Anforderungen gleichmäßiger zu verteilen. Bei einigen ressourcenintensiven Diensten ist es weiterhin erforderlich, diese Anzahl zu steuern.

Referenz

http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
https://www.nginx.com/blog/rate-limiting-nginx/

Zusammenfassen

Oben sehen Sie die vom Herausgeber eingeführte Nginx-Strombegrenzungskonfiguration. Ich hoffe, sie ist für alle hilfreich. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Herausgeber wird Ihnen rechtzeitig antworten. Ich möchte auch allen für ihre Unterstützung der Website 123WORDPRESS.COM danken!
Wenn Sie diesen Artikel hilfreich finden, können Sie ihn gerne abdrucken und dabei bitte die Quelle angeben. Vielen Dank!

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung der Verbindungslimitkonfiguration von Nginx für IP-Adressen in einem Netzwerksegment
  • Analyse der Implementierung der Nginx Rush-Kaufstrombegrenzungskonfiguration
  • Praktische Aufzeichnung der aktuellen Einschränkungen und des Konfigurationsmanagements von Nginx

<<:  Eine kurze Diskussion über die Fallstricke und Lösungen der neuen Features von MySQL 8.0 (Zusammenfassung)

>>:  Detaillierte Erläuterung der Angular-Routing-Animation und der erweiterten Animationsfunktionen

Artikel empfehlen

Detaillierte Erklärung des FreeList-Mechanismus von MySQL

1. Einleitung Nach dem Start von MySQL wird Buffe...

Detaillierte Erläuterung des Linux-Befehls zur Änderung des Hostnamens

Linux-Befehl zum Ändern des Hostnamens 1. Wenn Si...

Einführung in Who-Befehlsbeispiele in Linux

Über wen Zeigt die am System angemeldeten Benutze...

Eine detaillierte Einführung in den Ausführungsmechanismus von JavaScript

Inhaltsverzeichnis 1. Das Konzept von Prozess und...

Detaillierte Erläuterung des mobilen Projekts vite2.0 + vue3

1. Technische Punkte Vite-Version vue3 ts Integri...

Installations-Tutorial für mysql8.0rpm auf centos7

Laden Sie zunächst das Diagramm herunter 1. Deins...

Detaillierte Erklärung des JSON-Dateischreibformats

Inhaltsverzeichnis Was ist JSON Warum diese Techn...

MySQL-langsame Abfrage pt-query-digest Analyse des langsamen Abfrageprotokolls

1. Einleitung pt-query-digest ist ein Tool zum An...

Fortgeschrittene JavaScript-Programmierung: Variablen und Umfang

Inhaltsverzeichnis 1. Ursprungswert und Bezugswer...

MySQL Serie 4 SQL-Syntax

Inhaltsverzeichnis Tutorial-Reihe 1. Einführung u...

JavaScript-Farbbetrachter

In diesem Artikelbeispiel wird der spezifische Ja...