Logo Baebeca Solutions GmbH
Zum Hauptinhalt springen
Drucken

Fehler 429: Anfragebegrenzung anpassen

Unsere Webserver begrenzen automatisch, wie viele Anfragen eine Website in kurzer Zeit bekommt. Das schützt deine Website und alle anderen auf dem Server vor Bots, Crawlern und Lastspitzen. Wird eine Grenze überschritten, antwortet der Server mit 429 Too Many Requests; nach kurzer Zeit geht es weiter.

Was gezählt wird

Gezählt werden nur Aufrufe von Seiten und Skripten. Bilder, CSS, JavaScript, Schriften, Videos, PDFs, Office-Dokumente und Archive zählen nicht. HTML-, XML-, TXT- und JSON-Adressen zählen mit, weil sie oft PHP erzeugt (Sitemaps, robots.txt, Feeds).

Grenze Standard
je Besucher-IP und Domain 5 Anfragen pro Sekunde, kurzfristig bis zu 60 auf einmal (in einer Minute also bis zu 360)
Crawler und veraltete oder gefälschte Browserkennungen, gemeinsam je Domain 2 Anfragen pro Sekunde, kurzfristig bis zu 20; Google und Bing sind ausgenommen
Domain insgesamt 20 Anfragen pro Sekunde, kurzfristig bis zu 200
Domain gleichzeitig in Bearbeitung 30 Anfragen

Für normale Besucher reicht das mit viel Reserve, auch für Seiten, die viel auf einmal nachladen, wie WordPress-Admin oder Shops. Eng wird es bei vielen Besuchern hinter einer gemeinsamen IP-Adresse (Firmennetz, Mobilfunk), bei Websites mit vielen AJAX-Aufrufen oder einer Schnittstelle und bei großen Shops. Tarnen sich Bots mit aktuellen Browserkennungen, greift die Grenze für die ganze Domain; dann können auch echte Besucher kurz 429 erhalten, der Server und alle anderen Websites bleiben stabil.

Erkennen

In Plesk unter Websites & Domains :: Domain :: Logs stehen abgewiesene Anfragen mit dem Status 429 im nginx-Zugriffsprotokoll und mit „limiting requests“ oder „limiting connections“ im nginx-Fehlerprotokoll. Der Eintrag zone "…" zeigt, welche Grenze gegriffen hat. Steht „dry run“ dabei, wurde nur protokolliert und nichts abgewiesen. Abgewiesene Anfragen erreichen PHP nicht und fehlen deshalb im Apache-Protokoll.

Anpassen

Die Grenzen deiner Domain stellst du selbst ein unter Websites & Domains :: Domain :: Hosting & DNS :: Apache & nginx im Feld Zusätzliche nginx-Direktiven. Plesk prüft die Eingabe beim Speichern und übernimmt sie sofort.

Eine eigene limit_req-Zeile ersetzt alle drei Standardgrenzen für Anfragen pro Sekunde. Trage deshalb immer alle drei Zeilen ein und ändere nur den Wert, der abweichen soll:

# Anfragebegrenzung für diese Domain, immer alle drei Zeilen
limit_req zone=rl_ip_per_domain burst=60 nodelay;
limit_req zone=rl_suspect_per_domain burst=20 nodelay;
limit_req zone=rl_domain_total_20 burst=200 nodelay;

Die gleichzeitigen Anfragen passt du einzeln an, die limit_req-Zeilen brauchst du dafür nicht:

limit_conn rl_domain_total_conn 30;

Die Rate wählst du über die Zone, burst (die Menge, die kurzfristig auf einmal kommen darf) und die Zahl bei limit_conn frei:

Zeile Zone Rate
je Besucher-IP rl_ip_per_domain (Standard)
rl_ip_per_domain_high
5 pro Sekunde
10 pro Sekunde
Crawler und verdächtige Browser rl_suspect_per_domain (Standard)
rl_suspect_per_domain_low
2 pro Sekunde
30 pro Minute
Domain insgesamt rl_domain_total_5, rl_domain_total_10, rl_domain_total_20 (Standard), rl_domain_total_40 5, 10, 20 oder 40 pro Sekunde

Typische Anpassungen

Ziel Zusätzliche nginx-Direktiven
Großer Shop, viele gleichzeitige Besucher limit_conn rl_domain_total_conn 60;
Kleine Website, weniger gleichzeitige Anfragen limit_conn rl_domain_total_conn 15;
Viele AJAX-Aufrufe, Schnittstelle, Kassensystem limit_req zone=rl_ip_per_domain_high burst=100 nodelay;
limit_req zone=rl_suspect_per_domain burst=20 nodelay;
limit_req zone=rl_domain_total_40 burst=200 nodelay;
Website unter Bot-Last limit_req zone=rl_ip_per_domain burst=60 nodelay;
limit_req zone=rl_suspect_per_domain_low burst=5 nodelay;
limit_req zone=rl_domain_total_10 burst=50 nodelay;
limit_conn rl_domain_total_conn 8;
Nur je IP begrenzen, ohne Crawler-Filter und Domain-Grenze limit_req zone=rl_ip_per_domain burst=60 nodelay;
Anfragen pro Sekunde nicht begrenzen (gleichzeitige Anfragen bleiben begrenzt) limit_req zone=rl_off;
Erst testen: nur protokollieren, nichts abweisen limit_req_dry_run on;
limit_conn_dry_run on;

Die gleichzeitigen Anfragen liegen am besten über der Zahl der PHP-Prozesse deiner Website (Plesk unter Hosting & DNS :: PHP bei pm.max_children, Standard 30). Kurze Spitzen warten dann einen Moment bei PHP, statt sofort 429 zu bekommen. Erhöhe pm.max_children bei Überlast nicht: Mehr Prozesse verschärfen das Problem.

Soll deine Domain ganz ohne Begrenzung laufen oder bist du unsicher, welcher Wert passt, schreib uns an support@baebeca.de.

Gesperrte Adressen wie xmlrpc.php beantwortet der Server mit 403 statt 429: Fehler 403: Access denied by server policy.

Inhaltsverzeichnis