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

So fragen Sie Daten aus mehreren unabhängigen Tabellen und Paging in MySQL ab

Mysql mehrere unabhängige Tabellen Abfragedaten u...

Ausführliches Tutorial zur Installation und Konfiguration von MySQL 8.0.20

In diesem Artikel finden Sie eine ausführliche An...

Zusammenfassung von 6 Methoden zur Anzeige von Linux-Protokollen

Als Backend-Programmierer haben Sie an vielen Ste...

Implementierungscode für die adaptive IFrame-Größe

Seitendomänenbeziehung: Die Hauptseite a.html gehö...

Zusammenfassung der Methoden zur Änderung des Git-Commit-Protokolls

Fall 1: Letzte Übermittlung und kein Push Führen ...

Mit wie vielen Pixeln sollte eine Webseite gestaltet werden?

Viele Webdesigner sind beim Entwurf des Webseitenl...

Was ist dies in einer Punkt-für-Punkt-Reihe von JavaScript?

Verstehe das Vielleicht haben Sie this in anderen...

HTML-Hyperlinks im Detail erklärt

Hyperlink Hyperlinks sind die am häufigsten verwen...

Lösung für das Timeout-Problem der SNMP4J-Serververbindung

Als Verwaltungszentrale und Server dient dabei un...

IE8 Beta 1 hat zwei Bereiche, die Ihre Aufmerksamkeit erfordern

<br />Verwandte Artikel: Web-Kenntnisse: Lös...

Einführung in CSS-Stileinführungsmethoden und ihre Vor- und Nachteile

Drei Möglichkeiten, CSS einzuführen 1. Inline-Sti...

Tutorial zur Installation und Konfiguration von msmtp und mutt für Raspberry Pi

1. Installieren Sie mutt sudo apt-get install mut...

Installieren Sie das komprimierte MySQL5.7-Paket schnell unter Windows

In diesem Artikel erfahren Sie, wie Sie das kompr...