So verwenden Sie limit_req_zone in Nginx, um den Zugriff auf dieselbe IP zu beschränken

So verwenden Sie limit_req_zone in Nginx, um den Zugriff auf dieselbe IP zu beschränken

Nginx kann die Direktive „limit_req_zone“ des Moduls „ngx_http_limit_req_module“ verwenden, um den Zugriff zu beschränken und zu verhindern, dass Benutzer den Server böswillig angreifen und überlasten. Das Modul ngx_http_limit_req_module ist standardmäßig in nginx installiert, Sie können es also direkt konfigurieren.

Konfigurieren Sie zunächst unter dem http-Modul in der Datei nginx.conf

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

Hinweis: Der Bereichsname lautet eins (benutzerdefiniert), die belegte Raumgröße beträgt 10 m und die durchschnittliche Anforderungshäufigkeit kann nicht mehr als einmal pro Sekunde betragen.

$binary_remote_addr ist das Binärformat von $remote_addr (Client-IP), das auf 4 Bytes festgelegt ist (wahrscheinlich die lange Typlänge in der Sprache C). $remote_addr wird als Zeichenfolge gespeichert und nimmt 7-15 Bytes ein. Es scheint, dass die Verwendung von $binary_remote_addr Platz sparen kann, aber im Internet steht, dass 64-Bit-Systeme alle 64 Bytes belegen. Ich verstehe das nicht ganz. Versuchen Sie trotzdem, $binary_remote_addr zu verwenden.

Zweitens konfigurieren Sie es unter dem Submodulserver des http-Moduls

Standort ~* .htm$ {
limit_req Zone=eins Burst=5 Knotenlage;
Proxy-Passwort http://backend_tomcat;
}

Hier beschränke ich die Anfrage mit dem URI-Suffix htm. Beachten Sie, dass limit_req zone=one burst=5 nodelay;

Wobei zone=one der vorherigen Definition entspricht.

Das Wort Burst wird im Internet oft als Spitzenwert bezeichnet. Durch persönliche Experimente habe ich jedoch festgestellt, dass dies nicht genau ist. Es sollte die Länge der Pufferwarteschlange genannt werden.

Nodelay bedeutet wörtlich „keine Verzögerung“. Konkret bedeutet es, dass Benutzeranfragen nicht verzögert, sondern sofort verarbeitet werden. Beispielsweise beträgt die Rate, die ich oben definiert habe, 1r/s, was bedeutet, dass nur eine Anfrage pro Sekunde verarbeitet wird. Wenn zwei Anfragen mit dem Suffix htm gleichzeitig eingehen und nodelay gesetzt ist, werden diese beiden Anfragen sofort verarbeitet. Wenn Nodelay nicht festgelegt ist, wird die Konfiguration Rate=1r/s strikt durchgesetzt, das heißt, es wird nur eine Anforderung verarbeitet und dann in der nächsten Sekunde die nächste Anforderung. Intuitiv bleiben die Seitendaten hängen und das Laden dauert eine Sekunde.

Die Konfigurationen, die zur Strombegrenzung wirklich funktionieren, sind Rate=1r/s und Burst=5. Lassen Sie uns unten einen konkreten Fall analysieren.

Zu einem bestimmten Zeitpunkt treffen zwei Anfragen gleichzeitig bei nginx ein, von denen eine verarbeitet und die andere in die Pufferwarteschlange gestellt wird. Obwohl nodelay so konfiguriert ist, dass die zweite Anfrage sofort verarbeitet wird, belegt es dennoch eine bestimmte Länge der Pufferwarteschlange. Wenn in der nächsten Sekunde keine Anfrage eingeht, wird der durch die Burst-Länge belegte Speicherplatz freigegeben. Andernfalls wird der Burst-Speicherplatz weiterhin belegt, bis der Burst-Speicherplatz mehr als 5 belegt. Dann werden weitere Anfragen von nginx direkt abgelehnt und ein Fehlercode 503 zurückgegeben.

Man erkennt, dass, wenn in der zweiten Sekunde noch zwei weitere Anfragen eingehen, eine der Anfragen einen weiteren Burst-Platz belegt. In der dritten Sekunde, der vierten Sekunde und der fünften Sekunde kommen jede Sekunde zwei Anfragen herein. Obwohl beide Anfragen verarbeitet werden (weil Nodelay konfiguriert ist), belegt eine der Anfragen immer noch eine Burst-Länge. Nach fünf Sekunden ist die gesamte Burst-Länge = 5 belegt. Innerhalb der sechsten Sekunde kamen zwei weitere Anfragen, eine davon wurde abgelehnt.

