Posts Tagged ‘ancho de banda’

Servidor proxy de archivos Debian, Approx

Thursday, January 24th, 2008

Tabla de contenidos

  1. Marco teórico
  2. Funcionamiento de Approx
  3. Instalación y parámetros de configuración de Approx
  4. Papel del sources.list
  5. Armado de las parejas nombre/valor
  6. Reescritura de solicitudes
  7. Problemas frecuentes
  8. Puesta en marcha
  9. Beneficios
  10. Desventajas
  11. Notas finales
  12. Bibliografía

Marco teórico

Si una red local está formada por varios equipos Debian (o fork), un servidor proxy que mantiene repositorios locales de archivos Debian mejoraría el tiempo de respuesta y el uso de ancho de banda.

De esta manera cada vez que un equipo Debian actualice o instale archivos Debian, primero se revisará en el repositorio local, si el archivo se encuentra en él se suministrá, sino se encuentra, se revisará en los repositorios remotos. Estos archivos se guardarán en el repositorio local para futuras solicitudes.

Los repositorios locales, la administración y su gestión es realizado por el servidor proxy. Esta funcionalidad la podemos encontrar con Approx.

Funcionamiento de Approx

Approx permanece escuchando solicitudes de archivos Debian en algún puerto determinado, los clientes piden los archivos a Approx y éste es quién se encarga de buscar localmente el archivo, sino se encuentra, reescribe la solicitud recibida para enviarla a un repositorio remoto y descargar los archivos solicitados, éstos son entregados al cliente y son almacenados en el repositorio local.

Instalación y parámetros de configuración de approx

Primero tenemos que elegir la máquina de nuestra red que será el servidor proxy, una vez definida instalamos en ella el servidor


# aptitude install approx

Cuenta con un único archivo de configuración localizado en /etc/approx y los repositorios locales serán creados en /var/cache/approx. El archivo de configuración es muy pequeño y podemos encontrar los siguientes parámetros

interfaces
Es la interface de red por la cual escucha approx. Por defecto está en any.
port
Es el puerto por el cual approx escucha las solicitudes HTTP de archivos debian. Por defecto es el puerto 9999.
interval
Especifica el tiempo (minutos) en los que approx considerará a un archivo cacheado demasiado viejo, con lo cual antes de entregarlo consultará con el repositorio remoto si es que existe una versión más reciente. Por defecto está en 720 (12 horas).
max_wait
Especifica el tiempo que esperará un proceso approx para bajar archivos concurrentemente, antes de intentar bajar el archivo. (no me queda claro bien este parámetro, acepto ayuda :-P). Por defecto es 10 (segundos).
max_rate
Especifica el máximo de ancho de banda que se utilizará para bajar archivos de repositorios remotos. Con lo cual podemos limitar el ancho de banda utilizado por approx. Por defecto unlimited. Los valores pueden ser indicados con K(KiloBYTE), M(MegaBYTE) y G(GigaBYTE).
debug
Activa un log ubicado en /var/log/debug. Por defecto false.

El resto del archivo de configuración define una tabla hash (clave/valor), los cuales mapean el repositorio local con el repositorio remoto.

Papel del sources.list

Ahora debemos entender (mínimamente) el papel que cumple el archivo sources.list. Cuando se ejecuta, por ejemplo aptitude install mysql-server-5.0, el comando verifica el archivo sources.list (localizado en /etc/apt/) para obtener la dirección del repositorio remoto de archivo, y bajar en este caso mysql-server-5.0.

La sintaxis de un sources.list luce así

deb | deb-src uri distribución [sección1] [sección2] [...]

El primer campo indica el tipo de repositorio, binario (deb) o fuente (deb-source), el segundo, URI es la ubicación del repositorio de dónde obtendrá los archivos (http, ftp, file, etc) y el resto de los campos definen la distribución y tipos de componentes (main, contrib, non-free).

Entonces para poder utilizar el proxy, debemos modificar el sources.list de las máquinas clientes, para que dejen de apuntar a un repositorio remoto y lo hagan a nuestro sevidor proxy. Y el archivo de configuración de approx (approx.conf), tendrá las direcciones de los repositorios remotos de los sources.list’s clientes.

