Hoe kan ek lêers vooraf saampers met mod_deflate in Apache 2.x?
-
09-06-2019 - |
Vra
Ek bedien alle inhoud deur apache met Content-Encoding: zip
maar dit druk op die vlieg saam.'n Goeie hoeveelheid van my inhoud is statiese lêers op die skyf.Ek wil die lêers vooraf gzip eerder as om hulle saam te komprimeer elke keer as hulle versoek word.
Dit is iets wat ek glo, mod_gzip
het outomaties in Apache 1.x gedoen, maar net die lêer met .gz langsaan.Dit is nie meer die geval met mod_deflate
.
Oplossing
Hierdie funksie is misplaas in mod_gzip in elk geval. In Apache 2.x, jy dit doen met die inhoud onderhandeling . Spesifiek, moet jy MultiViews
met die Options
richtlijn en jou in staat stel nodig het om jou encoding tipes spesifiseer met die AddEncoding
richtlijn .
Ander wenke
Om my eie vraag te beantwoord met die werklik eenvoudige lyn ek weg was in my confiuration:
Options FollowSymLinks MultiViews
Ek was ontbreek die opsie MultiViews. Dis daar in die Ubuntu verstek web server configuration, so moenie wees soos ek en gooi dit weg.
Ook het ek 'n vinnige Rake taak om al die lêers te compress.
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
Ek is bevrees MultiViews sal nie werk soos verwag nie:die dokument sê Multiviews werk "as die bediener 'n versoek vir /some/dir/foo ontvang, as /some/dir MultiViews geaktiveer het, en /some/dir/foo nie bestaan nie...", met ander woorde:as jy 'n lêer foo.js en foo.js.gz in dieselfde gids het, sal die aktivering van MultiViews nie veroorsaak dat die .gz-lêer gestuur word nie, selfs al word die AcceptEncoding gzip-kopskrif deur die blaaier versend (jy kan hierdie gedrag verifieer deur tydelik deaktiveer mod_deflate en monitering van die reaksie met bv.HTTPFox).
Ek is nie seker of daar 'n manier om dit met MultiViews is nie (miskien kan jy die oorspronklike lêer hernoem en dan 'n spesiale AddEncoding-instruksie byvoeg), maar ek glo jy kan 'n mod_rewrite-reël konstrueer om dit te hanteer.
Ek het 'n Apache 2 gebou van die bron, en ek het gevind dat ek moes die volgende in my httpd.conf lêer verander:
MultiViews Voeg by Options:
Options Indexes FollowSymLinks MultiViews
uncomment AddEncoding:
AddEncoding x-compress .Z AddEncoding x-gzip .gz .tgz
Kommentaar AddType:
#AddType application/x-compress .Z #AddType application/x-gzip .gz .tgz
Dit is moontlik om vooraf saamgeperste lêers te bedien met behulp van mod_negotiation
alhoewel dit 'n bietjie fyn is.Die primêre probleem is dit slegs versoeke vir lêers wat nie bestaan nie, word onderhandel.So as foo.js
en foo.js.gz
beide bestaan, reaksies vir /foo.js
sal altyd ongecomprimeerd wees (hoewel antwoorde vir /foo
sal reg werk).
Die maklikste oplossing wat ek gevind het (van François Marie) is om ongecomprimeerde lêers te hernoem met 'n dubbele lêeruitbreiding, dus foo.js
word ontplooi as foo.js.js
so versoeke vir /foo.js
onderhandel tussen foo.js.js
(geen enkodering) en foo.js.gz
(gzip-kodering).
Ek kombineer daardie truuk met die volgende konfigurasie:
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>
ek 'n plasing geskryf wat die redenasie vir hierdie konfigurasie en 'n paar alternatiewe in detail bespreek.
mod_gzip saamgeperste inhoud op die vlieg as well. Jy kan pre-pers die lêers deur eintlik te meld by jou bediener, en doen dit uit dop.
cd /var/www/.../data/
for file in *; do
gzip -c $file > $file.gz;
done;
Jy kan gebruik mod_cache
om volmag plaaslike inhoud in die geheue of op skyf. Ek weet nie of dit sal werk soos verwag met mod_deflate
.
Ek het 'n baie groot .json- lêers. Die meeste lesers is in hierdie situasie. Die voorskou antwoorde nie praat oor die teruggekeer "Content-tipe".
Ek julle wil hê dat die volgende versoek 'n pre-saamgeperste lêer met terugkeer "Content-Type: application / into" deursigtig, gebruik Multiview met ForceType
http://www.domain.com/(...)/bigfile.json
-> Content-Encoding:gzip, Content-Type: Content-Encoding:gzip
1) lêers moet hernoem: "file.ext.ext"
2) Multiview werk baie goed saam met ForceType
In die lêerstelsel:
// Note there is no bigfile.json
(...)/bigfile.json.gz
(...)/bigfile.json.json
In jou apache config:
<Directory (...)>
AddEncoding gzip .gz
Options +Multiviews
<Files *.json.gz>
ForceType application/json
</Files>
</Directory>
Kort en eenvoudige:)