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

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

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

Ответы [ 8 ]

13 голосов
/ 16 сентября 2008

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

8 голосов
/ 19 сентября 2008

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

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
5 голосов
/ 07 февраля 2012

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

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

4 голосов
/ 21 января 2016

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

Самое простое решение, которое я нашел ( от Франсуа Мариера ), - переименовать несжатые файлы с двойным расширением, поэтому 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>

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

4 голосов
/ 04 марта 2009

У меня есть 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
1 голос
/ 16 сентября 2008

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

cd /var/www/.../data/
for file in *; do
    gzip -c $file > $file.gz;
done;
0 голосов
/ 28 августа 2014

У меня много больших файлов .json. Большинство читателей в этой ситуации. Ответы на предварительный просмотр не говорили о возвращенном «Content-type».

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

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

1) файлы должны быть переименованы: "file.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>

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

0 голосов
/ 16 сентября 2008

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

...