Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Wie Nginx HTTP-Ressourcenanforderungen begrenzt

Wie Nginx HTTP-Ressourcenanforderungen begrenzt

王林
王林nach vorne
2023-05-17 12:16:06980Durchsuche

Voraussetzung: nginx muss über die Module ngx_http_limit_conn_module und ngx_http_limit_req_module verfügen. Sie können den Befehl 2>&1 nginx -v | verwenden, um zu überprüfen, ob entsprechende Module vorhanden sind zwei Module.

Die Testversion ist: Nginx-Version ist 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 des gemeinsam genutzten Speicherbereichs (des Worker-Prozesses) festzulegen wird diesen Bereich nutzen, um den Schlüsselwertzähler zu teilen). Der erste Parameter gibt den Ausdruck an, der als Schlüssel ausgewertet werden soll. Der zweite Parameter Zone gibt den Namen und die Größe der Zone an:

limit_conn_zone $binary_remote_addr zone=addr:10m;

2 Verwenden Sie die limit_conn-Direktive im Kontext von location {}, server {} oder http {}, um den Grenzwert anzuwenden Über dem Regionsnamen ist der zweite Parameter die Anzahl der zulässigen Verbindungen für jeden Schlüssel:

location /download/ {
 limit_conn addr 1;
}

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

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

 server {
 limit_conn servers 1000;
 }
}

Anfragerate begrenzen

Ratenbegrenzung kann verwendet werden, um DDoS- und CC-Angriffe zu verhindern oder um zu verhindern, dass Upstream-Server mit zu vielen Anfragen gleichzeitig überflutet werden. Diese Methode basiert auf dem Leaky-Bucket-Algorithmus, bei dem Anfragen mit unterschiedlichen Raten am Bucket ankommen und den Bucket mit einer festen Rate verlassen. Bevor Sie die Ratenbegrenzung verwenden, müssen Sie die globalen Parameter des „Leaky Bucket“ konfigurieren:

  • key – ein Parameter, der zur Unterscheidung eines Clients von einem anderen verwendet wird, normalerweise eine Variable

  • shared Memory Zone – enthält diese Schlüssel Name und Größe des Bereichs des Schlüsselstatus (d. h. des „Leaky Bucket“), angegeben in

  • rate – Anfragen pro Sekunde (r/s) oder Anfragen pro Minute (r/m) („Leaky Bucket Draining“) Anfrage Tarifbegrenzung. „Anfragen pro Minute“ gibt eine Rate von weniger als einer Anfrage pro Sekunde an.

Diese Parameter werden mit der limit_req_zone-Direktive festgelegt. Diese Direktive ist auf der http-{}-Ebene definiert – dieser Ansatz ermöglicht die Anwendung verschiedener Regionen und das Anfordern von Überlaufparametern auf verschiedene Kontexte:

http {
 #...

 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
}

Mit dieser Konfiguration wird eine gemeinsam genutzte Speicherregion mit einer Größe von 10 MByte und dem Namen Eins erstellt. Dieser Bereich enthält den Status der Client-IP-Adresse, die mithilfe der Variablen $binary_remote_addr festgelegt wurde. Beachten Sie, dass $remote_addr auch die IP-Adresse des Clients enthält, während $binary_remote_addr eine kürzere binäre Darstellung der IP-Adresse enthält.

Die optimale Größe des gemeinsam genutzten Speicherbereichs kann anhand der folgenden Daten berechnet werden: $binary_remote_addr Die Wertgröße einer IPv4-Adresse beträgt 4 Bytes, und der Speicherstatus auf 64-Bit-Plattformen nimmt 128 Bytes ein. Daher nehmen Statusinformationen für etwa 16.000 IP-Adressen 1 MB dieses Bereichs ein.

Wenn der Speicherplatz erschöpft ist, wenn Nginx neue Einträge hinzufügen muss, werden die ältesten Einträge gelöscht. Wenn der freigegebene Speicherplatz immer noch nicht ausreicht, um den neuen Datensatz aufzunehmen, gibt nginx den Statuscode „Dienst nicht verfügbar“ 503 zurück, der mit der Direktive limit_req_status neu definiert werden kann.

Sobald diese Zone festgelegt ist, können Sie die Anforderungsrate mithilfe der limit_req-Direktive an einer beliebigen Stelle in der Nginx-Konfiguration begrenzen, insbesondere bei Server {}, Standort {} und http {}. Kontext:

http {
 #...

 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

 server {
 #...

 location /search/ {
  limit_req zone=one;
 }
 }
}

Mit der obigen Konfiguration befindet sich Nginx in / Suche Unter der Route / wird nicht mehr als 1 Anfrage pro Sekunde verarbeitet, und die Verarbeitung dieser Anfragen wird so verzögert, dass die Gesamtrate nicht höher als die festgelegte Rate ist. Nginx verzögert die Verarbeitung solcher Anfragen, bis der „Bucket“ (gemeinsam genutzter Bucket eins) voll ist. Bei Anfragen an den vollständigen Bucket antwortet Nginx mit dem Fehler „Dienst nicht verfügbar“ 503 (wenn limit_req_status keinen benutzerdefinierten Statuscode hat).

Bandbreite begrenzen

Um die Bandbreite pro Verbindung zu begrenzen, verwenden Sie die folgende limit_rate-Anweisung:

location /download/ {
 limit_rate 50k;
}

Mit dieser Einstellung können Clients Inhalte mit bis zu 50.000/s über eine einzelne Verbindung herunterladen. Allerdings können Clients mehrere Verbindungen öffnen, um dieses Limit zu umgehen. Wenn das Ziel darin besteht, Download-Geschwindigkeiten über einem bestimmten Wert zu verhindern, sollte daher auch die Anzahl der Verbindungen begrenzt werden. Zum Beispiel eine Verbindung pro IP-Adresse (bei Verwendung der oben angegebenen Shared-Memory-Region):

location /download/ {
 limit_conn addr 1;
 limit_rate 50k;
}

Um ein Limit erst festzulegen, nachdem der Client eine bestimmte Datenmenge heruntergeladen hat, verwenden Sie die Direktive limit_rate_after. Es könnte sinnvoll sein, dem Client das schnelle Herunterladen einer bestimmten Datenmenge (z. B. Dateikopf – Filmindex) zu ermöglichen und die Geschwindigkeit zu begrenzen, mit der die restlichen Daten heruntergeladen werden (wodurch der Benutzer den Film ansieht, anstatt ihn herunterzuladen).

limit_rate_after 500k;
limit_rate 20k;

Das folgende Beispiel zeigt eine kombinierte Konfiguration zur Begrenzung der Anzahl der Verbindungen und der Bandbreite. Die maximal zulässige Anzahl von Verbindungen ist auf 5 Verbindungen pro Client-Adresse festgelegt, was in den meisten Fällen funktioniert, da moderne Browser normalerweise maximal 3 Verbindungen gleichzeitig geöffnet haben. Gleichzeitig erlaubt der zum Download bereitgestellte Speicherort nur eine Verbindung:

http {
 limit_conn_zone $binary_remote_address zone=addr:10m

 server {
 root /www/data;
 limit_conn addr 5;

 location / {
 }

 location /download/ {
  limit_conn addr 1;
  limit_rate_after 1m;
  limit_rate 50k;
 }
 }
}

Das obige ist der detaillierte Inhalt vonWie Nginx HTTP-Ressourcenanforderungen begrenzt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen