Autorarchive: André P.

Über André P.

Seit einigen Jahren in der IT unterwegs, teile ich nun auch meine Gedanken und Ideen in Form dieses Blogs.

Nginx vor Floods schützen (limit_req)

Nginx bietet mit „limit_req“ eine Funktion, die übermäßige Requests limitiert und so auch dazu eingesetzt werden kann, übermäßige PHP Auslastung zu verhindern.

Eine kurze Definition der Parameter vorab:

Zone: Quasi der Handler für die Limitierung. Es kann ein Limit in MB festgelegt werden. Der Benutzer wird bei mir via „$binary_remote_addr“ identifiziert, was etwa 64 Byte sind. 1 MB kann demnach 16384 Requests speichern. Die Zone kann benannt werden.

Rate: Die Anzahl an Requests, die ein einzelner Besucher pro Sekunde anfragen darf.

Burst: Burst ist sozusagen die Warteschlange für Requests, die das Limit übersteigen. Ist zum Beispiel ein Limit von 3 Requests pro Sekunde eingestellt, der Besucher stellt allerdings 5, so gehen 2 Requests in die Warteschlange und werden eine Sekunde ausgeführt. Stellt der Benutzer allerdings 9 Requests, so würden 3 sofort ausgeführt, gingen in den Burst und einer würde den Burst übersteigen. Das Resultat wäre, dass Nginx den Fehler „503 – Service Temporarily Unavailable“ anzeigt.

Delay: Hiermit wird beschrieben, ob Nginx die „quasi Warteschlange“ des Burst benutzt. „nodelay“ bewirkt, dass beim übersteigen der Requests unverzüglich „503 – Service Temporarily Unavailable“ angezeigt würde.

Zuerst wird die Datei /etc/nginx/nginx.conf geöffnet und eine Zone innerhalb von „http“ erstellt. Die Parameter sind nur Beispiele und sollten entsprechend angepasst werden:

http {
limit_req_zone  $binary_remote_addr  zone=one:3m   rate=7r/s;
...

Jetzt den jeweiligen Server bearbeiten, zum Beispiel „/etc/nginx/sites-available/default“. „limit_req“ muss innerhalb einer Location definiert werden, die das Limit erhält, zum Beispiel:

location / {
limit_req zone=one burst=5
}

Wer Nginx mit fastcgi für PHP benutzt, der kann sein Limit auch auf seine PHP-Scripts limitieren. Dazu wird einfach die vorhandene Location für PHP benutzt, zum Beispiel „location ~ \.php$“.

Achtung: Jedes Objekt stellt einen Request dar. Ein Bild auf einer Website würde also schon zwei Requests bedeuten. Es ist daher schlau, die Requests höher einzustellen oder sich direkt auf die Location für PHP (falls vorhanden) zu beziehen. Wird ein Delay eingesetzt, kann dies dem Besucher die Stimmung durch übermäßige Wartezeiten durchaus vermiesen.
Alternativ kann unterhalb von „limit_req“ mit „limit_req_log_level error;“ das Logging definiert werden, um abgewiesene Verbindungen zu analysieren. Ich persönlich verzichte auf das Delay.

Neueste Pakete von Nginx, PHP und MySQL für Debian (Squeeze, Wheezy)

Mit dem dotdeb Repository lassen sich auch in Debian die neuesten Versionen von (u.a.) Nginx, PHP und MySQL einfach installieren.

Das Repository lässt sich schnell einrichten:

echo "deb http://packages.dotdeb.org wheezy all" > /etc/apt/sources.list.d/dotdeb.list
echo "deb http://packages.dotdeb.org wheezy-php55 all" >> /etc/apt/sources.list.d/dotdeb.list
curl http://www.dotdeb.org/dotdeb.gpg | apt-key add -
apt-get update

„wheezy“ kann durch „squeeze“ ersetzt werden. Ältere Versionen werden nicht unterstützt. Wie man sieht, sind die PHP Pakete optional.

Mehr dazu auf www.dotdeb.org