Ich suche nach einem Ansatz, um geschwindigkeitsbegrenzte IPs zwischen Nginx-Knoten zu synchronisieren. Ich möchte diese IPs protokollieren und sie anschließend in eine Datenbank übertragen und einen Agenten entwickeln, um blockierte IPs in Nginx-Konfigurationsdateien zu aktualisieren.
429
Meine Herausforderung besteht darin, eine Möglichkeit zu finden, Nginx-IPs mit Statuscodes zu begrenzen .
Ist es also möglich, geschwindigkeitsbegrenzte IPs in einer bestimmten Datei in Nginx zu protokollieren, oder schlagen Sie einen anderen Ansatz vor, um geschwindigkeitsbegrenzte IPs zwischen Knoten zu synchronisieren?
Antwort1
Ja, das kann man, und ein ähnliches Beispiel gibt es sogar in derNginx-Dokumentation.
Die access_log
Direktive akzeptiert auch einen optionalen if=
Parameter, der die ihr übergebenen Variablen auswertet und nur dann protokolliert, wenn das Ergebnis nicht 0 oder eine leere Zeichenfolge ist. In Kombination mit der Tatsache, dass Sie mehr als eine access_log
in einer Ebene haben können, können Sie je nach Bedarf unterschiedlich protokollieren.
Zunächst benötigen Sie jedoch eine map
Karte derHTTP-AntwortstatusSie interessieren sich für eine Variable. Denken Sie daran, dass diese außerhalb des Blocks map
liegen muss .server
map $status $rate_limited {
default 0;
429 1;
}
server
Dann deklarieren Sie im entsprechenden Block Ihre access_log
.
access_log /var/log/nginx/rate_limited.log combined if=$rate_limited;
Denken Sie daran, dass jedes Vorkommen von access_log
auf einer Ebene alle anderen auf höheren Ebenen außer Kraft setzt. Sie sollten daher include
die access_log
Anweisungen auf höheren Ebenen, die Sie ebenfalls verwenden möchten, kopieren (oder besser noch ).