En el artículo anterior expliqué cómo montar una caché centralizada para paquetes de Debian implementando un proxy en Nginx. En este artículo voy a explicar cómo hacerlo para CentOS (utilizando el mismo servidor que cumple el rol de cache). La configuración de Nginx es casi idéntica, sólo que hay diferencias en la configuración de los clientes, al tratarse de un gestor de paquetes diferente.



A fin de implementar una caché de paquetes para mis servidores CentOS, voy a utilizar la misma caché que para Debian, la cual he llamado "cache01".

Esta está definida dentro de la sección "http" en la configuración del servidor Nginx (nginx.conf):


http {

[...]

    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é.

A fin de implementar el proxy para acceder a un mirror de CentOS, es necesario configurar un único sitio (a diferencia de Debian):

centos-cache.linuxito.com:9090 ---proxy_pass---> centos.xfree.com.ar:80

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


    server {
        listen 9090;
        server_name centos-cache.linuxito.com;
        server_tokens off;

        access_log /var/log/nginx/centos_yum--access.log;
        error_log /var/log/nginx/centos_yum--error.log;

        location / {
             proxy_pass http://centos.xfree.com.ar;
             proxy_set_header Host centos.xfree.com.ar;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             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;
             proxy_cache_valid 200 120m;
        }
    }

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 diferencia del proxy implementado para acceder a los mirrors de Debian, para que la caché funcione al acceder a los repositorios de CentOS es necesario agregar la configuración proxy_cache_valid y el header X-Forwarded-For. Esto se debe a la forma en la que elaboran las respuestas los mirrors de CentOS.

El directorio destinado a la caché de paquetes se crea de forma simple, ejecutando:

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

Reiniciar el servidor Web:

# service nginx restart

Configuración en los clientes

En los clientes (servidores CentOS que deseamos que hagan uso de nuestra caché de paquetes para actualizarse), modificar la configuración de los repositorios (/etc/yum.repos.d/*.repo) de acuerdo a la configuración de Nginx. Básicamente se debe comentar la configuración de mirrors actual y dejar sólo la configuración baseurl apuntando a nuestro proxy:

[base]
name=CentOS-$releasever - Base
baseurl=http://centos-cache.linuxito.com:9090/$releasever/os/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
#baseurl=http://mirrors.dcarsat.com.ar/centos/$releasever/os/$basearch/
#baseurl=http://centos.xfree.com.ar/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

Esto se debe repetir para cada repositorio. Por ejemplo, para la configuración de repositorios base de CentOS 6 (/etc/yum.repos.d/CentOS-Base.repo):

# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the 
# remarked out baseurl= line instead.
#
#

[base]
name=CentOS-$releasever - Base
baseurl=http://centos-cache.linuxito.com:9090/$releasever/os/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
#baseurl=http://mirrors.dcarsat.com.ar/centos/$releasever/os/$basearch/
#baseurl=http://centos.xfree.com.ar/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#released updates 
[updates]
name=CentOS-$releasever - Updates
baseurl=http://centos-cache.linuxito.com:9090/$releasever/os/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
#baseurl=http://mirrors.dcarsat.com.ar/centos/$releasever/updates/$basearch/
#baseurl=http://centos.xfree.com.ar/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
baseurl=http://centos-cache.linuxito.com:9090/$releasever/os/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
#baseurl=http://mirrors.dcarsat.com.ar/centos/$releasever/extras/$basearch/
#baseurl=http://centos.xfree.com.ar/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
baseurl=http://centos-cache.linuxito.com:9090/$releasever/os/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib
baseurl=http://centos-cache.linuxito.com:9090/$releasever/os/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

Luego es posible lanzar una actualización para verificar el funcionamiento:

[root@db1 ~]# yum update
[root@db1 ~]# yum clean all
Cleaning repos: base extras updates
Cleaning up Everything
[root@db1 ~]# yum update
Setting up Update Process
base                                                       | 3.7 kB     00:00
base/primary_db                                            | 4.7 MB     00:03
extras                                                     | 3.7 kB     00:00
extras/primary_db                                          | 4.7 MB     00:00
updates                                                    | 3.7 kB     00:00
updates/primary_db                                         | 4.7 MB     00:00

Referencias


Tal vez pueda interesarte


Compartí este artículo