Squid: acelera tu web con un proxy-caché multiplataforma

El rendimiento es una de las cualidades más importantes en una buena web, ya que, a menudo, los usuarios abandonan una página con tiempos de carga excesivos antes siquiera de haber podido apreciar la calidad del contenido que alberga. Desde 2010, la velocidad de la página o pagespeed, se incluye entre los factores de ranking de Google como componente de la experiencia de usuario (UX). Esto hace necesario dedicar algo de atención a la optimización de la velocidad de carga de una página web, especialmente cuando se es administrador. Entre otras posibilidades, esto se logra comprimiendo las imágenes, comprimiendo u optimizando archivos de código o reduciendo el número de peticiones.

Otra forma de mejorar el rendimiento de una web y de reducir la carga del servidor, consiste en instalar un servidor proxy inverso que haga de intermediario entre el navegador y el servidor web, procesando las peticiones del navegador en su nombre y entregando contenido estático, que ha almacenado de manera autónoma, sin necesidad de solicitarlo al servidor principal. Esto resulta especialmente efectivo cuando el servidor ha de generar dinámicamente una misma página una y otra vez aunque no experimente cambios. Entre las soluciones más populares para implementar un servidor proxy-caché de este tipo se encuentra el programa libre Squid.

¿Qué es Squid?

Squid es un software de servidor proxy publicado por Duane Wessels en 1998 como la última versión pre-comercial del Harvest object cache, nombrándolo así para diferenciarlo de la rama principal NetCache, cuyo desarrollo no se ha continuado. Squid está licenciado bajo una GNU General Public License y soporta, entre otros, los protocolos HTTP, HTTP/2, HTTPS y FTP.

Los servidores Squid funcionan en los sistemas operativos habituales, como son diversas distribuciones Linux o sistemas Mac OS X y Windows, bien con la herramienta de comandos propia del dispositivo o a través de una interfaz gráfica como GAdmin-SQUID o SquidMan.

Squid es usado como proxy-caché por miles de administradores web. Wikipedia, sin ir más lejos, utilizó durante años varios servidores proxy Squid para entregar los contenidos, con el objetivo de descongestionar la base de datos y el servidor web. Asimismo, el hecho de soportar el protocolo HTTPS lo hace idóneo para establecer conexiones SSL seguras. En otro ámbito, los proveedores de Internet también lo utilizan como proxy transparente con la finalidad de optimizar el acceso a Internet. Naturalmente, también se puede utilizar como proxy de reenvío (forward proxy) para un único cliente, de tal forma que la propia dirección IP se oculta y se obtiene así una protección adicional que se suma al filtrado de paquetes del cortafuegos. La extensión SquidGuard permite filtrar paquetes de forma autónoma.

Por qué deberías implementar un servidor proxy Squid

Software libre desde su primera versión, el código fuente de Squid está disponible públicamente y no requiere el pago de una licencia, lo que significa que no solo se descarga de forma gratuita sino que se puede modificar para ajustarlo a las necesidades de cada caso particular. Sin embargo, no suele ser necesario introducir cambios debido a la diversidad y a la mejora de la velocidad que ofrece Squid, producto de la longeva experiencia de los desarrolladores que se ocupan por vocación de la gestión y el desarrollo del programa del proxy.

También en el ámbito privado se demuestran las ventajas de instalar un servidor proxy Squid gracias a la listas definibles de control de acceso (Access Control Lists) que permiten, por un lado, bloquear el acceso a determinados contenidos o limitar el ancho de banda que se puede utilizar y, por otro, analizar los logfiles del proxy para controlar el tráfico de datos.

Otro aspecto relevante de Squid es su gran flexibilidad, de la cual se benefician especialmente las redes más complejas, de tal forma que permitiría construir un combinado de servidores proxy-caché Squid interconectados, entre los que se distribuirían las peticiones. Este conjunto de servidores descarga a cada uno de los componentes y aumenta enormemente la seguridad ante caídas. De la misma forma que en una red de entrega de contenido, cada uno de los servidores proxy inversos pueden encontrarse localizados en diferentes lugares.

¿Cómo funciona el caching de un servidor Squid?

Las funciones de seguridad y de control mencionadas son una muestra de la diversidad de los campos de aplicación de un servidor Squid, pero como convence en primera instancia es por su función principal de servidor proxy-caché para el almacenamiento temporal de datos. Para garantizar la actualidad y la disponibilidad de estos datos, Squid calcula su estado cada cierto tiempo, siendo posibles dos resultados: que el objeto examinado sea actual (fresh) o esté obsoleto (stale). Para evitar tener que comprobar siempre el conjunto de datos al completo, un algoritmo calcula la frecuencia con la que es necesario verificar el estado de cada objeto. En esta evaluación se considera la siguiente información:

