Как я могу предварительно сжимать файлы с помощью mod deflate в Apache 2.x?

я обслуживаю все содержимое через apache с Content-Encoding: zip но это сжимается на лету. Хороший объем моего контента-это статические файлы на диске. Я хочу gzip файлы заранее, а не сжимать их каждый раз, когда они запрашиваются.

Это то, что, я считаю, mod_gzip сделал в Apache 1.x автоматически, но только с файлом .gz рядом с ним. Это больше не относится к mod_deflate.

8 ответов


эта функция все равно теряется в mod_gzip. В Apache 2.x,вы делаете это с помощью content negotiation. В частности, вам нужно включить MultiViews с Options директива и вам нужно указать типы кодировки с помощью AddEncoding директива.


чтобы ответить на мой собственный вопрос с действительно простой строкой, которой мне не хватало в моем конфиурации:

Options FollowSymLinks MultiViews

мне не хватало опции MultiViews. Он есть в конфигурации веб-сервера Ubuntu по умолчанию, поэтому не будьте похожи на меня и бросьте его.

также я написал быструю задачу грабли, чтобы сжать все файлы.

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

У меня есть Apache 2, построенный из исходного кода, и я обнаружил, что мне пришлось изменить следующее В моем httpd.conf:

добавить MultiViews в опции:

Options Indexes FollowSymLinks MultiViews

Раскомментировать AddEncoding:

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

AddType Комментарий:

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

Я боюсь, что MultiViews не будет работать так, как ожидалось: doc говорит, что Multiviews работает", если сервер получает запрос на /some/dir/foo, если /some/dir включен MultiViews, и /some/dir/foo не существует..."другими словами: если у вас есть файл foo.JS и ФОО.js.gz в том же каталоге, просто активация MultiViews не вызовет .GZ-файл для отправки, даже если заголовок AcceptEncoding gzip передается браузером (вы можете проверить это поведение, временно отключив mod_deflate и мониторинг ответа, например, HTTPFox).

Я не уверен, что есть способ обойти это с MultiViews (возможно, вы можете переименовать исходный файл, а затем добавить специальную директиву AddEncoding), но я считаю, что вы можете создать правило mod_rewrite для обработки этого.


можно обслуживать предварительно сжатые файлы с помощью mod_negotiation хотя это немного привередливы. Основная трудность в том, что только запросы на файлы, которые не существуют обговариваются. Так что если foo.js и foo.js.gz оба существуют, ответы для /foo.js всегда будет несжатым (хотя ответы для /foo будет работать правильно).

самое простое решение я нашел (Франсуа Marier), чтобы переименовать распакованные файлы с расширением double, поэтому foo.js развертывается как foo.js.js поэтому просьбы о /foo.js переговоры между foo.js.js (без кодировки) и foo.js.gz (кодировку gzip).

я объединяю этот трюк со следующей конфигурацией:

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>

Я написал пост в котором подробно обсуждаются причины этой конфигурации и некоторые альтернативы.


mod_gzip сжатого содержимого на лету, а также. Вы можете предварительно сжать файлы, фактически войдя в свой сервер и сделав это из оболочки.

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

можно использовать mod_cache для прокси локального содержимого в памяти или на диске. Я не знаю, будет ли это работать так, как ожидалось с mod_deflate.


у меня много больших .файлы json. Большинство читателей находятся в такой ситуации. Ответы предварительного просмотра не говорили о возвращаемом "типе контента".

Я вы хотите, чтобы следующий запрос вернул предварительно сжатый файл с" Content-Type: application/json " прозрачно, используйте Multiview с ForceType

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

1) файлы нужно переименовать файл".доб.ext"

2) Multiview отлично работает с ForceType

в файловой системе:

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

In ваша конфигурация apache:

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

коротко и просто :)