Как я могу предварительно скомпилировать файлы с mod_deflate в Apache 2.x?
Я обслуживаю весь контент через apache с помощью Content-Encoding: zip
, но который сжимается "на лету". Хорошим количеством моего контента являются статические файлы на диске. Я хочу gzip файлы заранее, а не сжимать их каждый раз, когда они запрашиваются.
Это то, что, я считаю, mod_gzip
было сделано в Apache 1.x автоматически, но просто с файлом с .gz рядом с ним. Это уже не случай с mod_deflate
.
Ответы
Ответ 1
В любом случае эта функция была неуместна в mod_gzip. В Apache 2.x, вы делаете это с согласованием контента. В частности, вам нужно включить MultiViews
с директивой Options
, и вам нужно указать свои типы кодирования с помощью AddEncoding
.
Ответ 2
Чтобы ответить на мой собственный вопрос с действительно простой строкой, мне не хватало в моем конфирмации:
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
Ответ 3
У меня есть Apache 2, построенный из исходного кода, и я обнаружил, что мне пришлось изменить следующее в файле httpd.conf:
Добавить MultiViews в опции:
Options Indexes FollowSymLinks MultiViews
Uncomment AddEncoding:
AddEncoding x-compress .Z
AddEncoding x-gzip .gz .tgz
Комментарий AddType:
#AddType application/x-compress .Z
#AddType application/x-gzip .gz .tgz
Ответ 4
Я боюсь, что 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, чтобы справиться с этим.
Ответ 5
Можно использовать предварительно сжатые файлы с помощью mod_negotiation
, хотя это немного сложно. Основная трудность заключается в том, что обсуждаются только запросы на файлы, которые не существуют. Поэтому, если существуют foo.js
и foo.js.gz
, ответы для /foo.js
всегда будут несжатыми (хотя ответы для /foo
будут работать корректно).
Самое легкое решение, которое я нашел (от 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>
I написал сообщение, в котором подробно обсуждается аргументация этой конфигурации и некоторые альтернативы.
Ответ 6
mod_gzip сжатый контент "на лету". Вы можете предварительно сжать файлы, фактически войдя в свой сервер и сделав это из оболочки.
cd /var/www/.../data/
for file in *; do
gzip -c $file > $file.gz;
done;
Ответ 7
Вы можете использовать mod_cache
для локального содержимого прокси в памяти или на диске. Я не знаю, будет ли это работать с ожиданием mod_deflate
.
Ответ 8
У меня много больших файлов .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>
Короче и просто:)