Descripción general del almacenamiento en caché

Una respuesta almacenable en caché es una respuesta HTTP que Cloud CDN puede almacenar y recuperar rápido, lo que permite tiempos de carga más rápidos. No todas las respuestas HTTP pueden almacenarse en caché.

Contenido que se puede almacenar en caché

Cloud CDN almacena en caché solo las respuestas que cumplen con todos los requisitos estipulados en esta sección. El RFC 7234 especifica algunos de estos requisitos, y otros son característicos de Cloud CDN.

Una respuesta puede almacenarse en las memorias caché de Cloud CDN solo si se cumplen todas las condiciones que figuran a continuación:

Atributo Requisito
Entregado por Servicio de backend, depósito de backend o un origen personalizado con Cloud CDN habilitado
En respuesta a Solicitud GET
Código de estado 200203206300301302307410
Directiva de caché Tiene un encabezado Cache-Control con una directiva public
Actualidad Tiene un encabezado Cache-Control con una directiva max-age o s-maxage, o un encabezado Expires con una marca de tiempo en el futuro
Contenido Contiene un encabezado válido Content-Length, Content-Range o Transfer-Encoding

Por ejemplo, un encabezado Content-Length que coincida correctamente con el tamaño de la respuesta
Tamaño Menor o igual que el tamaño máximo

Para los depósitos de backend de Cloud Storage, a continuación se incluyen varias formas de satisfacer estos requisitos:

De forma predeterminada, cuando todo el depósito es público o los objetos individuales son públicos y no especifican los metadatos de control de caché, Cloud Storage asigna a los objetos un encabezado Cache-Control: public, max-age=3600. Puedes establecer diferentes valores mediante metadatos de Cache-Control.

Para ver un ejemplo que muestra cómo configurar un balanceador de cargas HTTP(S) externo con un depósito de backend, consulta Configura un balanceador de cargas con depósitos de backend. Además de los pasos del ejemplo, asegúrate de habilitar Cloud CDN en el servicio de backend.

Tamaño máximo

Cloud CDN aplica un tamaño máximo para cada respuesta. Toda respuesta que tenga un cuerpo mayor que el tamaño máximo no se almacenará en la memoria caché, pero se entregará al cliente.

El tamaño máximo varía en función de si el servidor de origen admite solicitudes de rango de bytes.

El servidor de origen es compatible con solicitudes de rango de bytes El servidor de origen no es compatible con solicitudes de rango de bytes
5 TB (5.497.558.138.880 bytes) 10 MB (10.485.760 bytes)

Casi todos los servidores web modernos (incluidos NGINX, Apache y Varnish) admiten solicitudes de rango de bytes.

Contenido que no se puede almacenar en caché

Hay controles que bloquean el almacenamiento en caché de las respuestas.

Una respuesta no se almacena en caché si no cumple con los requisitos de Contenido que se puede almacenar en caché, o si se cumple alguna de las siguientes condiciones.

Atributo Requisito
Entregado por Servicio de backend, depósito de backend o un origen personalizado que no tenga habilitado Cloud CDN
Cookie Tiene un encabezado Set-Cookie
Directiva de respuesta La respuesta tiene un encabezado Cache-Control con la directiva no-store, no-cache o private
Directiva de solicitud La solicitud tiene un encabezado Cache-Control: no-store
Tamaño Más grande que el tamaño máximo

Es posible que estos requisitos sean flexibles en el futuro, lo que permitiría a Cloud CDN almacenar en caché respuestas adicionales.

Si Cache-Control: no-store, no-cache o private están presentes, pero el contenido todavía se está almacenando en caché, esto se debe a que la firma de URL está configurada. En la siguiente sección, se proporciona información sobre cómo evitar que las respuestas se almacenen en caché.

Evita almacenar en caché

Para evitar que la información privada se almacene en la memoria caché de Cloud CDN, haz lo que se detalla a continuación:

  1. Incluye un encabezado Cache-Control: private en las respuestas que no deben almacenarse en cachés de Cloud CDN o un encabezado Cache-Control: no-store en las respuestas que no deben almacenarse en ninguna caché, ni siquiera en la caché de un navegador web.
  2. No firmes URL que proporcionen acceso a información privada. Cuando se accede al contenido mediante una URL firmada, es potencialmente apto para el almacenamiento en caché, sin importar las directivas Cache-Control en la respuesta.

Claves de caché