Dies ist meine Schlussfolgerung, die auf tatsächlichen Testergebnissen basiert. Sie kann von der tatsächlichen Theorie abweichen, aber ich denke, dass sie auf diese Weise leichter zu verstehen ist. Wer die Antwort weiß, darf sie mir gerne mitteilen!

Die hier verwendete $binary_remote_addr wird verwendet, wenn zwischen dem Client und nginx keine Proxy-Schicht vorhanden ist. Wenn Sie CDN vor nginx konfigurieren, ist der Wert von $binary_remote_addr die IP-Adresse von CDN. Es ist nicht richtig, den Durchfluss zu begrenzen. Zur Strombegrenzung muss die tatsächliche IP-Adresse des Benutzers ermittelt werden.

Eine kurze Beschreibung lautet wie folgt:

## Holen Sie sich hier die IP-Adresse des ursprünglichen Benutzers map $http_x_forwarded_for $clientRealIp {
"" $remote_addr;
~^(?P<ersteAdresse>[0-9\.]+),?.*$$ersteAdresse;
}

## Begrenzen Sie die ursprüngliche Benutzer-IP-Adresse limit_req_zone $clientRealIp zone=one:10m rate=1r/s;

In ähnlicher Weise können wir das Limit-Modul verwenden, um den Fluss von Webcrawlern zu begrenzen.

http-Modul

limit_req_zone $anti_spider Zone=Anti_Spider:10m Rate=1r/s;

Servermodul

Standort / {

limit_req Zone=Anti-Spider-Burst=2 Knotenabstand;
if ($http_user_agent ~* "spider|Googlebot") {
setze $anti_spider $http_user_agent;
}

}

Sie können es mit curl -I -A "Baiduspider" testen www.remotejob.cn/notice.jsp

Die obige Methode zur Verwendung von limit_req_zone in Nginx zum Beschränken des Zugriffs auf dieselbe IP ist der gesamte Inhalt, den der Editor 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:
  • Nginx-Limit-Methode zum Beschränken des Zugriffs auf Module
  • So implementieren Sie eine verteilte Strombegrenzung mit Nginx
  • Die aktuellen Einschränkungen von Nginx in einem Artikel verstehen (einfache Implementierung)
  • Eine vollständige Analyse verschiedener Situationen, in denen der Nginx-Server den IP-Zugriff einschränkt
  • Nginx begrenzt die Anzahl der Besuche und Anfragen an eine bestimmte IP im gleichen Zeitraum. Beispielcode
  • Detaillierte Erläuterung der Verbindungslimitkonfiguration von Nginx für IP-Adressen in einem Netzwerksegment
  • Beispiel für das Festlegen der limit_req-Ratenbegrenzung in nginx

<<:  So implementieren Sie Parallelitätskontrolle in JavaScript

>>:  So verwenden Sie den temporären MySQL 5.7-Tablespace, um Fallstricke zu vermeiden

Artikel empfehlen

Beispielcode für CSS-Stacking und Z-Index

Kaskadierung und kaskadierende Ebenen HTML-Elemen...

Detaillierte Erklärung der Beziehung zwischen React und Redux

Inhaltsverzeichnis 1. Die Beziehung zwischen Redu...

Implementierung der Breakpoint-Wiederaufnahme im Vue-Video-Player

In einem aktuellen Projekt musste ich die Funktio...

JavaScript implementiert kreisförmigen Fortschrittsbalkeneffekt

In diesem Artikelbeispiel wird der spezifische Ja...

So verwenden Sie Standardwerte für Variablen in SASS

Bei in SASS definierten Variablen überschreibt de...

Beschreiben Sie kurz die MySQL InnoDB-Speicher-Engine

Vorwort: Die Speicher-Engine ist der Kern der Dat...

Grundlegende Nutzungsdetails zur Vue-Komponentenbildung

Inhaltsverzeichnis 1. Was ist Komponentenbildung?...

So konfigurieren Sie zwei oder mehr Sites mit dem Apache-Webserver

So hosten Sie zwei oder mehr Sites auf dem belieb...

Erläuterung zum Erstellen der Graphdatenbank neo4j in einer Linux-Umgebung

Neo4j (eines der NoSQL-Modelle) ist eine leistung...

Lösung für den 1045-Fehler in der MySQL-Datenbank

Wie löst man das Problem 1045, wenn die lokale Da...

Einführung in die Verwendung gängiger XHTML-Tags

Es gibt viele Tags in XHTML, aber nur wenige werd...

Zusammenfassung gängiger Befehle in Dockerfile

Syntaxzusammensetzung: 1 Anmerkungsinformationen ...

Erfahren Sie mehr über MySQL-Indizes

1. Indexierungsprinzip Indizes werden verwendet, ...