Question

Je sers tout le contenu via Apache avec Content-Encoding: zip mais cela se compresse à la volée. Une bonne partie de mon contenu est constituée de fichiers statiques sur le disque. Je veux gzip les fichiers à l'avance plutôt que de les compresser à chaque fois qu'ils sont demandés.

C’est quelque chose que mod_gzip , je crois, a fait automatiquement dans Apache 1.x, mais le fichier .gz se trouvant juste à côté. Ce n'est plus le cas avec mod_deflate .

Était-ce utile?

La solution

Cette fonctionnalité a quand même été mal placée dans mod_gzip. Dans Apache 2.x, vous le faites avec la négociation de contenu . Plus précisément, vous devez activer MultiViews avec le < directive code> Options et vous devez spécifier vos types de codage à l'aide de la directive AddEncoding .

Autres conseils

Pour répondre à ma propre question avec la ligne très simple qui me manquait dans ma confiuration:

Options FollowSymLinks MultiViews

L'option MultiViews manquait. C'est dans la configuration du serveur Web par défaut Ubuntu, alors ne soyez pas comme moi et ne le laissez pas tomber.

J'ai également écrit une tâche rapide de rake pour compresser tous les fichiers.

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

Je crains que MultiViews ne fonctionne pas comme prévu: la doc indique que Multiviews fonctionne "si le serveur reçoit une requête pour / un / répertoire / foo, si / un / répertoire a activé le mode MultiViews, et / un / répertoire / foo n'existe pas ... " ;, en d'autres termes: si vous avez un fichier foo.js et foo.js.gz dans le même répertoire, l'activation de MultiViews n'entraînera pas l'envoi du fichier .gz, même si AcceptEncoding gzip L’en-tête est transmis par le navigateur (vous pouvez vérifier ce comportement en désactivant temporairement mod_deflate et en surveillant la réponse, par exemple avec HTTPFox).

Je ne sais pas s'il est possible de contourner ce problème avec MultiViews (vous pouvez peut-être renommer le fichier d'origine, puis ajouter une directive spéciale AddEncoding), mais je pense que vous pouvez créer une règle mod_rewrite pour gérer cela.

J'ai un Apache 2 créé à partir des sources et j'ai constaté que je devais modifier les éléments suivants dans mon fichier httpd.conf :

Ajouter MultiViews aux options:

Options Indexes FollowSymLinks MultiViews

Décommentez AddEncoding:

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

Comment AddType:

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

Il est possible de servir des fichiers pré-compressés en utilisant mod_negotiation bien que ce soit un peu capricieux. La principale difficulté est que ne demande que des fichiers inexistants. sont négociés . Donc, si foo.js et foo.js.gz existent tous les deux, les réponses pour /foo.js seront toujours non compressées (bien que les réponses pour < code> / foo fonctionnerait correctement).

La solution la plus simple que j'ai trouvée ( de Fran & # 231; ois Marier ) consiste à renommer les fichiers non compressés avec une double extension. foo.js est donc déployé sous la forme foo.js.js . /foo.js négociez entre foo.js.js (aucun codage) et foo.js.gz (codage gzip).

Je combine cette astuce avec la configuration suivante:

Options +MultiViews
RemoveType .gz
AddEncoding gzip .gz

# Send .tar.gz without Content-Encoding: gzip
<FilesMatch ".+\.tar\.gz<*>quot;>
    RemoveEncoding .gz
    # Note:  Can use application/x-gzip for backwards-compatibility
    AddType application/gzip .gz
</FilesMatch>

I a écrit un article qui explique en détail le raisonnement pour cette configuration et certaines alternatives.

mod_gzip a également compressé le contenu à la volée. Vous pouvez pré-compresser les fichiers en vous connectant à votre serveur et en le faisant à partir d'un shell.

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

Vous pouvez utiliser mod_cache . proxy le contenu local en mémoire ou sur disque. Je ne sais pas si cela fonctionnera comme prévu avec mod_deflate .

J'ai beaucoup de gros fichiers .json. La plupart des lecteurs sont dans cette situation. Les réponses de prévisualisation ne mentionnaient pas le "type de contenu" renvoyé.

Si vous souhaitez que la requête suivante renvoie un fichier précomprimé avec " Content-Type: application / json " de manière transparente, utilisez Multiview avec ForceType

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

1) les fichiers doivent être renommés: "fichier.ext.ext"

2) Multiview fonctionne parfaitement avec ForceType

Dans le système de fichiers:

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

Dans votre configuration apache:

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

Court et simple:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top