martes, 9 de diciembre de 2008

Eliminar ETags para incrementar el rendimiento

Esto es algo que sigo sin entender, y que encima está por defecto en Apache: si para comprobar que es correcta la versión de un contenido que el navegador tiene cacheada se envía la cabecera "If-Modified-Since"... ¿por qué además existen los headers ETag en respuestas y posteriores If-None-Match en peticiones? (Nota para despistados: el ETag es como una especie de digest cutre del fichero).

Y para más coña, Apache lo genera por defecto a partir del INode, Fecha y Tamaño del fichero en cuestión. Desde mi punto de vista no aporta nada, consume recursos, obliga a enviar cabeceras innecesarias, y además puede dar "falsos negativos" en granjas o entornos balanceados o después de un despliegue de una aplicación (mismo fichero pero en otro inodo!).

iPlanet / Sun ONE Web Server (al menos hasta la versión 6.1) también lo pone por defecto y también se recomienda eliminarlo para mejorar el rendimiento.

Pero además, en Apache me he encontrado con otro problema: si está activado el mod_deflate para la compresión de contenidos, Apache nunca se da por enterado de que el fichero solicitado sí es el mismo que tiene el usuario en su cache, así que siempre devuelve un "200 OK" + todo el contenido, en lugar de un "304 Not Modified". Es porque al ETag enviado al cliente se le añade el sufijo "-gzip" al ETag, y es lo que el cliente envía de vuelta... pero por lo que sea Apache no es capaz de entender que el ETag con GZIP debería ser el mismo que el ETag sin GZIP. Es decir, da igual cómo se haya transportado el contenido, lo importante es si lo que hay en el servidor es lo mismo que tiene la caché del cliente ¿o no?

Bueno. ¿Y cómo se elimina? Afortunadamente de forma muy sencilla (para Apache):

FileETag None

Y para iPlanet 6.1 también es trivial:

<Object name="default">
   (...)
   Output fn="set-variable" remove-srvhdrs="etag"
</Object>

Para más información de por qué esto mejora el rendimiento:

Dejo por aquí también referencia al RFC de HTTP/1.1 en lo que a cabeceras se refiere. Cuántas veces he tirado de él y qué poco de moda está a día de hoy tener tiempo para leer RFCs, sino mejor buscar en blogs... ;-)

No hay comentarios: