2008-09-16 6 views
34

Ich biete alle Inhalte durch Apache mit Content-Encoding: zip, aber das komprimiert im laufenden Betrieb. Ein guter Teil meiner Inhalte sind statische Dateien auf der Festplatte. Ich möchte die Dateien vorab gzip, anstatt sie jedes Mal zu komprimieren, wenn sie angefordert werden.Wie kann ich Dateien mit mod_deflate in Apache 2.x vorkomprimieren?

Dies ist etwas, das, glaube ich, mod_gzip tat in Apache 1.x automatisch, aber nur die Datei mit .gz daneben. Das ist nicht mehr der Fall mit mod_deflate.

+0

Ich glaube nicht, dass Sie viel sparen werden; Bei modernen Webservern sind die Kosten für die Komprimierung des Inhalts im laufenden Betrieb vernachlässigbar. – Aeon

+2

Ich betreibe den Webserver in einer Xen-VM, daher möchte ich so viel CPU wie möglich für die anderen VMs sparen. Auch konnte ich die Request-Rate, die mit httperf auf einer vorkomprimierten 55k-Datei gemessen wurde, im Vergleich zur Komprimierung im laufenden Betrieb verdoppeln. – Otto

+0

Siehe http://stackoverflow.com/questions/9076752/how-to-force-apache-to-use-manual-pre-compressed-gz-file-of-css-and-js-files?lq=1 –

Antwort

13

Diese Funktionalität wurde sowieso in mod_gzip verlegt. In Apache 2.x, you do that with content negotiation. Insbesondere müssen Sie MultiViews mit der Options directive aktivieren und Sie müssen Ihre Codierungstypen mit der AddEncoding directive angeben.

+0

http://stackoverflow.com/questions/9076752/how-to-force-apache-to-use-manual-pre-compressed-gz-file-of-css-and-js-files?lq=1 –

0

Sie können mod_cache verwenden, um lokalen Inhalt im Speicher oder auf der Festplatte zu proxygrafieren. Ich weiß nicht, ob das mit mod_deflate wie erwartet funktioniert.

1

mod_gzip komprimierte Inhalte auch im laufenden Betrieb. Sie können die Dateien vorkomprimieren, indem Sie sich tatsächlich bei Ihrem Server anmelden, und zwar über die Shell.

cd /var/www/.../data/ 
for file in *; do 
    gzip -c $file > $file.gz; 
done; 
+0

Dies wird Entfernen Sie die Originaldateien, dh Clients, die kein Aceept-Encoding haben: gzip wird nicht bearbeitet. – Otto

+0

guter Punkt, aktualisiert. – Aeon

+0

Fügen Sie während der Bearbeitung den Wert -9 hinzu und erzielen Sie die höchstmögliche Komprimierung. Meine 1500 Dateien wurden in 38 Sekunden komprimiert, daher lohnt es sich, jedes Byte in Bandbreite und Downloadzeit zu speichern. :) (Ich wünschte auch, ich könnte meinen Tippfehler in meinem vorherigen Kommentar bearbeiten. Ugh) – Otto

8

Um meine eigene Frage mit der wirklich einfachen Linie antwortet ich in meiner confiuration fehlte:

Options FollowSymLinks MultiViews 

ich die Multiview Option fehlte. Es ist dort in der Ubuntu-Standard-Webserver-Konfiguration, also sei nicht wie ich und gib es ab.

Auch ich schrieb eine schnelle Rake-Aufgabe, um alle Dateien zu komprimieren.

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 
4

Ich habe einen Apache 2 von der Quelle gebaut, und ich fand, hatte ich folgende in meinem httpd.conf Datei zu ändern:

hinzufügen Multiview zu Optionen:

Options Indexes FollowSymLinks MultiViews 

KommentarEncodierung:

AddEncoding x-compress .Z 
AddEncoding x-gzip .gz .tgz 

Kommentar AddType:

#AddType application/x-compress .Z 
#AddType application/x-gzip .gz .tgz 
4