Armado de las parejas nombre/valor

Vamos a definirlas tomando un ejemplo. Tenemos un cliente Debian etch en nuestra LAN con la dirección 192.168.1.5 y el servidor proxy en la dirección 192.168.1.1. Primero tenemos que tomar la dirección que aparece en el sources.list de la máquina Debian, mapearla en el servidor proxy y sustituirla por la dirección del servidor proxy. Por ejemplo, obtendremos las direcciones del sources.list en 192.168.1.1


deb http://sft.if.usp.br/debian/ stable main
deb-src http://sft.if.usp.br/debian/ stable main
deb http://security.debian.org/ stable/updates main

Ahora las mapearemos con el repositorio local, esto se hace en el archivo /etc/approx/approx.conf


debian          http://sft.if.usp.br/debian/
security        http://security.debian.org/

Hemos definido que los archivos de la dirección http://sft.if.usp.br/debian/ se cacheen en el repositorio local llamado debian y los de http://security.debian.org/ en el repositorio llamado security. Estos repositorios se encontrarán en /var/cache/approx.

Ahora sólo falta modificar el sources.list de la máquina 192.168.1.5 para que apunte al proxy


deb http://192.168.1.1:9999/debian stable main
deb-src http://192.168.1.1:9999/debian stable main
deb http://192.168.1.1:9999/security stable/updates main

Lo que hemos hecho fue modificar el servidor remoto por nuestro proxy y además especificamos el repositorio local, el cuál mapea al repositorio remoto.

Reescritura de solicitudes

Ahora veremos como Approx reescribe la solicitude de un cliente utilizando su tabla hash de clave/valor

Archivo sources.list de cliente


deb http://192.168.1.1:9999/clave-repositorio2/  feisty main restricted

Donde el cliente hará solicitudes de la forma

http://192.168.1.1:9999/clave-repositorio2/otra/URL

Archivo approx.conf del servidor (192.168.1.1)


clave-repositorio1     http://sevidor-remoto-a/path
clave-repositorio2     http://sevidor-remoto-b/path
clave-repositorio3     http://sevidor-remoto-c/path

Solicitud armada por el servidor proxy, en caso que la búsqueda falle en el cache local

http://servidor-remoto-b/path/otra/URL

Problemas frecuentes

Es importante aquí entender la idea de hash (clave/valor), las palabras con rectángulo de color verde es una clave que le indica a approx cual dirección remota consultará, la cual se encuentra cacheada en un directorio dentro /var/cache/approx con el mismo nombre. Sino indicamos la clave de mapeo en el sources.list, approx no cacheará correctamente los archivos y desde la máquina cliente nos saldrán errores cómo


Err http://192.168.1.1 stable/main Packages
  403 Forbidden
Err http://192.168.1.1 stable/main Sources
  403 Forbidden
Err http://192.168.1.1 stable/updates/main Packages
  403 Forbidden
Leyendo lista de paquetes... Hecho
W: No se puede leer la lista de paquetes fuente http://192.168.1.1 stable/main Packages (/var/lib/apt/lists/192.168.1.1:9999_dists_stable_main_binary-i386_Packages) - stat (2 No existe el fichero o el directorio)
W: No se puede leer la lista de paquetes fuente http://192.168.1.1 stable/updates/main Packages (/var/lib/apt/lists/192.168.1.1:9999_dists_stable_updates_main_binary-i386_Packages) - stat (2 No existe el fichero o el directorio)
W: No se puede leer la lista de paquetes fuente http://192.168.1.1 stable/main Packages (/var/lib/apt/lists/192.168.1.1:9999_dists_stable_main_binary-i386_Packages) - stat (2 No existe el fichero o el directorio)
W: No se puede leer la lista de paquetes fuente http://192.168.1.1 stable/updates/main Packages (/var/lib/apt/lists/192.168.1.1:9999_dists_stable_updates_main_binary-i386_Packages) - stat (2 No existe el fichero o el directorio)
W: Tal vez quiera ejecutar 'apt-get update' para corregir estos problemas

Puesta en marcha

