Detaillierte Erläuterung des Nginx-HTTP-Ressourcenanforderungslimits (drei Methoden)

Detaillierte Erläuterung des Nginx-HTTP-Ressourcenanforderungslimits (drei Methoden)

Voraussetzung: nginx muss über die Module ngx_http_limit_conn_module und ngx_http_limit_req_module verfügen. Mit dem Befehl 2>&1 nginx -V | tr ' ' '\n'|grep limit können Sie prüfen, ob entsprechende Module vorhanden sind. Wenn nicht, kompilieren und installieren Sie diese beiden Module neu.

Testversion: Nginx Version 1.15+

Begrenzen Sie die Anzahl der Links

1. Verwenden Sie die Direktive limit_conn_zone, um den Schlüssel zu definieren und die Parameter der gemeinsam genutzten Speicherzone festzulegen (die Arbeitsprozesse verwenden diese Zone, um einen Zähler für den Schlüsselwert gemeinsam zu nutzen). Das erste Argument gibt den Ausdruck an, der als Schlüssel ausgewertet werden soll. Der zweite Parameter, Zone, gibt den Namen der Zone und ihre Größe an:

Verbindungslimitzone $binary_remote_addr Zone=Adresse:10m;

2. Verwenden Sie die Direktive limit_conn im Kontext location {} , server {} oder http {} , um das Limit anzuwenden. Das erste Argument ist der oben festgelegte Name der gemeinsam genutzten Speicherzone und das zweite Argument ist die Anzahl der für jeden Schlüssel zulässigen Verbindungen:

Standort /download/ {
 limit_conn Adresse 1;
}

Wenn Sie die Variable $binary_remote_addr als Parameter verwenden, basiert die Einschränkung auf der IP-Adresse. Sie können auch die Variable $server_name verwenden, um die Anzahl der Verbindungen zu einem bestimmten Server zu begrenzen:

http {
 limit_conn_zone $server_name zone=Server:10m;

 Server {
 limit_conn-Server 1000;
 }
}

Begrenzung der Anforderungsrate

Mithilfe der Ratenbegrenzung können Sie DDoS- und CC-Angriffe verhindern oder vermeiden, dass ein Upstream-Server durch zu viele gleichzeitige Anfragen überlastet wird. Diese Methode basiert auf dem Leaky-Bucket-Algorithmus, bei dem Anfragen mit unterschiedlicher Geschwindigkeit im Bucket eintreffen und ihn mit einer festen Geschwindigkeit verlassen. Bevor Sie die Ratenbegrenzung verwenden, müssen Sie die globalen Parameter des „Leaky Bucket“ konfigurieren:

  • Schlüssel – ein Parameter, der verwendet wird, um einen Client von einem anderen zu unterscheiden, normalerweise eine Variable
  • gemeinsam genutzte Speicherzone – Name und Größe der Zone, die den Status dieser Schlüssel enthält (d. h. der „undichte Eimer“)
  • Rate – die Anforderungsratenbegrenzung, angegeben in Anforderungen pro Sekunde (r/s) oder Anforderungen pro Minute (r/m) („Leaky Bucket Draining“). „Anfragen pro Minute“ wird verwendet, um eine Rate anzugeben, die weniger als eine Anfrage pro Sekunde beträgt.

Diese Parameter werden mit der Direktive „limit_req_zone“ festgelegt. Diese Direktive wird auf http{}-Ebene definiert - dieser Ansatz ermöglicht die Anwendung verschiedener Zonen und Anforderungsüberlaufparameter auf unterschiedliche Kontexte:

http {
 #...

 limit_req_zone $binary_remote_addr Zone=eins:10m Rate=1r/s;
}

Mit dieser Konfiguration wird eine gemeinsam genutzte Speicherzone mit dem Namen „One“ und einer Größe von 10 MB erstellt. Dieser Bereich enthält den Status der Client-IP-Adresse, die mit der Variable $binary_remote_addr festgelegt wurde. Beachten Sie, dass $remote_addr auch die IP-Adresse des Clients enthält, während $binary_remote_addr die kürzere Binärdarstellung der IP-Adresse enthält.

Die optimale Größe des gemeinsam genutzten Speicherbereichs kann mithilfe der folgenden Daten berechnet werden: $binary_remote_addr Die Wertgröße einer IPv4-Adresse beträgt 4 Bytes, und der Speicherzustand auf 64-Bit-Plattformen belegt 128 Bytes. Daher belegen die Statusinformationen für ungefähr 16.000 IP-Adressen 1 MB dieses Bereichs.

Wenn der Speicherplatz erschöpft ist, wenn NGINX einen neuen Eintrag hinzufügen muss, wird der älteste Eintrag gelöscht. Wenn der freigegebene Speicherplatz immer noch nicht ausreicht, um den neuen Datensatz aufzunehmen, gibt NGINX den Statuscode 503 „Service Unavailable“ zurück, der mit der Direktive „limit_req_status“ neu definiert werden kann.

Sobald diese Zone festgelegt ist, können Sie die Anforderungsrate mit der Direktive „limit_req“ überall in der NGINX-Konfiguration begrenzen, insbesondere in den Kontexten „server {}“, „location {}“ und „http {}“:

http {
 #...

 limit_req_zone $binary_remote_addr Zone=eins:10m Rate=1r/s;

 Server {
 #...

 Standort /Suche/ {
  limit_req Zone=eins;
 }
 }
}

