Se me ocurrió crear una caché de paquetes de Debian centralizada, desde donde todos mis servidores actualicen su software. La cuestión es que, teniendo cientos de servidores y sin contar con un proxy HTTP (que haga las veces de caché), al momento de actualizar los sistemas operativos se descargan una y otra vez los mismos paquetes.



Más allá de la cuestión del consumo de ancho de banda, este problema implica tiempo, especialmente cuando se actualizan todos los sistemas en simultáneo. Lo mejor es descargar los paquetes una sola vez y distribuirlos a todos los servidores en la red interna a partir de un servidor local. Esto precisamente es lo que hace un mirror.

Sin embargo, montar un mirror significa replicar uno o más repositorios completos de paquetes de Debian. Algo que a mí no me interesaba. Mi deseo era mantener una copia local sólo de aquellos paquetes actualmente instalados en al menos uno de mis servidores. A tal fin, la solución adecuada es implementar una caché. Para ello se puede utilizar Apache, Nginx, o cualquier otro servidor Web.

Este artículo explica cómo montar una caché de paquetes de Debian utilizando Nginx.

Manos a la obra

Es posible instalar Nginx o utilizar uno ya instalado en cualquier servidor con suficiente espacio en disco.

Editar la configuración del servidor Nginx (nginx.conf). Dentro de la sección "http":


http {

Definir una nueva caché para el módulo ngx_http_proxy_module:

    proxy_cache_path /var/tmp/nginx/cache01
                     levels=1:2
                     keys_zone=cache01:30m
                     max_size=5g
                     inactive=180m
                     use_temp_path=off;

Esta configuración indica que:

  • El directorio donde almacenar los archivos "cacheados" será /var/tmp/nginx/cache01.
  • Se utilizarán dos niveles de directorio en la jerarquía de caché.
  • El nombre de la caché dentro de la configuración de Nginx es "cache01" y puede almacenar hasta 30 megabytes de metadatos. Esto son claves en memoria compartida (RAM), un megabyte puede almacenar hasta 8 mil claves.
  • La caché podrá almacenar hasta 5 gigabytes de archivos en disco. Este es el espacio que utilizarán los paquetes descargados precisamente.
  • Los datos permanecen en caché hasta 180 minutos.
  • Los archivos temporales se almacenan en el directorio mismo de la caché.

Luego es necesario configurar un sitio para cada mirror. Por ejemplo para Debian Jessie utilizo los siguientes repositorios:

deb http://ftp.br.debian.org/debian/ jessie main contrib
deb http://security.debian.org/ jessie/updates main contrib

Esto significa que tengo que definir un sitio para hacer de proxy a "ftp.br.debian.org" y otro para "security.debian.org".

En este ejemplo se utiliza un puerto para cada mirror en el mismo servidor Web con Nginx, donde:

debian-cache.linuxito.com:8090 ---proxy_pass---> security.debian.org
debian-cache.linuxito.com:8091 ---proxy_pass---> ftp.br.debian.org

Se agrega una sección server para hacer de proxy a cada mirror:


    server {
        listen 8090;
        server_name debian-cache.linuxito.com;
        server_tokens off;

        location / {
             proxy_pass http://security.debian.org:80;
             proxy_set_header Host security.debian.org;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_http_version 1.1;

             proxy_cache cache01;
             proxy_cache_revalidate on;
             proxy_cache_min_uses 1;
             proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
             proxy_cache_lock on;
        }
    }

    server {
        listen 8091;
        server_name debian-cache.linuxito.com;
        server_tokens off;

        location / {
             proxy_pass http://ftp.br.debian.org:80;
             proxy_set_header Host ftp.br.debian.org;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_http_version 1.1;

             proxy_cache cache01;
             proxy_cache_revalidate on;
             proxy_cache_min_uses 1;
             proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
             proxy_cache_lock on;
        }
    }

Prestar atención a la configuración de puerto (listen) y proxy (proxy_pass).

El header "Host" no admite una variable, por lo que debe ser configurado de forma estática y es necesario para el correcto funcionamiento de la caché. Luego se setea la IP del cliente en cada solicitud a través de "X-Real-IP", y se utiliza la versión 1.1 del protocolo HTTP.

En el siguiente bloque se indica que se utilice la caché "cache01" con revalidación. Los ítems se almacenan en caché inmediatamente luego del primer acceso (proxy_cache_min_uses). Además se pueden utilizar ítems de caché expirados en caso de errores al acceder al mirror y locks para crear nuevos ítems.

A continuación, crear el directorio destinado a la caché de paquetes:

# mkdir -p /var/tmp/nginx/cache01
# chown www-data:www-data /var/tmp/nginx/cache01
# chmod 0700 /var/tmp/nginx/cache01

Y reiniciar el servidor Web:

# service nginx restart

Configuración de los clientes

En los clientes (servidores que deseamos que hagan uso de nuestra caché de paquetes al momento de actualizarse), modificar la configuración de los repositorios (/etc/apt/sources.list) de acuerdo a la configuración de Nginx:

#deb http://ftp.br.debian.org/debian/ jessie main contrib
#deb http://security.debian.org/ jessie/updates main contrib
deb http://debian-cache.linuxito.com:8091/debian/ jessie main contrib
deb http://debian-cache.linuxito.com:8090/ jessie/updates main contrib

Luego actualizar los repositorios:

root@www:~# apt-get update
Ign http://debian-cache.linuxito.com:8091 jessie InRelease
Hit http://debian-cache.linuxito.com:8090 jessie/updates InRelease
Hit http://debian-cache.linuxito.com:8091 jessie Release.gpg          
Hit http://debian-cache.linuxito.com:8091 jessie Release              
Hit http://debian-cache.linuxito.com:8090 jessie/updates/main amd64 Packages
Hit http://debian-cache.linuxito.com:8090 jessie/updates/contrib amd64 Packages
Hit http://debian-cache.linuxito.com:8090 jessie/updates/contrib Translation-en
Hit http://debian-cache.linuxito.com:8090 jessie/updates/main Translation-en
Hit http://debian-cache.linuxito.com:8091 jessie/main amd64 Packages
Hit http://debian-cache.linuxito.com:8091 jessie/contrib amd64 Packages
Hit http://debian-cache.linuxito.com:8091 jessie/contrib Translation-en
Hit http://debian-cache.linuxito.com:8091 jessie/main Translation-en
Hit http://debian-cache.linuxito.com:8091 jessie/main Translation-es
Reading package lists... Done                  

Notarán que luego del primer acceso, el resto de las actualizaciones se resuelven a una mayor velocidad, pues están almacenados en caché y no es necesario traerlos desde sus respectivos mirrors a través de Internet.

Referencias


Tal vez pueda interesarte


Compartí este artículo