Cada entrada de caché en una memoria caché de Cloud CDN se identifica a través de una clave de caché. Cuando una solicitud ingresa a la caché, la memoria caché convierte el URI de la solicitud en una clave de caché y, luego, la compara con las claves de las entradas almacenadas en caché. Si encuentra una coincidencia, la caché muestra el objeto asociado con esa clave.

De forma predeterminada, Cloud CDN usa el URI de solicitud completo como la clave de caché para los servicios de backend. Por ejemplo, https://example.com/images/cat.jpg es el URI completo de una solicitud específica para el objeto cat.jpg. Esta string se usa como la clave de caché predeterminada. Solo coinciden las solicitudes que poseen esta string exacta. Las solicitudes de http://example.com/images/cat.jpg o https://example.com/images/cat.jpg?user=user1 no coinciden.

Puedes cambiar qué partes del URI se usan en la clave de caché. Si bien el nombre de archivo y la ruta de acceso siempre deben formar parte de la clave, puedes incluir, o bien omitir, cualquier combinación de protocolo, host o cadena de consulta cuando personalices la clave de caché. En Usa claves de caché se describe cómo personalizar las claves de caché.

Parte del URI Personalización URL de ejemplo que tienen la misma clave de caché
Protocolo Omite el protocolo desde la clave de caché.
  • https://example.com/images/cat.jpg
  • http://example.com/images/cat.jpg
Host Omite el host de la clave de caché.
  • https://example.com/images/cat.jpg
  • https://example2.com/images/cat.jpg
String de consulta Omite la cadena de consulta de la clave de caché.

Omite o incluye partes de la cadena de consulta de manera selectiva.
  • https://example.com/images/cat.jpg?user=user1
  • https://example.com/images/cat.jpg?user=user2

Además de omitir o incluir toda la cadena de consulta, puedes usar partes de esta mediante listas blancas y listas negras.

En los depósitos de backend, la clave de caché consiste en el URI sin el protocolo, el host ni la cadena de consulta.

Por lo tanto, para un depósito de backend determinado, los siguientes URI se resuelven en el mismo objeto almacenado en caché:

  • http://example.com/images/cat.jpg
  • https://example.com/images/cat.jpg
  • https://example.com/images/cat.jpg?user=user1
  • http://example.com/images/cat.jpg?user=user1
  • https://example.com/images/cat.jpg?user=user2
  • https://media.example.com/images/cat.jpg
  • https://www.example.com/images/cat.jpg

Lista blanca de la cadena de consulta

Puedes controlar de manera selectiva qué parámetros de la cadena de consulta se incorporan a las claves de caché de Cloud CDN. Por ejemplo, si creas una lista blanca de user, https://example.com/images/cat.jpg?user=user1&color=blue crea una clave de caché de https://example.com/images/cat.jpg?user=user1 que también coincide con https://example.com/images/cat.jpg?user=user1&color=red.

Para usar esta opción, debes incluir la cadena de consulta, especificar una lista blanca que no esté vacía y no especificar una lista negra.

Lista negra de la cadena de consulta

Puedes controlar de forma selectiva qué parámetros de la cadena de consulta ignora Cloud CDN mediante una lista negra. Por ejemplo, si creas una lista negra de user, todos los parámetros de la string de consulta excepto user se usan en la clave de caché.

Con la lista negra configurada y una entrada de https://example.com/images/cat.jpg?user=user1&color=blue, Cloud CDN crea una clave de caché de https://example.com/images/cat.jpg?color=blue que también coincide con https://example.com/images/cat.jpg?user=user2&color=blue, pero no con https://example.com/images/cat.jpg?user=user1&color=red.

Para usar esta opción, debes incluir la cadena de consulta, especificar una lista negra no vacía y no especificar una lista blanca.

Encabezados Vary