Mit der obigen Konfiguration verarbeitet nginx unter der Route /search/ nicht mehr als 1 Anfrage pro Sekunde und verzögert diese Anfragen so, dass die Gesamtrate nicht höher als die festgelegte Rate ist. NGINX verzögert die Verarbeitung solcher Anfragen, bis der „Bucket“ (gemeinsam genutzter Bucket 1) voll ist. Bei Anfragen, die den vollen Bucket erreichen, antwortet NGINX mit einem 503-Dienst nicht verfügbar-Fehler (wenn limit_req_status keinen benutzerdefinierten Statuscode festlegt).

Bandbreite begrenzen

Um die Bandbreite pro Verbindung zu begrenzen, verwenden Sie die Direktive „limit_rate“:

Standort /download/ {
 Grenzrate 50k;
}

Mit dieser Konfiguration können Clients Inhalte mit Geschwindigkeiten von bis zu 50 k/s über eine einzige Verbindung herunterladen. Ein Client kann jedoch mehrere Verbindungen öffnen, um diese Beschränkung zu umgehen. Wenn das Ziel darin besteht, Downloadgeschwindigkeiten über einem bestimmten Wert zu verhindern, sollte daher auch die Anzahl der Verbindungen begrenzt werden. Beispielsweise eine Verbindung pro IP-Adresse (bei Verwendung der oben angegebenen gemeinsam genutzten Speicherzone):

Standort /download/ {
 limit_conn Adresse 1;
 Grenzrate 50k;
}

Um Beschränkungen erst festzulegen, nachdem der Client eine bestimmte Datenmenge heruntergeladen hat, verwenden Sie die Direktive „limit_rate_after“. Es kann sinnvoll sein, dem Client das schnelle Herunterladen einer bestimmten Datenmenge (z. B. des Dateikopfs – des Filmindex) zu gestatten und die Downloadrate der restlichen Daten zu begrenzen (so dass der Benutzer den Film ansehen kann, anstatt ihn herunterzuladen).

Grenzrate nach 500.000;
Grenzrate 20k;

Das folgende Beispiel zeigt eine kombinierte Konfiguration zur Begrenzung der Verbindungsanzahl und Bandbreite. Die maximal zulässige Anzahl von Verbindungen ist auf 5 Verbindungen pro Clientadresse festgelegt, was für die meisten gängigen Fälle geeignet ist, da moderne Browser normalerweise maximal 3 Verbindungen gleichzeitig geöffnet haben. Außerdem ist nur eine Verbindung zu dem Ort erlaubt, an dem der Download bereitgestellt wird:

http {
 limit_conn_zone $binary_remote_address zone=Adresse:10m

 Server {
 Stammverzeichnis /www/data;
 limit_conn Adresse 5;

 Standort / {
 }

 Standort /download/ {
  limit_conn Adresse 1;
  Grenzrate nach 1 Min.;
  Grenzrate 50k;
 }
 }
}

Der Inhalt wird aus dem Teil des Dokuments zur Nginx-Anforderungsbeschränkung übersetzt, mit einer leichten Anpassung der Semantik.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung der Nginx-Anforderungslimits (Verbindungslimits und Anforderungslimits)
  • Eine kurze Diskussion über die Implementierung der Anforderungsbeschränkung und Zugriffskontrolle bei Nginx
  • Globale Zugriffsbeschränkung durch Nginx-Proxy-Interception-Anforderung
  • Nginx begrenzt die Anzahl der Besuche und Anfragen an eine bestimmte IP im gleichen Zeitraum. Beispielcode
  • Tutorial zum Konfigurieren des Moduls zur Begrenzung der Anzahl von Verbindungen und Anfragen im Nginx-Server
  • Konfigurationsmethode für das Nginx-Anforderungslimit

<<:  Eine kurze Diskussion über die Typen von node.js-Middleware

>>:  Grafisches Tutorial zur Installations- und Konfigurationsmethode für die Dekomprimierungsversion von MySQL 5.7.21 (Win10)

Artikel empfehlen

Einführung in Fork in Multithreading unter Linux

Inhaltsverzeichnis Frage: Fall (1) Fork vor dem E...

Entdecken Sie, wie Ihnen eine LED den Einstieg in den Linux-Kernel erleichtert

Inhaltsverzeichnis Vorwort LED-Trigger Entdecken ...

So verwenden Sie Makros in JavaScript

In Sprachen werden häufig Makros zur Implementier...

So drucken Sie hervorgehobenen Code in der Node.JS-Konsole

Vorwort Wenn der Code ausgeführt wird und ein Feh...

Sind die Wertebereiche von int(3) und int(10) in MySQL gleich?

Inhaltsverzeichnis Frage: Antwort: Wirklichkeit: ...

So verwenden Sie React zur Implementierung einer Bilderkennungs-App

Lassen Sie mich Ihnen zuerst das Effektbild zeige...

Ausführliche Erklärung der Closure in JavaScript

Einführung Closure ist eine sehr leistungsstarke ...

So überwachen Sie MySQL mit Zabbix

Dokumentation zur Zabbix-Bereitstellung Nach der ...

Zusammenfassung und Analyse häufig verwendeter Docker-Befehle und Beispiele

Inhalt 1. Container-Lebenszyklusmanagement (1) Do...

js realisiert das Verpacken mehrerer Bilder in Zip

Inhaltsverzeichnis 1. Dateien importieren 2. HTML...