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

CentOS 7 erstellt Hadoop 2.10 mit hoher Verfügbarkeit (HA)

Dieser Artikel beschreibt, wie man einen hochverf...

Detaillierte Erklärung zum effizienten MySQL-Paging

Vorwort Normalerweise wird für MySQL-Abfragen mit...

Node.js+Postman zur Simulation der HTTP-Server- und Client-Interaktion

Inhaltsverzeichnis 1. Node erstellt HTTP-Server 2...

Detaillierter Installationsprozess und Konfiguration von mysql5.7.19 zip

Offizielle Version von MySQL v5.7.19 (32/64-Bit-I...

Detailliertes Tutorial zur Installation von PHP und Nginx auf Centos7

Da die Anwendung von CentOS auf der Serverseite i...

MySQL-Optimierungszusammenfassung – Gesamtzahl der Abfrageeinträge

1. COUNT(*) und COUNT(COL) COUNT(*) führt normale...

Util-Modul im node.js-Tutorial-Beispiel – detaillierte Erklärung

Inhaltsverzeichnis Ausgehend von der Typbeurteilu...

Grundlegende Anweisungen der MySQL-Datendefinitionssprache DDL

MySQL DDL-Anweisungen Was ist DDL, DML. DDL ist e...

W3C Tutorial (2): W3C Programme

Der W3C-Standardisierungsprozess ist in 7 verschi...

Der Unterschied zwischen HTML-Frame, Iframe und Frameset

10.4.1 Der Unterschied zwischen Frameset und Fram...