Cachear un 302 con Squid

Aunque sea un poco saltarse el estándar por la torera, os vamos a plantear una solución para que el Squid guarde en su caché los 302. En el caso de OpenCms con sitios exportados, con un squid+Apache+Tomcat, la redirección 302 del sitio por ejemplo de www.uva.es a www.uva.es/export/sites/uva/index.html supone un a carga extra al tomcat ya que llega al Squid (que no o cachea por defecto), llega al apache y finalmente llega al Tomcat. Con un número muy grande de accesos esto supone ua carga extra al Tomcat que podemos evitar.

Lo primero, documentarnos. En la página http://wiki.squid-cache.org/SquidFaq/InnerWorkings, en la sección «How come some objects do not get cached?» podemos leer dos cosas interesantes. que por defecto no cachea los 30x y que para cachear el 302 «A 302 Moved Temporarily response is cachable ONLY if the response also includes an Expires header.», es decir, tenemos que tener una respuesta del servidor del 302 con el dato «Expires» en la cabecera, y aunque no lo dice, debe ser una fecha futura, ya que si ponemos una fecha pasada no lo va a cachear tampoco.

Pues vamos a ponernos a trastear ya. ¿Donde? Tenemos tres opciones, tocar el código de OpenCms, tocar el Tomcat o tocar el apache. En nuestro caso la más sencilla es el apache con su documentación, pero para el Tomcat también en muy sencilla y viene en la documentación buscando «Expires» , y la que no hemos mirado es el código de OpenCms.

En el caso de apache, podemos añadir un htaccess o directamente en la definición del virtualhost añadir estas líneas para que todos los contenidos digan que expiran en 5 minutos.
[code]
ExpiresActive On
ExpiresDefault «access plus 5 minutes»
[/code]

A partir de ese momento los 302 empezarán a ser cacheados por el Squid

[code]

1434098144.302      0 188.85.71.120 TCP_MEM_HIT/302 415 GET http://www.uva.es/ – NONE/- text/plain
1434098144.541      0 157.88.20.208 TCP_MEM_HIT/302 415 GET http://www.uva.es/ – NONE/- text/plain
1434098160.693      0 157.88.240.224 TCP_MEM_HIT/302 415 GET http://www.uva.es/ – NONE/- text/plain
1434098163.364      0 157.88.150.22 TCP_MEM_HIT/302 415 GET http://www.uva.es/ – NONE/- text/plain

[/code]

y desde los navegadores veremos también que el Squid nos devuelve el X-Cache: HIT como podéis ver en la imagen

Squid cacheando 302

 

A continuación podemos afinar más el dato Expires diferenciando por tipo por ejemplo, pero tened en cuenta que ya está el Squid de intermediario, y no afecta mucho al cliente:

[code]

ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 year"
[/code]

y podemos meter condiciones para que sólo lo haga los 302, pero no lo vemos necesario.

Como siempre, esperamos que os ayude!!