¿Por qué usar deflate en lugar de gzip para archivos de texto servidos por Apache?


¿Qué ventajas ofrecen ambos métodos para archivos html, css y javascript servidos por un servidor LAMP? ¿Hay mejores alternativas?

El servidor proporciona información a una aplicación de mapas utilizando Json, por lo que un gran volumen de archivos pequeños.

Ver también ¿Hay algún golpe de rendimiento involucrado en la elección de gzip sobre deflate para la compresión http?

Author: Community, 2008-12-23

9 answers

¿Por qué usar deflate en lugar de gzip para archivos de texto servidos por Apache?

La respuesta simple es no.


RFC 2616 define deflate como:

Desinflar el formato "zlib" definido en RFC 1950 en combinación con el mecanismo de compresión "desinflar" descrito en RFC 1951

El formato zlib se define en RFC 1950 como:

     0   1
     +---+---+
     |CMF|FLG|   (more-->)
     +---+---+

       0   1   2   3
     +---+---+---+---+
     |     DICTID    |   (more-->)
     +---+---+---+---+

     +=====================+---+---+---+---+
     |...compressed data...|    ADLER32    |
     +=====================+---+---+---+---+

Entonces, unos cuantos encabezados y una suma de verificación ADLER32

RFC 2616 define gzip as:

Gzip Un formato de codificación producido por el programa de compresión de archivos "gzip" (GNU zip) como se describe en RFC 1952 [25]. Este formato es un Codificación Lempel-Ziv (LZ77) con CRC de 32 bits.

RFC 1952 define los datos comprimidos como:

El formato actualmente utiliza el método de compresión DEFLATE, pero se puede extender fácilmente para usar otros métodos de compresión.

El CRC-32 es más lento que ADLER32

En comparación con una comprobación de redundancia cíclica de la misma longitud, intercambia fiabilidad por velocidad (prefiriendo esta última).

So ... tenemos 2 mecanismos de compresión que utilizan el mismo algoritmo para la compresión, pero un diferente algoritmo para encabezados y suma de comprobación.

Ahora, los paquetes TCP subyacentes ya son bastante confiables , por lo que el problema aquí no es Adler 32 vs CRC-32 que GZIP utilizar.


Resulta que muchos navegadores a lo largo de los años implementaron un algoritmo de deflate incorrecto. En lugar de esperar la cabecera zlib en el RFC 1950, simplemente esperaban la carga útil comprimida. Del mismo modo, varios servidores web cometieron el mismo error.

Por lo tanto, a lo largo de los años los navegadores comenzaron a implementar una fuzzy logic deflate implementación, intentan zlib header y adler checksum, si eso falla, intentan payload.

El resultado de tener una lógica compleja como esa es que a menudo se rompe. Verve Studio tiene una sección user contributed test que muestra lo mala que es la situación.

Por ejemplo: deflate funciona en Safari 4.0 pero está roto en Safari 5.1, también siempre tiene problemas en IE.


Por lo tanto, lo mejor que puede hacer es evitar desinflar por completo, el aumento de velocidad menor (debido a adler 32) no vale la pena el riesgo de cargas útiles rotas.

 290
Author: Sam Saffron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-25 00:25:11

GZip es simplemente desinflar más una suma de verificación y encabezado/pie de página. Sin embargo, Deflate es más rápido, ya que aprendí de la manera difícil.

gráfico gzip vs deflate

 163
Author: Jeff Atwood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-08 14:09:30

Es probable que no pueda elegir desinflar como opción. Al contrario de lo que puede esperar mod_deflate no está usando deflate sino gzip. Así que mientras que la mayoría de los puntos hechos son válidos, es probable que no sea relevante para la mayoría.

 13
Author: Amblyopius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-12 11:06:47

La razón principal es que deflate es más rápido de codificar que gzip y en un servidor ocupado que podría hacer una diferencia. Con las páginas estáticas es una pregunta diferente, ya que pueden ser fácilmente precomprimidas una vez.

 3
Author: Joachim Sauer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-23 10:54:31

Creo que no hay gran diferencia entre deflate y gzip, porque gzip básicamente es solo un encabezado envuelto alrededor de deflate (ver RFCs 1951 y 1952).

 3
Author: schnaader,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-23 10:56:58

Mod_deflate requiere menos recursos en su servidor, aunque puede pagar una pequeña penalización en términos de la cantidad de compresión.

Si está sirviendo muchos archivos pequeños, le recomendaría hacer benchmarking y pruebas de carga de sus soluciones comprimidas y sin comprimir; puede encontrar algunos casos en los que habilitar la compresión no resultará en ahorros.

 1
Author: Dave R.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-23 11:05:46

No debería haber ninguna diferencia en gzip & deflate para la descompresión. Gzip es solo desinflar con un encabezado de pocas docenas de bytes envuelto alrededor de él, incluyendo una suma de verificación. La suma de comprobación es la razón de la compresión más lenta. Sin embargo, cuando está precomprimiendo millones de archivos, desea esas sumas de comprobación como una comprobación de la cordura en su sistema de archivos. Además, puede utilizar herramientas de línea de comandos para obtener estadísticas en el archivo. Para nuestro sitio estamos precomprimiendo una tonelada de datos estáticos (toda la directorio, 13.000 juegos, autocompletar millones de palabras clave, etc.) y estamos clasificados 95% más rápido que todos los sitios web por Alexa. Faxo Search . Sin embargo, utilizamos un servidor web propietario de origen. Apache / mod_deflate simplemente no lo cortó. Cuando esos archivos se comprimen en el sistema de archivos no solo recibes un golpe por tu archivo con el tamaño de bloque mínimo del sistema de archivos, sino toda la sobrecarga innecesaria en la administración del archivo en el sistema de archivos que al servidor web le podría importar menos. Sus preocupaciones deben ser la huella total del disco y el tiempo de acceso / descompresión y la velocidad secundaria para poder obtener estos datos precomprimidos. La huella es importante porque a pesar de que el espacio en disco es barato que desea tanto como sea posible para caber en la caché.

 0
Author: Steven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-20 17:17:04

En Ubuntu con Apache2 y el módulo deflate ya instalado (que es por defecto), puede habilitar deflate la compresión gzip en dos sencillos pasos:

a2enmod deflate
/etc/init.d/apache2 force-reload

¡Y estás fuera! Encontré páginas que serví a través de mi conexión adsl cargadas mucho más rápido.

Edit: Según el comentario de @GertvandenBerg, esto habilita la compresión gzip, no desinflar.

 -1
Author: aidan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-23 01:34:32

Si no recuerdo mal

  • gzip comprimirá un poco más que desinflar
  • desinflar es más eficiente
 -4
Author: JimmyJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-23 10:56:34