Mit NGINX können wir die maximalen Verbindungen pro IP auf unseren vHosts beschränken. Das ist zwar keine richtige DDOS-Protection aber mit dieser Methode können wir aggressive Bots oder spielende Kinder etwas in die Schranken weisen.
Grundlage ist ein fertig installierter NGINX-Webserver. Dazu gibt es bereits einen Artikel in dem beschrieben wird wie man NGINX unter CentOS 7 aufsetzt.
Zuerst richten wir unter dem http Block in der nginx.conf eine neue Limit Zone ein.
vi /etc/nginx/nginx.conf
http { ... limit_req_zone $binary_remote_addr zone=noflood:10m rate=10r/s; ... }
Damit erstellen wir eine Limit Zone mit dem Namen noflood diese Zone lässt per IP maximal 10 gleichzeitige Verbindungen innerhalb einer Sekunde zu. Die neue Zone kann 10MB Informationen aufnehmen. 1MB kann 16000 einzelne IP’s der Verbindungsdaten verwalten. Sollte 10MB nicht ausreichen kann man diesen Wert entsprechen ändern.
Um die Zone nun für den vHost zu aktivieren muss diese im betreffenden vHost eingetragen werden.
server { ... location ~ \.php { limit_req zone=noflood burst=15; ... } ... }
Nun ist diese Zone für alle .php-Dateien des vHosts aktiv. Da die CPU und IO-Last meist von den PHP-Prozessen und deren MySQL-Abfragen ausgelastet wird brauchen wir dieses Limit nicht auf die statischen Files auszuweiten deren Auslieferung belastet den Server kaum.
Der Parameter burst gibt an, wie hoch die maximalen Verbindungsanzahl kurzfristig sein darf, nochmals ein kleiner Puffer sozusagen um Spitzen abzufangen.
Genauere Informationen findet man in der Dokumentation zu NGINX unter dem Punkt ngx_http_limit_req_module.