¿Cómo habilitar el almacenamiento en caché en Apache/Ubuntu Linux?

¿Cómo habilitar el almacenamiento en caché en Apache/Ubuntu Linux?

Tengo un archivo XML grande (varios megabytes) que se actualiza con bastante frecuencia (cada 10 minutos o menos) y recibe mucho tráfico. Me gustaría implementar algo de almacenamiento en caché para reducir el ancho de banda y la carga del servidor. Al observar los documentos de Apache, veo una vertiginosa variedad de opciones de configuración que involucran varias combinaciones de mod_expires, mod_headers y mod_cache (y variantes). Termino corriendo en círculos y los resultados no son los que espero.

Me siento cómodo editando los distintos archivos de configuración si tengo alguna idea de lo que se supone que debo cambiar. Pero en este momento estoy husmeando en la oscuridad y esa nunca es una sensación cómoda. Entonces, tal vez si describo lo que quiero, alguien aquí pueda tomarme de la mano y decir: "Esto es lo que debes hacer".

Periódicamente, este archivo, llamado "stuff.xml", se actualiza y se copia una nueva versión en el directorio. La URL externa sería, por ejemplo,http://ejemplo.com/stuff.xml. Entiende, esta parte funciona. Cada vez que solicito el archivo, obtengo el resultado esperado. Pero el archivo es grande y quiero ahorrar ancho de banda, así que primero me gustaría implementar la semántica GET condicional con el encabezado If-Modified-Since. ¿Cómo hago esto? Habilité mod_headers y mod_expired y agregué la <FilesMatching>sección en mi httpd.conf como se recomienda en innumerables ejemplos que he visto en línea, pero eso no cambió el comportamiento cuando realicé una solicitud GET condicional. Siempre obtengo un estado 200 con todo el documento. Entonces, ¿cómo diablos implemento esto?

Eso reducirá las transferencias innecesarias. También me gustaría limitar la cantidad de datos transferidos. Dado que se trata de XML, comprimirlo debería ahorrarme un 50% o más. Mi siguiente paso sería comprimir el archivo de alguna manera y, si no es demasiado difícil, almacenarlo en la memoria. Eso reducirá la transferencia de datos por acceso y también reducirá las transferencias de disco. Entonces, ¿cómo implemento este tipo de almacenamiento en caché?

Gracias de antemano.

Respuesta1

He configurado el almacenamiento en caché usandomod_expires, dentro de la definición <VirtualHost>

ExpiresActive on
ExpiresByType text/xml "modified plus 5 minutes"   

Puede configurar la compresión usandomod_deflate

SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/xml 

Respuesta2

En cuanto a por qué If-Modified-Since no funciona, creo que deberías publicar las partes relevantes de tu configuración (supongo que has reiniciado Apache). También es posible que desees analizar rápidamente los registros para ver si la misma IP (posiblemente el mismo usuario) obtiene ese archivo XML varias veces. Si siempre o en su mayoría son usuarios nuevos cada vez, el caché del lado del cliente no ayudará a reducir la carga en su servidor.

Para la compresión, desea investigarmod_deflate y/o mod_gzip. Aquíes una comparación más antigua del Linux Journal.

Para el almacenamiento en caché de la memoria, creo que si se accede lo suficiente como para que valga la pena el almacenamiento en caché, el sistema operativo probablemente ya lo esté almacenando en caché. Si no tiene problemas de IO o mala latencia en el archivo, confiaría en que el sistema operativo hará su trabajo.

información relacionada