2010-06-16 13 views
10

Necesito precomprimir algunos archivos html/xml/json muy grandes (volcados de datos grandes) usando gzip o desinflar. No quiero servir los archivos sin comprimir. Son tan grandes y repetitivos que la compresión probablemente funcionará muy bien, y aunque algunos navegadores antiguos no pueden soportar la descompresión, mis clientes típicos no los usarán (aunque sería bueno si pudiera generar algún tipo de 'hey que necesita actualice el mensaje de su navegador)Cómo precomprimir archivos html muy grandes

Genero automáticamente los archivos y puedo generar fácilmente archivos .htaccess para ir junto con cada tipo de archivo. Esencialmente, lo que quiero es algo siempre en la versión de mod_gunzip. Debido a que los archivos son grandes y porque los estaré atendiendo repetidamente, necesito un método que me permita comprimir una vez, realmente bien, en la línea de comandos.

He encontrado información en este sitio y otras sobre cómo hacer esto con gzip, pero me preguntaba si alguien podría explicarme cómo hacer esto con desinflar. Puntos de bonificación para una respuesta completa que incluye el aspecto que debería tener mi archivo .htaccess, así como el código de línea de comando que debería usar (GNU/Linux) para obtener una compresión óptima. Súper puntos de bonificación para una respuesta que también aborda cómo enviar un mensaje de "lo sentimos, no hay archivos para ti" a los navegadores que no cumplan.

sería genial si pudiéramos crear una etiqueta "precompresión" para cubrir preguntas como esta.

-FT

+0

puede obtener mejores respuestas de serverfault.com –

+0

Parece un duplicado de http://stackoverflow.com/questions/75482/how-can-i-pre-compress-files-with-mod-deflate-in- apache-2-x – skaffman

+0

Eso fue útil, pero analiza solo gzip y no deflacta la compresión previa. También está en un entorno de rieles y no en php (aunque sigue siendo apache). Las similitudes en los mensajes argumentan a favor de una etiqueta precompressionn – ftrotter

Respuesta

8

Editar: encontrado AddEncoding in mod_mime

Esto funciona:

<IfModule mod_mime.c> 
<Files "*.html.gz"> 
    ForceType text/html 
</Files> 
<Files "*.xml.gz"> 
    ForceType application/xml 
</Files> 
<Files "*.js.gz"> 
    ForceType application/javascript 
</Files> 
<Files "*.gz"> 
    AddEncoding gzip .gz 
</Files> 
</IfModule> 

Los documentos que suene como sólo el AddEncoding debe ser necesaria, pero no he tenido que trabajar.

Además, Lighttpd's mod_compression puede comprimir y almacenar en caché (los archivos comprimidos).

+0

Si puede incluir el código de tipo MIME, aceptaría esta respuesta, parece que nadie me va a dar una respuesta completa, incluida la opción de desinflar ... – ftrotter

+0

¿Sería eso también un: ' Conjunto de encabezado Content-Encoding: deflate'? – maxwellb

0

Una forma rápida para comprimir contenido sin tratar directamente con moz_gzip/mod_defalte está utilizando ob_gzhandler y modificación de cabeceras (antes de cualquier salida se envía al navegador).

<?php 
/* Replace CHANGE_ME with the correct mime type of your large file. 
i.e: application/json 
*/ 

ob_start ('ob_gzhandler'); 
header('Content-type: CHANGE_ME; charset: UTF-8'); 
header('Cache-Control: must-revalidate'); 
$offset = 60 * 60 * 2 ; 
$ExpStr = 'Expires: ' . gmdate('D, d M Y H:i:s',time() + $offset) . ' GMT'; 
header($ExpStr); 

/* Stuff to generate your large files here */ 
+0

Esto está haciendo gzip sobre la marcha. Yo, pero el archivo ya existe como un html/json/xml/lo que sea en el disco. Supongo que podría usar php como este para generar los encabezados correctos y luego repetir el archivo (o equivalente), pero ¿no hay una manera de hacerlo en solo apache? – ftrotter

2

Para la línea de comandos, compile zpipe de zlib: http://www.zlib.net/zpipe.c y luego

zpipe <BIGfile.html> BIGfile.htmlz 

por ejemplo.

Luego, usando el ejemplo de Zash, configure un filtro para cambiar el encabezado. Esto debería proporcionarle tener archivos desinflados RAW, que los navegadores modernos probably support.

Para otra manera de comprimir archivos, consulte el uso de pigz con las opciones de compresión zlib (-z) o PKWare zip (-K). Pruebe si estos trabajos llegan con el conjunto Content-Encoding.

+0

Ah, y cambia Z_DEFAULT_COMPRESSION en zpipe a Z_BEST_COMPRESSION. – maxwellb

+0

¿Esto "desinflar" la compresión o simplemente gzip? – ftrotter

+0

zpipe, al menos, se desinfla. Pruebe y configure un archivo de prueba para la compresión de pigz, honestamente, simplemente no tengo el entorno de prueba para probarlo yo mismo ahora mismo. Pigz también se comprimirá más rápido al utilizar múltiples núcleos. Cortejar. – maxwellb

3

Si yo fuera usted, miraría la compresión del sistema de archivos incorporado en lugar de hacerlo en la capa de Apache.

En solaris zfs tiene compresión transparente, use compresión zfs para comprimir el sistema de archivos. Del mismo modo, Windows puede comprimir carpetas, apache servirá el contenido ajeno al hecho de que está comprimido en el disco. Linux tiene sistemas de archivos que también hacen compresión transparente.

+0

gran comentario. ¿Qué sistema de archivos en Linux y algún consejo sobre cómo hacer esto en una instancia en la nube? ¿Cómo configurar correctamente los encabezados (para que los clientes puedan entender el contenido?) – ftrotter

+0

No es tan elegante en Linux, pero hay módulos de fusibles que harán una compresión/descompresión transparente. Como este: http://miio.net/wordpress/projects/fusecompress/ No tendrías que hacer nada con los encabezados en apache, porque en lo que a apache se refiere, son archivos normales. :-) – Jubal

+2

No veo cómo responde esta respuesta al problema. Suena como si ftrotter quisiera precomprimir los archivos para guardar la sobrecarga de procesamiento en el momento de la solicitud. Si utiliza una compresión de sistema de archivos transparente, Apache aún tendrá que volver a comprimir en el momento de la solicitud. –

Cuestiones relacionadas