LM Last modified; información en el encabezado que revela la fecha de la última modificación
EX Expire; información en el encabezado con la fecha de expiración de un objeto
NOW Fecha actual
OBJ_Date Fecha en que el objeto se almacenó en el caché de Squid o la del último cambio
MIN Mínimo de permanencia en el caché
MAX Máximo de permanencia en el caché
PERCENT Factor de permanencia
Obj_Age Describe el tiempo que hace que un objeto está en el caché (NOW - OBJ_Date)
LM_Age Antigüedad de un objeto en el momento del almacenamiento en caché (OBJ_Date - LM)
LM_FACTOR Factor de antigüedad (Obj_Age / LM_Age)

Si queremos averiguar hasta cuándo (X) tiene vigencia un objeto en el caché, se utiliza esta fórmula:

X = OBJ_Date + (LM_Age * PERCENT)

Este algoritmo de caching hace que el control del servidor Squid sobre el estado de un objeto aumente si el objeto experimenta cambios frecuentes. El momento donde comienza la evaluación es entonces MIN, es decir, la fecha mínima asignada para la permanencia en el caché. Más tarde, cuando se alcance la fecha máxima para la permanencia o MAX, Squid no tiene más remedio que establecer contacto con el servidor web. Para ello, el software del proxy envía una petición GET con la información If Modified Since que incluye la fecha OBJ_DATE. El servidor web verifica el estado del objeto y puede enviar dos respuestas:

  • El código de estado 304 (not modified) si el objeto no ha sufrido cambios,
  • El código de estado 200 (ok), así como el objeto nuevo y modificado.

De esta forma solo se transmiten datos si han cambiado realmente.

Requisitos de hardware para instalar un Squid

Cuando se quiere utilizar un proxy inverso Squid la primera tarea consiste en comprobar que se dispone de las estructuras de hardware necesarias. Un proxy-caché no tiene necesidades especiales en cuanto a la potencia del procesador, pero sí depende de una adecuada capacidad de almacenamiento en la unidad de disco duro y de memoria y, dado que hoy en día son componentes muy asequibles, su adquisición es más una cuestión del cálculo correcto que del precio. En primer lugar, calcula la necesidad de espacio de memoria del proyecto, dejando algo de margen para el crecimiento potencial y, en segundo, decántate por componentes modernos de hardware como las unidades en estado sólido SSD, caracterizadas por unos tiempos de acceso reducidos que garantizan la optimización idónea de la velocidad de tu web.

Manual de instalación de Squid

En general, se puede escoger entre dos opciones a la hora de instalar el software de Squid. Se puede optar por la primera si Squid está incluido en la gestión de paquetes de la distribución que se está usando. Si lo está, la instalación del programa proxy tiene lugar por medio de líneas de comando según el conocido patrón:

sudo apt-get update
sudo apt-get install squid

La segunda variante pasa por la descarga de los archivos de instalación, que se extraen y se compilan también según lo habitual (en el ejemplo se ha seguido la versión 3.5.20):

tar xzf squid-3.5.20.tar.gz
cd squid-3.5.20
./configure
make

Una vez descargado, la instalación se inicia con la orden:

make install

Desde la versión 3.5 existe un paquete de instalación MSI no oficial para sistemas Windows de 64 bit que se ejecuta por doble clic tras su descarga.

Hay que mencionar que por cada versión estable publicada existen una versión beta y una de desarrollo con prestaciones nuevas. Sin embargo, la razón de ser de estas dos versiones es precisamente la de probar estas funciones nuevas, por lo que no deberías recurrir a ellas a no ser que conozcas muy bien el software de Squid.

Cómo configurar Squid para acelerar una página web

