El almacenamiento en caché de proxy funciona almacenando copias de recursos web solicitados con frecuencia en un servidor proxy, lo que permite que las solicitudes posteriores del mismo contenido se sirvan directamente desde la caché en lugar de recuperarlas nuevamente del servidor de origen.
Descripción general del almacenamiento en caché de proxy
Un servidor proxy actúa como intermediario entre un cliente y un servidor de origen. Cuando se configura para el almacenamiento en caché, intercepta las solicitudes del cliente de contenido web (como páginas HTML, imágenes, hojas de estilo o scripts). Si el recurso solicitado se encuentra en el almacenamiento local del proxy y se considera actualizado, el proxy lo sirve inmediatamente. Si no, el proxy reenvía la solicitud al servidor de origen, recupera el recurso, lo sirve al cliente y, simultáneamente, almacena una copia en su caché para uso futuro.
Beneficios del almacenamiento en caché de proxy
La implementación del almacenamiento en caché de proxy ofrece varias ventajas operativas:
- Latencia reducida: El contenido servido desde una caché de proxy geográficamente más cercana llega al cliente más rápido que el contenido recuperado de un servidor de origen distante, lo que mejora el rendimiento percibido de la aplicación.
- Consumo de ancho de banda reducido: Al servir contenido en caché, el proxy minimiza la necesidad de descargar repetidamente los mismos datos a través de enlaces de red externos, conservando el ancho de banda, especialmente para recursos de acceso frecuente.
- Carga reducida en los servidores de origen: El almacenamiento en caché descarga una parte significativa de las solicitudes de los servidores de origen, lo que les permite manejar más solicitudes únicas u operar con menos tensión, lo que puede prevenir sobrecargas y mejorar su capacidad de respuesta.
- Experiencia de usuario mejorada: Los tiempos de carga más rápidos y la entrega de contenido más consistente contribuyen directamente a una mejor experiencia para los usuarios finales.
Cómo funciona la caché de proxy: el flujo de solicitudes
El proceso de almacenamiento en caché implica una serie de pasos:
- Solicitud del cliente: Un cliente (por ejemplo, un navegador web) envía una solicitud HTTP de un recurso al servidor proxy.
- Búsqueda en caché: El servidor proxy recibe la solicitud y verifica su caché local en busca de una copia almacenada del recurso solicitado. La clave de caché se deriva típicamente de la URL y, potencialmente, de otros encabezados de solicitud.
- Acierto de caché (actualizado): Si se encuentra una copia válida y actualizada del recurso en la caché, el proxy sirve inmediatamente esta copia en caché al cliente. Esta es la ruta más rápida.
- Acierto de caché (obsoleto/requiere validación): Si se encuentra una copia pero se considera obsoleta (su tiempo de vida de frescura ha expirado), el proxy inicia una solicitud condicional al servidor de origen. Esta solicitud incluye encabezados de validación como
If-Modified-SinceoIf-None-Match.- Si el servidor de origen responde con
304 Not Modified, la copia en caché sigue siendo válida y el proxy la sirve al cliente, actualizando su información de frescura. - Si el servidor de origen responde con una nueva versión del recurso (
200 OK), el proxy actualiza su caché con el nuevo contenido, lo sirve al cliente y actualiza la información de frescura.
- Si el servidor de origen responde con
- Fallo de caché: Si no se encuentra ninguna copia del recurso en la caché, o si el servidor de origen indica que la copia en caché ya no es válida y envía contenido nuevo, el proxy reenvía la solicitud original del cliente al servidor de origen.
- Respuesta del servidor de origen: El servidor de origen procesa la solicitud y envía el recurso de vuelta al proxy.
- Almacenamiento en caché y entrega: El proxy recibe el recurso del servidor de origen, almacena una copia en su caché (si es elegible para el almacenamiento en caché) y luego reenvía el recurso al cliente.
Invalidación de caché y frescura
Mantener la frescura de la caché es fundamental para garantizar que los clientes reciban contenido actualizado. Los mecanismos de almacenamiento en caché HTTP se basan principalmente en los encabezados de respuesta proporcionados por el servidor de origen.
Encabezados de caché HTTP
Los servidores de origen utilizan encabezados de respuesta HTTP específicos para instruir a los proxies (y a los navegadores cliente) sobre cómo almacenar el contenido en caché:
-
Cache-Control: El encabezado principal y más potente para las directivas de almacenamiento en caché.max-age=<seconds>: Especifica la cantidad máxima de tiempo que un recurso se considera actualizado.no-cache: Obliga al proxy a revalidar la copia en caché con el servidor de origen antes de usarla, incluso si la entrada de caché no está obsoleta. No significa "no almacenar en caché".no-store: Impide que el proxy almacene cualquier parte de la solicitud o respuesta en cualquier caché.public: Indica que el recurso puede ser almacenado en caché por cualquier caché, incluidas las cachés de proxy compartidas.private: Indica que el recurso está destinado a un solo usuario y solo puede ser almacenado en caché por una caché de navegador privada, no por cachés de proxy compartidas.must-revalidate: Fuerza la revalidación con el servidor de origen si la entrada de caché se vuelve obsoleta.proxy-revalidate: Similar amust-revalidate, pero se aplica solo a las cachés de proxy compartidas.
http Cache-Control: public, max-age=3600 Cache-Control: no-cache Cache-Control: no-store -
Expires: Un encabezado HTTP/1.0 más antiguo que especifica una fecha/hora después de la cual la respuesta se considera obsoleta.Cache-Control: max-agetiene prioridad si ambos están presentes.http Expires: Thu, 01 Dec 1994 16:00:00 GMT -
ETag(Etiqueta de entidad): Un identificador opaco asignado por el servidor de origen a una versión específica de un recurso. Si el recurso cambia, se genera un nuevoETag. Los proxies usanETagpara solicitudes condicionales.http ETag: "67ab3246a-543-12345678" -
Last-Modified: Una marca de tiempo que indica cuándo se modificó por última vez el recurso en el servidor de origen. Los proxies usan esto para solicitudes condicionales.http Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT
Solicitudes condicionales
Cuando expira el tiempo de vida de frescura de un recurso en caché, un proxy envía una solicitud condicional al servidor de origen para verificar si el recurso ha cambiado.
-
If-None-Match: Se envía con elETagde la respuesta en caché. Si elETagen el servidor de origen coincide, el servidor responde con304 Not Modified.http GET /images/logo.png HTTP/1.1 Host: example.com If-None-Match: "67ab3246a-543-12345678" -
If-Modified-Since: Se envía con la fechaLast-Modifiedde la respuesta en caché. Si el recurso no se ha modificado desde esta fecha, el servidor responde con304 Not Modified.http GET /styles/main.css HTTP/1.1 Host: example.com If-Modified-Since: Tue, 15 Nov 1994 12:45:26 GMT
Desafíos de la coherencia de la caché
Mantener una coherencia perfecta de la caché (asegurando que todos los clientes siempre reciban la versión absolutamente más reciente de un recurso) puede ser complejo. Las estrategias incluyen:
* TTLs cortos: Sacrificar algo de eficiencia de caché por una mayor frescura.
* APIs de invalidación de caché: Los servidores de origen notifican explícitamente a los proxies para que purguen elementos específicos en caché.
* Cache Busting: Anexar parámetros de consulta únicos (por ejemplo, ?v=123) a las URLs de los recursos que cambian con frecuencia, obligando a los proxies a recuperar nuevas versiones.
Tipos de cachés de proxy
Las cachés de proxy se pueden clasificar según su implementación y propósito:
Caché de proxy de avance (Forward Proxy Cache)
Una caché de proxy de avance se sitúa entre los clientes e internet. Los clientes están configurados explícitamente para usar el proxy. Este tipo de caché es común en las redes empresariales para reducir el ancho de banda de salida y mejorar las velocidades de acceso para los usuarios internos. Actúa en nombre de un grupo de clientes.
Caché de proxy inverso (Reverse Proxy Cache)
Una caché de proxy inverso se sitúa delante de uno o más servidores de origen. Los clientes se conectan al proxy inverso, que luego reenvía las solicitudes al servidor de origen apropiado. El proxy inverso puede almacenar en caché las respuestas de los servidores de origen, descargándolos y mejorando el rendimiento para los clientes externos. Esto se usa a menudo para el equilibrio de carga, la terminación SSL y la entrega de contenido.
Caché de proxy transparente (Transparent Proxy Cache)
Un proxy transparente intercepta las solicitudes del cliente sin ninguna configuración del lado del cliente. El enrutamiento de red se configura para redirigir el tráfico a través del proxy. Los clientes no son conscientes de que están utilizando un proxy. Esto lo utilizan a menudo los ISP o los administradores de red para mejorar el rendimiento general de la red para los usuarios sin necesidad de una configuración individual del dispositivo.
Generación de claves de caché
Para que un proxy almacene y recupere recursos de manera eficiente, debe generar una "clave de caché" única para cada recurso. Esta clave determina si una solicitud posterior coincide con una entrada en caché. Los componentes principales de una clave de caché suelen incluir:
- URL: El esquema, host, puerto, ruta y parámetros de consulta suelen ser el núcleo de la clave de caché.
- Método HTTP: Generalmente, solo se almacenan en caché las solicitudes
GETyHEAD. - Encabezado Vary: Si un servidor de origen responde con un encabezado
Vary(por ejemplo,Vary: Accept-Encoding, User-Agent), el proxy debe incluir los valores de los encabezados de solicitud especificados en su clave de caché. Esto asegura que las diferentes representaciones de un recurso (por ejemplo, comprimido con gzip vs. sin comprimir, móvil vs. escritorio) se almacenen en caché por separado.
Mecanismos de almacenamiento y políticas de desalojo
Las cachés de proxy utilizan varios mecanismos y políticas de almacenamiento:
-
Almacenamiento:
- RAM (Memoria): Acceso más rápido, utilizado para contenido muy popular o metadatos. Capacidad limitada.
- Disco (SSD/HDD): Más lento que la RAM pero ofrece una capacidad mucho mayor. El más común para contenido masivo.
- Híbrido: Combina RAM para metadatos y objetos pequeños de acceso frecuente, y disco para contenido más grande o de acceso menos frecuente.
-
Políticas de desalojo: Cuando se alcanza el límite de almacenamiento de la caché, el proxy debe decidir qué elementos eliminar para hacer espacio para los nuevos. Las políticas comunes incluyen:
- LRU (Least Recently Used - Menos Recientemente Usado): Elimina el elemento que no ha sido accedido durante más tiempo.
- LFU (Least Frequently Used - Menos Frecuentemente Usado): Elimina el elemento que ha sido accedido menos veces.
- FIFO (First-In, First-Out - Primero en Entrar, Primero en Salir): Elimina el elemento más antiguo de la caché.
Consideraciones de configuración
El almacenamiento en caché de proxy eficaz requiere una configuración cuidadosa:
- Tamaño de la caché: Equilibrar el almacenamiento disponible con el volumen de contenido a almacenar en caché. Demasiado pequeño, y las tasas de acierto sufren; demasiado grande, y la E/S del disco puede convertirse en un cuello de botella.
- Valores predeterminados de tiempo de vida (TTL): Establecer duraciones de frescura predeterminadas para los recursos que carecen de encabezados de caché explícitos. Esto es una alternativa y puede afectar la frescura.
- Reglas de omisión: Definir reglas para evitar el almacenamiento en caché de URLs específicas, contenido sensible o recursos dinámicos que nunca deben almacenarse en caché (por ejemplo, puntos finales de API con datos personalizados, sesiones autenticadas).
- Almacenamiento en caché HTTPS: El almacenamiento en caché del tráfico HTTPS es más complejo debido al cifrado. Un proxy a menudo debe descifrar el tráfico (requiriendo su propio certificado y clave SSL) para inspeccionar los encabezados y el contenido de la caché, y luego volver a cifrarlo. Esto se hace típicamente con proxies inversos o proxies de avance explícitos donde los clientes confían en el certificado del proxy. El almacenamiento en caché HTTPS transparente sin descifrado se limita a almacenar en caché solo las respuestas
CONNECT, no el contenido subyacente. - Registro y monitoreo: Esencial para observar las tasas de acierto de la caché, identificar ineficiencias de la caché y solucionar problemas.
Software común de almacenamiento en caché de proxy
Varias soluciones robustas están disponibles para implementar el almacenamiento en caché de proxy:
- Squid: Un proxy de avance y reverso de código abierto ampliamente utilizado con amplias capacidades de almacenamiento en caché.
- Varnish Cache: Un acelerador HTTP de alto rendimiento (proxy inverso) diseñado específicamente para el almacenamiento en caché de contenido web. Conocido por su VCL (Varnish Configuration Language) para políticas de almacenamiento en caché altamente flexibles.
- Nginx: Principalmente un servidor web y proxy inverso, Nginx ofrece sólidas funciones de almacenamiento en caché, especialmente cuando se configura como proxy inverso.
- Apache HTTP Server: Se puede configurar con módulos como
mod_cacheymod_disk_cachepara actuar como un proxy de almacenamiento en caché.