Frage

Ich diene alle Inhalte durch Apache mit Content-Encoding: zip aber das komprimiert on the fly. Eine gute Menge von meinem Gehalt statische Dateien auf dem Datenträger. Ich möchte vorher eher die Dateien auf gzip als sie jedes Mal komprimiert sie angefordert werden.

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

War es hilfreich?

Lösung

Diese Funktionalität wurde in mod_gzip verlegt sowieso. In Apache 2.x Sie tun, mit Content-Negotiation . Insbesondere müssen Sie MultiViews mit dem Options Richtlinie und Ihnen ermöglichen, müssen, um Ihre Codierungstypen mit der AddEncoding Richtlinie angeben.

Andere Tipps

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

Options FollowSymLinks MultiViews

ich fehlte die Multiview Option. Es ist dort in der Ubuntu-Standard-Web-Server-Konfiguration, so seien Sie nicht wie ich und legen Sie es ab.

Auch schrieb ich eine schnelle Rake Aufgabe, 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

Ich fürchte, Multiview wird nicht wie erwartet: der Doc sagt Multiviews funktioniert „, wenn der Server eine Anforderung für empfängt / some / dir / foo, wenn / some / dir hat Multiview Option aktiviert ist, und / some / dir / foo tut nicht existiert ... ", mit anderen Worten: wenn Sie eine Datei foo.js und foo.js.gz im gleichen Verzeichnis haben, wird nur aktiviert Multiview nicht die gz-Datei verursachen, selbst wenn die AcceptEncoding gzip-Header gesendet werden soll, durch den Browser übertragen (dieses Verhalten mod_deflate durch vorübergehend zu deaktivieren und Überwachung der Reaktion mit zB HttpFox überprüfen kann).

Ich bin nicht sicher, ob es einen Weg gibt, um dieses mit Multiviews (vielleicht können Sie die ursprüngliche Datei umbenennen und dann eine spezielle AddEncoding Richtlinie hinzufügen), aber ich glaube, Sie können eine mod_rewrite Regel konstruieren, dies zu umgehen.

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

In Multiviews auf Optionen:

Options Indexes FollowSymLinks MultiViews

Kommentar- AddEncoding:

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

Kommentar AddType:

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

Es ist möglich, vorverdichtete Dateien mit mod_negotiation zu dienen, obwohl es ein bisschen pingelig ist. Die Hauptschwierigkeit besteht darin, dass nur für Dateien anfordert, die nicht existieren verhandelt. Also, wenn foo.js und foo.js.gz beide existieren, Antworten für /foo.js immer dekomprimiert werden (obwohl Antworten für /foo richtig funktionieren würde).

Die einfachste Lösung, die ich gefunden habe ( von François Marier ) ist unkomprimierte Dateien mit einer doppelten Dateierweiterung umbenennen, so wird als foo.js foo.js.js entfalteten so Anfragen für /foo.js zwischen foo.js.js aushandeln (keine Codierung) und foo.js.gz (gzip-Codierung).

Ich verbinde diesen 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>

hat einen Kommentar , die die Begründung für diese Konfiguration und einige Alternativen im Detail diskutiert.

mod_gzip komprimierte Inhalte auf den auch fliegen. Sie können die Dateien durch tatsächlich Sie sich in Ihren Server Pre-komprimieren, und es von Shell zu tun.

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

Sie können mit mod_cache Proxy lokalen Inhalten im Speicher oder auf der Festplatte. Ich weiß nicht, ob dies wie bei mod_deflate erwartet.

Ich habe viele große .json Dateien. Die meisten Leser sind in dieser Situation. Die Vorschau Antworten nicht über die zurück „Content-Type“.

sprechen

Ich möchte Sie 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 müssen umbenennen: "file.ext.ext"

2) Multiview- arbeitet gut mit Forcetype

In dem 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:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top