Limitar ancho de banda en Apache2
La siguiente explicación tiene en cuenta cualquier distribución basada en Debian y apache 2.
Apache 2 a diferencia de Apache 1, no trae un modulo propio para limitar el ancho de banda. Este es un modulo con dicha funcionalidad que probe.
Notar que este paquete hace conflicto con apache 1.3…Una vez bajado el modulo del sitio lo descomprimimos
tar xzvf mod_bw-0.8.tgz
Luego dentro del directorio del modulo descomprimido, ejecutamos apxs. Apxs es una herramienta para compilar dinámicamente, instala modulos a partir del código fuente creando un DSO y cargandolo dinámicamente en nuestro servidor. Para instalarlo debemos ejecutar
apt-get install apache2-prefork-dev
Hay que notar que existen varias versiones de apxs2, la versión correspondiente para nuestro servidor es según con que módulo de MPM fue compilado, suena complicado pero no alarmase. Para saber con que MPM está compilado su servidor ejecute el siguiente comando
apache2ctl -l
La salida de dicho comando mostrará los modulos que tiene compilado. Mi servidor tiene compilado prefork.
...
mod_logio.c
prefork.c
http_core.c
…
Dentro del directorio descomprimido mod_bw esta el archivo fuente del modulo (*.c), entonces para compilarlo hacemos:
apxs2 -i -a -c mod_bw.c
La opción -i instalar el módulo, -c compilarlo y -a activarlo. Dentro de la salida de dicho mensaje podemos encontrar el siguiente mensaje. Hasta ahora vamos bien
Libraries have been installed in:/usr/lib/apache2/modules
Vamos y verificamos en /usr/lib/apache2/modules si se compilo, debería aparecer como mod_bw.so.
Luego vamos a /etc/apache2/httpd.conf, y ordenamos a Apache que cargue el modulo, utilizamos la directiva LoadModule
LoadModule bw_module /usr/lib/apache2/modules/mod_bw.so
Nota: LoadModule relaciona el nombre de un módulo con una librería que tengamos instalada. En el comando anterior relacionamos el nombre bw_module con la librería mod_bw.so, la cual se encuentra en /usr/lib/apache2/modules.
luego reiniciamos apache para que tome la configuración
/etc/init.d/apache2 force-reload
vamos a /etc/apache2/sites-available
y editamos default o el archivo que tengan sobre su sitio habilitado
Activamos el modulo y forzamos que las solicitudes sean procesadas por él.
BandWidthModule On
ForceBandWidthModule On
Después agregamos las directivas para limitar el ancho de banda, un ejemplo sería:
<Directory "/uploads">
BandWidth all 8096
MaxConnection all 7
</Directory>
Expliquemos un poco cada directiva
BandWidth toma dos parámetros. El primero es de dónde se origina la conexión, la dirección ip, por ejemplo:
192.153.2.0/24
192.153.2.0/255.255.255.0
all
El segundo parámetro indica la velocidad disponible para el origen. Si el parámetro toma el valor 0, el origen no tiene limite de velocidad. La velocidad está expresada en bytes/s.
8 bits = 1 Byte
1024 Bytes = 1 KB
1024 KB = 1 MB
…
El modulo permite varios tipos de directivas interesantes para restringir en función de diferentes parámetros, ahora voy a describir las más interesantes. Todas están directivas, junto con su explicación y ejemplos se pueden obtener del archivo txt que está con el modulo.
Algo que han agregado en la versión 0.8, es la capacidad de limitar de acuerdo al agente del origen de la conexión, un ejemplo sería:
BandWidth "u:^Opera/9(.*)" 10240
BandWidth "u:^Lynx/2.8(.*)" 10240
Toma dos parámetros, el primero hace referencia al agente, y el segundo limita
Algo interesante que tiene este modulo es la capacidad de limitar en función de la extensión del archivo, por ejemplo:
LargeFileLimit .avi 500 10240
El primer parámetro hace referencia a la extensión afectada, también es posible poner .*, afectando a todos. El segundo parámetro es el tamaño mínimo de (los) archivo(s) para que limite. Y el último hace referencia a la velocidad permitida. Estos dos últimos valores se expresan en bytes/s.
Se puede limitar el número de conexiones simultaneas, aquí va un ejemplo de la directiva:
MaxConnection all 30
Toma dos parámetros, el origen de la conexión que puede tomas los mismos valores que en el parámetro de la directiva BandWidth. Y el segundo define el máximo número de conexiones de ese origen. Algo que han agregado en la versión 0.8, que se pude limitar el número de conexiones limitadas según el agente, por ejemplo:
MaxConnection "u:wget" 5
Por último, algo que encontré muy interesante es la capacidad de limitar ciertos directorios, aquí les pongo un ejemplo
<VirtualHost *>BandWidthModule On
BandWidth all 16384
LargeFileLimit .png 5 4096
<Directory “/download”>
LargeFileLimit .png 5 1024
</Directory>
Creería que eso es todo. Como dije al principio del artículo, todas las explicaciones y ejemplos se encuentran en la documentación del modulo
Tags: ancho de banda, Apache, apxs2, limitar, mod_bw