Para definir el tipo de proxy que ha de personificar Squid se utiliza el archivo de configuración squid.conf, que suele encontrarse de forma predeterminada en /etc o en /usr/local/squid/etc/ (o en el directorio que hayas especificado durante la instalación). Algunos ajustes ya están definidos por defecto en líneas de comando precedidas por el signo de la almohadilla (#). Lo que viene a continuación es una síntesis de las opciones requeridas para instalar Squid.

Opciones de red: # NETWORK OPTIONS

Estos comandos definen las direcciones IP y los puertos relevantes para el funcionamiento del servidor Squid. Las siguientes entradas son clave para el proxy-caché:

http_port

Sintaxis: http_port [Nombre de host o dirección IP:]Número de puerto

Descripción: define el puerto en el que Squid escucha las peticiones HTTP de los clientes, definido de forma estándar como puerto 3128. Si no se introducen ni nombre de host ni dirección IP, los ajustes se aplican a todas las direcciones IP integradas. También es posible introducir varios puertos.

Ejemplo: http_port 192.168.0.1:3128

https_port

Sintaxis: https_port [Dirección IP:]Número de puerto cert=Ruta al certificado SSL [key=Ruta a la clave SSL privada] [options]

Descripción: Si Squid ha de recibir conexiones SSL o TLS es necesario proporcionar el puerto HTTPS, así como también la ruta al certificado utilizado (en formato PEM). Si no se introduce ninguna clave SSL privada, Squid supone que el archivo PEM ya contiene la clave privada. El parámetro options permite introducir opciones extra según la documentación OpenSSL.

icp_port

Sintaxis: icp_port Número de puerto

Descripción: aquí se introduce el puerto en el cual Squid acepta peticiones ICP (Internet Cache Protocol) o recibe paquetes UDP. Solo hay que introducirlo en caso que se usen varios proxies que se han de comunicar entre sí. El puerto estándar es el 3130. Para desactivar la función de introduce el parámetro 0.

Ejemplo: icp_port 3130

Opciones de caching: # OPTIONS WHICH AFFECT THE CACHE SIZE

En las opciones de caching se define si Squid va a utilizar memoria para tareas de caching y, si lo hace, cuánta, o se determina el tamaño mínimo y máximo de los objetos y el comportamiento general de caching.

cache_mem

Sintaxis: cache_mem Espacio de memoria en MB

Descripción: con cache_mem se define el tamaño del disco principal reservado para objetos en tránsito (In-Transit Objects), para objetos muy solicitados (Hot Objects) y para aquellos no cacheables (Negative-Cached Objects). Como estos objetos existen en bloques de 4 KB cada uno, el valor que se introduce aquí ha de ser múltiplo de 4 KB. Esta opción no se ha de confundir con la necesidad global de almacenamiento de Squid, que no se regula de esta forma.

Ejemplo: cache_mem 256 MB

maximum_object_size

Sintaxis: maximum_object_size Tamaño del objeto en KB/MB

Descripción: esta línea informa a Squid sobre el tamaño máximo que han de tener los objetos para poder ser almacenados en el caché. El tamaño mínimo se fija con minimum_object_size.

Ejemplo: maximum_object_size 4 MB

Directorios de caching y de logfiles: # LOGFILE PATHNAMES AND CACHE DIRECTORIES

Junto a la información sobre los puertos y el comportamiento del proxy-caché, Squid también necesita conocer en qué directorio ha de almacenar temporalmente los contenidos y los datos de registro generados.

cache_dir

Sintaxis: cache_dir Tipo de directorio Ruta al directorio Espacio para almacenamiento Número de directorios

Descripción: con cache_dir se define tanto el directorio para caching como su capacidad máxima en Megabyte y el número de directorios y subdirectorios. El tipo de directorio instalado por defecto es ufs. Generalmente, esta opción está desactivada, por lo que ha de activarse primero.

Ejemplo: cache_dir ufs /usr/local/squid/var/cache/squid 100 16 256

cache_log

Sintaxis: cache_log Ruta del archivo

Descripción: especifica el lugar donde se almacena el logfile del servidor Squid, que registra información general sobre el comportamiento del software.

Ejemplo: cache_log /usr/local/squid/var/logs/cache.log

Opciones de acceso: # ACCESS CONTROLS

Por último, los puertos utilizados por Squid requieren listas de acceso definidas claramente. Dos parámetros son especialmente decisivos en este caso:

Acl

Sintaxis: acl Nombre de lista Tipo de lista Argumento

Descripción: este parámetro permite crear una exhaustiva lista de accesos para todas las conexiones HTTP, ICP y TCP. Para obtener una lista completa de tipos y opciones recomendamos asomarse al manual oficial de Squid.

Ejemplo: acl all src 0.0.0.0

http_access

Sintaxis: http_acess allow|deny [!]Nombre de la lista

Descripción: http_acess permite (allow) o deniega (deny) el acceso al puerto HTTP en función de las listas de accesos previamente definidas. Cuando al nombre de la lista precede el signo de admiración, la instrucción afecta a todas las conexiones que no se incluyen en la lista referida.

Ejemplo: htttp_access deny !SSL_ports