Además del URI de solicitud, Cloud CDN respeta los encabezados Vary que los servidores de origen incluyen en las respuestas. El encabezado Vary indica que la respuesta varía según los encabezados de la solicitud del cliente. Por ejemplo, si una respuesta especifica Vary: Accept, Cloud CDN usa una entrada de caché para solicitudes que especifican Accept: image/webp,image/*,*/*;q=0.8 y otra para solicitudes que especifican Accept: */*.

Los encabezados Vary a veces se usan cuando se entrega contenido comprimido. Cloud CDN no comprime ni descomprime las respuestas, pero puede entregar respuestas que el servidor de origen haya comprimido. Si el servidor de origen elige si entregar contenido comprimido o sin comprimir según el valor del encabezado de la solicitud Accept-Encoding, asegúrate de que la respuesta especifique Vary: Accept-Encoding.

Las respuestas con encabezados Vary se almacenan en caché solo si el encabezado tiene uno de los valores enumerados en Contenido que se puede almacenar en caché.

Plazos de vencimiento y solicitudes de validación

Cada entrada de caché en una caché de Cloud CDN tiene un plazo de vencimiento que definen los encabezados Cache-Control: s-maxage, Cache-Control: max-age o Expires de acuerdo con RFC 7234. Si hay más de uno, Cache-Control: s-maxage tiene prioridad sobre Cache-Control: max-age y Cache-Control: max-age tiene prioridad sobre Expires.

Cuando Cloud CDN recibe una solicitud, busca la entrada de caché correspondiente y verifica su antigüedad. Si la entrada de caché existe y está lo suficientemente actualizada, la respuesta se puede entregar desde la caché. Sin embargo, si el tiempo de vencimiento ya pasó, Cloud CDN no puede entregar una respuesta sin antes comunicarse con uno de los backends.

Cloud CDN vuelve a validar los objetos almacenados en caché que tienen más de 30 días. Esto permite la invalidación y expulsión automáticas del contenido almacenado en caché generado por el usuario. Cuando un valor max-age o s-maxage supera los 30 días (2,592,000 segundos), Cloud CDN trata el valor como si fueran 2,592,000 segundos. Los clientes finales aún ven los valores exactos de max-age y s- maxage, incluso si superan los 30 días.

Si la respuesta almacenada en caché con anterioridad tiene encabezados Last-ModifiedETag, Cloud CDN puede intentar usar la información en esos encabezados para validar la entrada de caché con el backend. Cloud CDN realiza esta validación de una manera un poco diferente en función de si la respuesta se almacenó en caché mediante solicitudes de rango de bytes:

  • Si la respuesta se almacenó en caché mediante solicitudes de rango de bytes, Cloud CDN inicia una solicitud de validación separada que incluye encabezados If-Modified-Since o If-None-Match.
  • De lo contrario, Cloud CDN agrega los encabezados If-Modified-Since o If-None-Match a la solicitud del cliente y reenvía la solicitud modificada al backend.

Si la copia almacenada en caché todavía está actualizada, el backend puede validar la entrada de caché existente mediante el envío de una respuesta 304 Not Modified. En este caso, el backend solo envía los encabezados de respuesta, no el cuerpo de la respuesta. Cloud CDN inserta los nuevos encabezados de respuesta en la caché, actualiza el plazo de vencimiento y entrega los nuevos encabezados de respuesta y el cuerpo de respuesta almacenado en caché al cliente.

Si la respuesta en caché anterior no tiene un encabezado Last-ModifiedETag, Cloud CDN ignora la entrada de caché vencida y reenvía la solicitud del cliente al backend sin modificar.

El plazo de vencimiento de la entrada de caché es el límite superior en cuanto a la duración de la entrada de caché. No hay garantía de que una entrada de caché permanezca en la caché hasta que venza. Las entradas de caché para el contenido poco popular pueden expulsarse a fin de dejar lugar para el contenido nuevo. Sin importar el plazo de vencimiento especificado, las entradas de caché a las que no se accede durante 30 días se quitan de forma automática.

Para obtener más información, consulta Expulsión y vencimiento.

Compatibilidad con solicitudes de rango de bytes

Una respuesta que cumple con los siguientes criterios indica que el servidor de origen admite solicitudes de rango de bytes:

  • Código de estado: 200 OK o 206 Partial Content
  • Encabezado: Accept-Ranges: bytes
  • Encabezado: Content-Length o Content-Range
  • Encabezado: ETag con un validador sólido
  • Encabezado: Last-Modified

Cloud Storage admite solicitudes de rango de bytes para la mayoría de los objetos. Sin embargo, Cloud Storage no admite solicitudes de rango de bytes para objetos con metadatos Content-Encoding: gzip, a menos que la solicitud del cliente incluya un encabezado Accept- Encoding: gzip. Si tienes objetos de Cloud Storage de más de 10 MB, asegúrate de que no tengan metadatos Content-Encoding: gzip. Para obtener información sobre cómo editar metadatos de objetos, consulta Visualiza y edita metadatos de objetos.

El popular software del servidor web también admite solicitudes de rango de bytes. Consulta la documentación del software del servidor web para obtener detalles sobre cómo habilitar la compatibilidad. Para obtener más información sobre las solicitudes de rango de bytes, consulta la especificación HTTP.

Cuando un servidor de origen admite solicitudes de rango de bytes, una caché de Cloud CDN se niega a almacenar una respuesta que puede almacenarse en caché la primera vez que realiza la solicitud si se cumple alguna de las siguientes condiciones:

  • El cuerpo de la respuesta está incompleto porque el cliente solicitó solo una parte del contenido.
  • El cuerpo de la respuesta es más grande que 1 MB (1,048,576 bytes).

Cuando esto sucede y la respuesta satisface los requisitos normales de capacidad de almacenamiento en caché, la caché registra que el servidor de origen admite solicitudes de rango de bytes para esa clave de caché y reenvía la respuesta del servidor de origen al cliente.

En un error de caché, la memoria caché verifica si se sabe que el servidor de origen admite solicitudes de rango de bytes. Si se sabe que las solicitudes de rango de bytes son compatibles con la clave de caché, la caché no reenvía la solicitud del cliente al balanceador de cargas de HTTP(S) externo. En su lugar, la caché inicia sus propias solicitudes de relleno de caché de rango de bytes para las partes faltantes del contenido. Si el servidor de origen muestra el rango de bytes solicitado en una respuesta 206 Partial Content, la caché puede almacenar ese rango para solicitudes futuras.

Una caché almacena una respuesta 206 Partial Content solo cuando se recibe en respuesta a una solicitud de rango de bytes que inició la caché. Debido a que una caché no inicia una solicitud de rango de bytes a menos que haya registrado de forma previa que el servidor de origen admite solicitudes de rango de bytes, una caché determinada no almacena contenido de más de 1 MB hasta la segunda vez que se accede al contenido.

Solicitudes que inicia Cloud CDN

Cuando el servidor de origen admite solicitudes de rango de bytes, Cloud CDN puede enviar varias solicitudes al servidor de origen en respuesta a una sola solicitud de cliente. Cloud CDN puede iniciar dos tipos de solicitudes: solicitudes de validación y solicitudes de rango de bytes.

Si la respuesta que indicó que el servidor de origen admite solicitudes de rango de bytes para una clave de caché específica caducó, Cloud CDN inicia una solicitud de validación a fin de confirmar que el contenido no cambió y que el servidor de origen aún admite solicitudes de rango del contenido. Si el servidor de origen responde con una respuesta 304 Not Modified, Cloud CDN procede a entregar el contenido mediante rangos de bytes. De lo contrario, Cloud CDN reenvía la respuesta del servidor de origen al cliente. Puedes controlar los plazos de vencimiento mediante los encabezados de respuesta Cache-Control y Expires.

En un error de caché, Cloud CDN inicia las solicitudes de llenado de caché para un conjunto de rangos de bytes que se superponen a la solicitud de cliente. Si algunos rangos del contenido que solicitó el cliente están presentes en la memoria caché, Cloud CDN entrega lo que puede desde la memoria caché y envía solicitudes de rango de bytes para los rangos faltantes al servidor de origen.

En cada solicitud de rango de bytes que inicia Cloud CDN, se especifica un rango que comienza en un desplazamiento que es múltiplo de 2,097,136 bytes. Con la excepción posible del rango final, cada rango también es de 2,097,136 bytes. Si el contenido no es un múltiplo de ese tamaño, el rango final es más pequeño. Es posible que el tamaño y los desplazamientos en las solicitudes de rango de bytes cambien en el futuro.

Por ejemplo, considera una solicitud de cliente para los bytes 1,000,000 a 3,999,999 de contenido que no esté presente en la caché. En este ejemplo, Cloud CDN podría iniciar dos solicitudes GET, una para los primeros 2,097,136 bytes de contenido y otra para los segundos 2,097,136 bytes. Esto se traduce en 4,194,272 bytes de llenado de caché aunque el cliente solicitó solo 3,000,000 bytes.

Cuando usas un depósito de Cloud Storage como origen, cada solicitud GET se factura como una operación Clase B independiente. Se te cobrará por todas las solicitudes GET que procesa Cloud Storage, lo que incluye cualquier solicitud que inicie Cloud CDN. Cuando una respuesta se entrega por completo desde una caché de Cloud CDN, no se envían solicitudes GET a Cloud Storage y no se cobra por ninguna operación de Cloud Storage.

Cuando Cloud CDN inicia una solicitud de validación o una solicitud de rango de bytes, no incluye encabezados específicos del cliente, como Cookie o User-Agent.

Próximos pasos