Heute habe ich mich mit der Bandbreitenbegrenzung für einzelne Vhosts eines Webservers beschäftigt. Da ich Apache 2.2 einsetze, musste das Modul damit kompatibel sein. www-apache/mod_cband-0.9.7.5 und www-apache/mod_bw-0.7 waren das leider nicht. Es gab jedoch einen Patch  für mod_bw, der das Problem beheben sollte. Ein genauerer Blick auf gentoo-portage.com zeigte mir, dass es bereits eine stable Version 0.8  gibt, welche Apache 2.2 kompatibel ist.

Über emerge -av mod_bw sollte nun die Version 0.8 installieren. Sobald diese installiert ist, muss man in /etc/conf.d/apache2 den mod_bw noch aktivieren. Dazu wird zu den APACHE2_OPTS einfach " -BW" hinzugefügt. Der mod_bw ist jetzt soweit installiert.

Es gibt verschiedene Konfigurationsoptionen für den mod_bw. Unterschied zwischen einer “globalen” und einer Vhost-spezifischen Konfiguration: Die “globale” Konfiguration gilt für alle Vhosts des Apachen. Diese wird in /etc/apache2/modules.d/11_mod_bw.conf gemacht. Darin stehen nach der Installation schon einige Vorschläge zur Konfiguration, allerdings sind diese noch stark ausbaufähig. Die Vhost-spezifische Konfiguration gilt nur für einen Vhost und kann diesen speziell begrenzen.

Die Direktiven in der Übersicht:

  • Bandwidth
  • BandWidthError
  • BandwidthModule
  • BandWidthPacket
  • ForceBandWidthModule
  • LargeFileLimit
  • MaxConnection
  • MinBandwidth

BandWidth

1
BandWidth [Quelle] [bytes/s]

“Quelle” kann verschieden angegeben werden:

  • Voller Hostname
  • Teil einer Domain
  • IP-Adresse
  • Adressbereich (z.B.: 192.168.0.0/24 oder 192.168.0.0/255.255.255.0)

Kommt diese Direktive mehrmals mit verschiedenen Quellen vor, so ist die Reihenfolge entscheidend. Die Reihenfolge ist die Priorität, wobei der erste Eintrag die höchste hat. Beispiel:

1
BandWidth 192.168.0.0/24 10240

Das Netz 192.168.0.0-192.168.0.255 kann maximal mit 10kb/s Daten vom Webserver empfangen

BandWidthError

1
BandWidthError [Error]

Wenn die Maximale Anzahl der Verbindungen (definiert durch MaxConnection) erreicht wird, so wird der HTTP-Error-Code 503 (HTTP_SERVICE_UNAVAILABLE) ausgegeben. Da die meistens Nutzer nicht wissen, aus welchem Grund dies geschieht, kann das nervig sein. Daher kann man hier den Fehlercode festlegen, der dann ausgegeben wird. Beispiel:

1
2
ErrorDocument 510 /errors/maxconexceeded.html
BandWidthError 510

Als ErrorCode wird 510 verwendet und dieser mit einer Fehlerseite versehen

BandwidthModule

1
BandWidthModule [On|Off]

Diese Direktive schaltet das Bandwidth-Modul an (On) oder aus (Off) Beispiel:

1
BandWidthModule On

Einschalten des Modules

BandWidthPacket

1
BandWidthPacket [Size]

Größe der Packete. Besser nicht ändern. Defaultwert: 8092, Werte zwischen 1024 und 131072 sind erlaubt. Zu kleine Werte machen mod_bw langsam (aufgrund des vielen Splittens). Beispiel:

1
BandWidthPacket 8092

Setzt 8092 als Packetgröße

ForceBandWidthModule

1
ForceBandWidthModule [On|Off]

In der Default-Konfiguration wird nicht jeder Request durch mod_bw geleitet. Dadurch kann die Bandbreitenregulation möglicherweise nicht korrekt durchgeführt werden. Diese Direktive piped jeden Request durch mod_bw. Beispiel:

1
ForceBandWidthModule On

Damit wird jeder Request durch mod_bw geleitet

LargeFileLimit

1
LargeFileLimit [Typ] [Minimale Grösse] [bytes/s]

Mit dieser Direktive kann die Dateiendung, sowie eine minimale Größe, aber der die Direktive greifen soll, angegeben werden. Beispiel:

1
LargeFileLimit .avi 500 10240

MaxConnection

1
MaxConnection [Quelle] [Max]

Mit dieser Direktive wird die maximale (Max) Anzahl von Verbindungen aus einer bestimmten Quelle angegeben. Werden mehr Verbindungen aufgebaut, bekommen diese einen HTTP-Status-Code 503 (Service Temporarily Unavailable) oder die in BandWidthError angelegte Fehlerdatei. Beispiel:

1
2
MaxConnection all 20
MaxConnection 192.168.0.0/24 50

Alle Clients aus dem Netz 192.168.0.0/24 erhalten 20b/s, alle anderen 50b/s

MinBandwidth

1
MinBandWidth [Quelle] [bytes/s]

Mit dieser Direktive wird die minimale Geschwindigkeit pro Quell-Host/Range festgelegt. Jeder Client bekommt die festgelegte Rate zugewiesen, egal, wieviel Gesamt-Bandwidth festgelegt wurde. Wenn [bytes/s] auf 0 gestellt, wird der Default-Wert von 256 bytes/s festgelegt. Wird [bytes/s] auf -1 festgelegt, so bekommt jeder Client die Maximal-Bandbreite zugewiesen. Beispiel:

1
2
BandWidth all 102400
MinBandWidth all 50000

Die Bandbreite wird auf 100kb/s festgelegt. Ist nur ein Client verbunden, so bekommt dieser 100kb/s. Verbindet sich ein zweiter, so wird diesem und dem ersten (wie auch allen weiteren) mindestens 50kB/s zugewiesen.

1
2
BandWidth all 50000
MinBandWidth all -1

Jeder Client bekommt eine maximale Bandbreite von 50kb/s zugewiesen

Beispiele befinden sich in der Readme von mod_bw , hier ein Auszug:

1
2
3
4
5
6
7
<Virtualhost *>
  BandwidthModule On
  ForceBandWidthModule On
  Bandwidth all 10240
  MinBandwidth all -1
  Servername test.wolf-u.li
</Virtualhost>

Erklärung: Limitiert alle Clients auf maximal 10kb/s