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; } }
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 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! Das könnte Sie auch interessieren:
|
>>: Detaillierte Erläuterung der Angular-Routing-Animation und der erweiterten Animationsfunktionen
Vorwort Der Ursprung ist Frage 1: Wenn Ihre Umask...
1. Einleitung Nach dem Start von MySQL wird Buffe...
Linux-Befehl zum Ändern des Hostnamens 1. Wenn Si...
Über wen Zeigt die am System angemeldeten Benutze...
Inhaltsverzeichnis 1. Das Konzept von Prozess und...
1. Technische Punkte Vite-Version vue3 ts Integri...
Laden Sie zunächst das Diagramm herunter 1. Deins...
Inhaltsverzeichnis Was ist JSON Warum diese Techn...
1. Einleitung pt-query-digest ist ein Tool zum An...
Inhaltsverzeichnis 1. Projektanforderungen Zweite...
Inhaltsverzeichnis 1. Ursprungswert und Bezugswer...
Inhaltsverzeichnis Tutorial-Reihe 1. Einführung u...
In diesem Artikelbeispiel wird der spezifische Ja...
Systemumgebung: Windows 7 1. Docker installieren ...
Code kopieren Der Code lautet wie folgt: <html...