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

StackOverflow https://stackoverflow.com/questions/75482

Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

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

Options FollowSymLinks MultiViews

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

Также я написал быстрое задание Rake для сжатия всех файлов.

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

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

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

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

Добавление нескольких просмотров в параметры:

Options Indexes FollowSymLinks MultiViews

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

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

Добавить комментарий:

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

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

Самое простое решение, которое я нашел (from François Marier) заключается в переименовании несжатых файлов с двойным расширением, так что 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.ext"

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

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

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

В вашей конфигурации apache:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top