Ich fürchte, Multiview wird nicht wie erwartet: der Doc sagt Multiviews funktioniert „, wenn der Server eine Anfrage für/some/dir/foo , wenn/einige/dir MultiViews aktiviert hat und/einige/dir/foo nicht existiert ... ", mit anderen Worten: Wenn Sie eine Datei foo.js und foo.js.gz im selben Verzeichnis haben, aktivieren Sie einfach MultiViews bewirkt nicht, dass die .gz-Datei gesendet wird, selbst wenn der AcceptEncoding-Gzip-Header vom Browser übertragen wird (Sie können dieses Verhalten überprüfen.) durch zeitweises Deaktivieren von mod_deflate und Überwachen der Antwort mit z.B. HTTPFox).

Ich bin mir nicht sicher, ob es einen Weg mit MultiViews gibt (vielleicht können Sie die Originaldatei umbenennen und dann eine spezielle AddEncoding-Direktive hinzufügen), aber ich glaube, Sie können eine mod_rewrite-Regel erstellen.

+0

Ich bin mir sicher, dass es zu der Zeit funktionierte, und ich bin mir sicher, dass ich die Originaldateien nicht gelöscht habe. Es ist plausibel, dass mod_rewrite irgendwie involviert war. Ich hatte wahrscheinlich eine Regel, die "statisch dienen sollte, wenn die Datei existiert". Ich habe es vielleicht geändert, um die.gz Erweiterung, aber ich habe nicht mehr Zugriff auf dieses System zu überprüfen. – Otto

+0

Wenn Sie in Ihrem Beispiel nur foo und nicht foo.js anfordern, wird es funktionieren. Wenn der Client gzip akzeptiert, erhält er foo.js.gz, andernfalls erhalten sie foo.js. –

+1

siehe http://stackoverflow.com/questions/9076752/how-to-force-apache-to-use-manual-pre-compressed-gz-file-of-css-and-js-files?lq=1 –

0

Ich habe viele große .json Dateien. Die meisten Leser sind in dieser Situation. Die Vorschauantworten sprachen nicht über den zurückgegebenen "Inhaltstyp".

Ich möchte Ihnen die folgende Anforderung eine vorkomprimierte Datei zurück mit "Content-Type: application/json" transparent, verwenden Sie Multiview mit Forcetype

http://www.domain.com/(...)/bigfile.json 
-> Content-Encoding:gzip, Content-Type: Content-Encoding:gzip 

1) Dateien umbenennen werden müssen: „file.ext .ext“

2) Multiview- arbeitet gut mit Forcetype

im Dateisystem:

// Note there is no bigfile.json 
(...)/bigfile.json.gz 
(...)/bigfile.json.json 

in der Apache-config:

<Directory (...)> 
    AddEncoding gzip .gz 
    Options +Multiviews 
    <Files *.json.gz> 
     ForceType application/json 
    </Files> 
</Directory> 

Kurz und einfach :)

3

Es ist möglich, Pre-komprimierte Dateien zu dienen mit mod_negotiation obwohl es ein bisschen pingelig ist. Die Hauptschwierigkeit ist only requests for files which do not exist are negotiated. Wenn also foo.js und foo.js.gz beide vorhanden sind, werden Antworten für /foo.js immer unkomprimiert (obwohl Antworten für /foo würde ordnungsgemäß funktionieren).

Die einfachste Lösung, die ich gefunden habe (from François Marier) ist nicht komprimierte Dateien mit einer doppelten Dateierweiterung umbenennen, wird so foo.js Einsatz als foo.js.js so Anfragen nach /foo.js zwischen foo.js.js (ohne Codierung) und foo.js.gz (gzip-Codierung) verhandeln.

kombiniere ich den Trick mit der folgenden Konfiguration:

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> 

ich wrote a post, die die Begründung für diese Konfiguration und einige Alternativen im Detail diskutiert.

+0

Sehr guter Punkt. – Otto

+0

Das scheint nicht mehr zu funktionieren. Mit Apache 2.4.25 bekomme ich immer unkomprimierte Ergebnisse, wahrscheinlich weil die MultiViews nur dann eintreffen, wenn die Datei nicht als named existiert. Der Arzt sagt so viel. Das Mitleid! – MvG

+0

Guter Fang @MvG, du hast absolut recht! Ich habe die Antwort mit einer Problemumgehung aktualisiert, obwohl sie nicht ideal ist, da sie das Umbenennen der unkomprimierten Datei und ein wenig Konfigurationstrick erfordert. Ich hoffe es hilft! – Kevinoid

Verwandte Themen