So begrenzen Sie die Anzahl der Verbindungen (Anfragen) in NGINX
NGINX wird mit verschiedenen Modulen ausgeliefert, mit denen Benutzer den Datenverkehr zu ihren Websites, Webanwendungen und anderen Webressourcen steuern können. Einer der Hauptgründe für die Einschränkung des Datenverkehrs oder des Zugriffs ist die Verhinderung von Missbrauch oder Angriffen bestimmter Art, wie z. B. DoS-Angriffe (Denial of Service).
Es gibt drei Hauptmethoden, um die Nutzung oder den Datenverkehr in NGINX einzuschränken:
- Begrenzung der Anzahl der Verbindungen (Requests).
- Begrenzung der Anzahl von Anforderungen.
- Begrenzung der Bandbreite.
Die oben genannten NGINX-Traffic-Management-Ansätze können je nach Anwendungsfall so konfiguriert werden, dass sie auf der Grundlage eines definierten Schlüssels begrenzt werden, wobei der häufigste die IP-Adresse eines Clients ist. NGINX unterstützt auch andere Variablen, wie z. B. ein Session-Cookie und viele mehr.
In diesem ersten Teil unserer dreiteiligen Serie werden wir besprechen, wie Sie die Anzahl der Verbindungen in NGINX begrenzen können, um Ihre Websites/Anwendungen zu schützen.
- Wie man die Anzahl der Verbindungen (Anfragen) in NGINX begrenzt – Teil 1
- So begrenzen Sie die Rate von Verbindungen (Anfragen) in NGINX – Teil 2
- Wie man die Bandbreitennutzung in NGINX begrenzt – Teil 3
Beachten Sie, dass NGINX eine Verbindung nur dann als Begrenzung in Betracht zieht, wenn eine Anfrage vom Server verarbeitet wird und der gesamte Anforderungsheader bereits gelesen wurde. Daher werden nicht alle Clientverbindungen gezählt.
Begrenzung der Anzahl von Verbindungen in NGINX
Zuerst müssen Sie mithilfe der Direktive limit_conn_zone eine Shared-Memory-Zone definieren, in der Verbindungsmetriken für verschiedene Schlüssel gespeichert werden. Wie bereits erwähnt, kann ein Schlüssel ein Text, eine Variable wie die Remote-IP-Adresse eines Clients oder eine Kombination aus beidem sein.
Diese Direktive, die im HTTP-Kontext gültig ist, akzeptiert zwei Parameter: den Schlüssel und die Zone (im Format zone_name:size).
limit_conn_zone $binary_remote_addr zone=limitconnbyaddr:20m;
Um einen Antwortstatuscode festzulegen, der an abgelehnte Anforderungen zurückgegeben wird, verwenden Sie die Direktive limit_conn_status, die einen HTTP-Statuscode als Parameter akzeptiert. Sie ist im HTTP-, Server- und Standortkontext gültig.
limit_conn_status 429;
Um Verbindungen einzuschränken, verwenden Sie die Direktive limint_conn, um die zu verwendende Speicherzone und die maximale Anzahl zulässiger Verbindungen festzulegen, wie im folgenden Konfigurationsausschnitt gezeigt. Diese Anweisung ist im HTTP-, Server- und Standortkontext gültig.
limit_conn limitconnbyaddr 50;
Hier ist die vollständige Konfiguration:
upstream api_service {
server 127.0.0.1:9051;
server 10.1.1.77:9052;
}
limit_conn_zone $binary_remote_addr zone=limitconnbyaddr:20m;
limit_conn_status 429;
server {
listen 80;
server_name testapp.linux-console.net;
root /var/www/html/testapp.linux-console.net/build;
index index.html;
limit_conn limitconnbyaddr 50;
#include snippets/error_pages.conf;
proxy_read_timeout 600;
proxy_connect_timeout 600;
proxy_send_timeout 600;
location / {
try_files $uri $uri/ /index.html =404 =403 =500;
}
location /api {
proxy_pass http://api_service;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Speichern Sie die Datei, und schließen Sie sie.
Überprüfen Sie dann, ob die NGINX-Konfiguration in Ordnung ist, indem Sie den folgenden Befehl ausführen:
$ sudo nginx -t
Laden Sie als Nächstes den NGINX-Dienst neu, um die letzten Änderungen zu übernehmen:
$ sudo systemctl reload nginx
Überprüfen des Nginx-Verbindungslimits
Wenn ein Client die maximale Anzahl zulässiger Verbindungen überschreitet, gibt NGINX den Fehler "429 Too many requests" an den Client zurück und registriert einen Eintrag wie den folgenden in der Fehlerprotokolldatei:
2022/03/15 00:14:00 [error] 597443#0: *127 limiting connections by zone "limitconnbyaddr", client: x.x.x.x, server: testapp.tecmimt.com, request: "GET /static/css/main.63fdefff.chunk.css.map HTTP/1.1", host: "testapp.tecmimt.com"
Begrenzen der Anzahl von Nginx-Verbindungen zur Anwendung
Sie können auch die Anzahl der Verbindungen für einen bestimmten Server begrenzen, indem Sie die Variable $server_name verwenden:
upstream api_service {
server 127.0.0.1:9051;
server 10.1.1.77:9052;
}
limit_conn_zone $server_name zone=limitbyservers:10m;
limit_conn_status 429;
server {
listen 80;
server_name testapp.linux-console.net;
root /var/www/html/testapp.linux-console.net/build;
index index.html;
limit_conn limitbyservers 2000;
#include snippets/error_pages.conf;
proxy_read_timeout 600;
proxy_connect_timeout 600;
proxy_send_timeout 600;
location / {
try_files $uri $uri/ /index.html =404 =403 =500;
}
location /api {
proxy_pass http://api_service;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Diese Konfiguration ermöglicht es NGINX, die Gesamtzahl der Verbindungen mit dem virtuellen Server, der die Anwendung testapp.linux-console.net, auf 2000 Verbindungen zu begrenzen.
Hinweis: Das Einschränken von Verbindungen basierend auf der IP eines Clients hat einen Nachteil. Es kann sein, dass Sie die Verbindungen für mehr als nur einen Benutzer einschränken, insbesondere wenn sich viele Benutzer, die auf Ihre Anwendung zugreifen, im selben Netzwerk befinden und hinter einer NAT arbeiten – alle ihre Verbindungen stammen von derselben IP-Adresse.
In einem solchen Szenario können Sie eine oder mehrere in NGINX verfügbare Variablen verwenden, die einen Client auf Anwendungsebene identifizieren können, z. B. ein Sitzungscookie.
Die folgenden Artikel zum Thema Nginx könnten Ihnen auch gefallen:
- So erstellen Sie eine benutzerdefinierte 404-Fehlerseite in NGINX
- So steuern Sie den Zugriff basierend auf der Client-IP-Adresse in NGINX
- So cachen Sie Inhalte in NGINX
- So aktivieren Sie HTTP/2.0 in Nginx
- So verwenden Sie Nginx als HTTP Load Balancer unter Linux
Das war's fürs Erste! Im nächsten Teil dieser Serie werden wir eine weitere nützliche Technik des Verkehrsmanagements in NGINX besprechen – die Begrenzung der Anfragerate. Bis dahin, bleiben Sie bei uns.

