apache - htaccess - gzip web
¿Cómo puedo precomprimir archivos con mod_deflate en Apache 2.x? (8)
Estoy sirviendo todo el contenido a través de apache con Content-Encoding: zip
pero que se comprime sobre la marcha. Una buena cantidad de mi contenido son archivos estáticos en el disco. Quiero descomprimir los archivos de antemano en lugar de comprimirlos cada vez que se soliciten.
Esto es algo que, creo, mod_gzip
hizo en Apache 1.x automáticamente, pero solo tenía el archivo con .gz al lado. Eso ya no es el caso con mod_deflate
.
Es posible servir archivos mod_negotiation
utilizando mod_negotiation
aunque es un poco quisquilloso. La principal dificultad es que solo se negocian las solicitudes de archivos que no existen . Entonces, si foo.js
y foo.js.gz
existen, las respuestas para /foo.js
siempre estarán sin comprimir (aunque las respuestas para /foo
funcionarían correctamente).
La solución más fácil que he encontrado ( de François Marier ) es cambiar el nombre de los archivos sin comprimir con una extensión de archivo doble, por lo que foo.js
se implementa como foo.js.js
por lo que las solicitudes de / /foo.js
negocian entre foo.js.js
( sin codificación) y foo.js.gz
(codificación gzip).
Combino ese truco con la siguiente configuración:
Options +MultiViews
RemoveType .gz
AddEncoding gzip .gz
# Send .tar.gz without Content-Encoding: gzip
<FilesMatch ".+/.tar/.gz$">
RemoveEncoding .gz
# Note: Can use application/x-gzip for backwards-compatibility
AddType application/gzip .gz
</FilesMatch>
Escribí una publicación que analiza el razonamiento de esta configuración y algunas alternativas en detalle.
Esta funcionalidad estaba fuera de lugar en mod_gzip de todos modos. En Apache 2.x, haces eso con la negociación de contenido . Específicamente, debe habilitar MultiViews
con la directiva Options
y debe especificar sus tipos de codificación con la directiva AddEncoding
.
Me temo que MultiViews no funcionará como se esperaba: el documento dice que Multiviews funciona "si el servidor recibe una solicitud para / some / dir / foo, si / some / dir tiene MultiViews habilitado, y / some / dir / foo no existe. .. ", en otras palabras: si tiene un archivo foo.js y foo.js.gz en el mismo directorio, simplemente al activar MultiViews no se enviará el archivo .gz aunque el encabezado gzip de AcceptEncoding sea transmitido por el navegador (puede verificar este comportamiento desactivando temporalmente mod_deflate y supervisando la respuesta con, por ejemplo, HTTPFox).
No estoy seguro de si hay una forma de evitar esto con MultiViews (quizás pueda cambiar el nombre del archivo original y luego agregar una directiva especial AddEncoding), pero creo que puede construir una regla mod_rewrite para manejar esto.
Para responder mi propia pregunta con la línea realmente simple que me faltaba en mi confiuración:
Options FollowSymLinks MultiViews
Me faltaba la opción MultiViews. Está ahí en la configuración predeterminada del servidor web de Ubuntu, así que no seas como yo y déjalo.
También escribí una rápida tarea de Rake para comprimir todos los archivos.
namespace :static do
desc "Gzip compress the static content so Apache doesn''t need to do it on-the-fly."
task :compress do
puts "Gzipping js, html and css files."
Dir.glob("#{RAILS_ROOT}/public/**/*.{js,html,css}") do |file|
system "gzip -c -9 #{file} > #{file}.gz"
end
end
end
Puede usar mod_cache
para proxy de contenido local en la memoria o en el disco. No sé si funcionará como se esperaba con mod_deflate
.
Tengo muchos archivos .json grandes. La mayoría de los lectores están en esta situación. Las respuestas de la vista previa no hablaban del "tipo de contenido" devuelto.
Si desea que la siguiente solicitud devuelva un archivo precomprimido con "Content-Type: application / json" de forma transparente, use Multiview con ForceType
http://www.domain.com/(...)/bigfile.json
-> Content-Encoding:gzip, Content-Type: Content-Encoding:gzip
1) los archivos deben renombrarse: "file.ext.ext"
2) Multiview funciona muy bien con ForceType
En el sistema de archivos:
// Note there is no bigfile.json
(...)/bigfile.json.gz
(...)/bigfile.json.json
En tu configuración de apache:
<Directory (...)>
AddEncoding gzip .gz
Options +Multiviews
<Files *.json.gz>
ForceType application/json
</Files>
</Directory>
Corto y simple :)
Tengo un Apache 2 creado desde la fuente, y encontré que tenía que modificar lo siguiente en mi archivo httpd.conf :
Agregar MultiViews a Opciones:
Options Indexes FollowSymLinks MultiViews
Descomentar AddEncoding:
AddEncoding x-compress .Z AddEncoding x-gzip .gz .tgz
Comentario AddType:
#AddType application/x-compress .Z #AddType application/x-gzip .gz .tgz
mod_gzip comprimió contenido sobre la marcha también. Puede precomprimir los archivos al iniciar sesión en su servidor y hacerlo desde shell.
cd /var/www/.../data/
for file in *; do
gzip -c $file > $file.gz;
done;