Una vez instalado y configurado Approx y editado la tabla de mapeo, debemos reiniciar el servidor (/etc/init.d/approx restart). Si al reiniciar falla, a habido un error en la sintaxis tanto de los parámetros o de la tabla. Ahora podríamos hacer una prueba. Desde la máquina Debian, en este caso 192.168.1.5, crearemos el repositorio


root@192.168.1.5:/# aptitude update

Este comando actualizará la lista de archivos disponibles de los servidores fuentes indicados en el sources.list.Veamos la secuencia de llamadas para comprender todo esto

  1. Se verifica el sources.list y se obtiene la dirección hacia donde se hará la solicitud
  2. La solicitud de la lista es escuchada por nuestro servidor proxy
  3. El proxy verifica el repositorio local (/var/cache/approx), en este caso debian y segurity. En esta busqueda no encontrará nada
  4. El proxy deberá solicitar la lista a los servidores remotos
  5. Buscará en su archivo de configuración la dirección de estos, mapeada por las claves anteriores (debian, security).
  6. El proxy solicita el listado al servidor remoto
  7. El listado será cacheado en el repositorio correspondiente para esa dirección
  8. El proxy entrega a 192.168.1.5 el listado

Beneficios

Aquí les dejo unos resultados realizados desde el cliente, no especifico cuestiones técnicas, sólo uno sin servidor proxy y otro con servidor proxy. Debe ser evidente el beneficio de tener un bicho de estos andando.


192.168.1.5:/# aptitude update
Des:1 http://sft.if.usp.br stable Release.gpg [378B]
Des:2 http://sft.if.usp.br stable Release [58,2kB]
Des:3 http://security.debian.org stable/updates Release.gpg [189B]
Des:4 http://security.debian.org stable/updates Release [37,6kB]
Des:5 http://sft.if.usp.br stable/main Packages [5621kB]
Des:6 http://security.debian.org stable/updates/main Packages [277kB]
Des:7 http://sft.if.usp.br stable/main Sources [1653kB]
Descargados 7647kB en 1m26s (88,1kB/s).                                       
Leyendo lista de paquetes… Hecho

192.168.1.5:/# aptitude update
Des:1 http://192.168.1.1 stable Release.gpg [378B]
Des:2 http://192.168.1.1 stable/updates Release.gpg [189B]
Des:3 http://192.168.1.1 stable Release [58,2kB]
Des:4 http://192.168.1.1 stable/updates Release [37,6kB]
Des:5 http://192.168.1.1 stable/main Packages [5621kB]
Des:6 http://192.168.1.1 stable/main Sources [1653kB]
Des:7 http://192.168.1.1 stable/updates/main Packages [277kB]
Descargados 7647kB en 18s (417kB/s).                                          
Leyendo lista de paquetes… Hecho

Desventajas

  • El uso de espacio de disco. No sé si realmente es una desventaja, pero en algunos casos el espacio utilizado por esto repositorios locales puede ser muy grande.
  • Inconsistencias. Nuestro repositorio local podría contener versiones de archivos desactualizadas en comparación con el repositorio remoto. Ya que por defecto el repositorio local es válido por 2 días, pero podríamos ajustar esto con el parámetro interval

Notas finales

Mi red está formada sólo por equipos Debian y Ubuntu. Mi servidor proxy mantiene repositorio tanto de Debian (etch) y de Ubuntu 7.04 y 7.10. Para cada distribución y versión utilizo diferentes palabras claves, ya que cada uno tiene diferentes repositorios locales.

Acá les dejo un fragmento de mi archivo approx.conf


debian-etch          http://sft.if.usp.br/debian/
security-etch        http://security.debian.org/

ubuntu-feisty          http://ar.archive.ubuntu.com/ubuntu/
security-feisty          http://security.ubuntu.com/ubuntu

ubuntu-gutsy          http://archive.canonical.com/ubuntu
security-gutsy          http://security.ubuntu.com/ubuntu/
ubuntu-gutsy          http://archive.ubuntu.com/ubuntu/

Bibliografía

Limitar ancho de banda en Apache2

Wednesday, December 19th, 2007

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