Ручное сжатие контента в Apache

Мне нужно решение для ручного сжатия на Apache. Мои цели:

  • Размещать на моем сервере контент в кодировке gzip вместе с несжатым.
  • Файлы предварительно сжаты.
  • Не все файлы подаются сжатыми. Я хочу указать эти файлы, и выбор не зависит от типа (расширения).
  • Подается много типов контента (настраиваемых), и время от времени появляются новые типы. Кроме того, расширение файла не определяет, будет он сжат или нет (!!!).
  • Держите накладные расходы минимальными (чем меньше лишних заголовков, тем лучше).
  • Всегда предоставляйте заголовок Content-Length и никогда не отправляйте фрагментированный ответ (это дисквалифицирует mod_deflate).

Идеальная функциональность

Идеальная функциональность будет работать так:

  • Веб-клиент запрашивает файл file.ext.
  • If file.ext.gz exists on server:
    • Content-Encoding is set to gzip.
    • Content-Type установлено значение file.ext (!!!).
    • Сервер возвращает file.ext.gz.
  • В противном случае возвращается file.ext.

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


Что я пробовал

Мультивиды

Как это работает:

  • Переименуйте файл file.ext в file.ext.en
  • Создайте файл file.ext.gz
  • Настройте Апач:

    Options +MultiViews
    AddEncoding x-gzip .gz
    RemoveType .gz
    

Работает почти так, как ожидалось, за исключением того, что требуется, чтобы исходный файл (file.ext) не существовал, и добавляется много (бесполезных для меня) заголовков (TCN, Content-Language и еще несколько), которые нельзя удалить (Header unset их не удаляет).

Переписать

Как это работает: - Создайте файл file.ext.gz. - Настроить Апач:

<pre>
RewriteEngine On
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule (.*)$ $1.gz [L]
AddEncoding x-gzip .gz

<Files file.ext>
    ForceType my-custom/mime-type
</FilesMatch>
</pre>

Это работает хорошо, но требует ForceType для каждого сжатого файла. Как я уже говорил, я не могу полагаться на расширения, потому что не все файлы определенного типа будут сжаты.

mod_deflate

Я особо не исследовал, проблема в том, что если файл слишком большой, то он разбивается на части и отправляется кусками, а Content-Length не предоставляется. Увеличение размера буферов сжатия не может устранить эту проблему.


Можно ли вообще настроить Apache так, чтобы он работал так, как мне хотелось бы?

Я попытался динамически получить Content-Type из file.ext и установить его в file.ext.gz, но не нашел, как это сделать.


person Tupteq    schedule 20.03.2013    source источник
comment
Какую проблему вы пытаетесь решить здесь? В большинстве случаев mod_deflate будет работать нормально, а небольшие дополнительные накладные расходы на ЦП в наши дни не так уж велики, с этими мощными серверами. Чем отличается ваша ситуация?   -  person Gerben    schedule 20.03.2013
comment
Как я описал выше - mod_deflate не предоставляет Content-Length для больших файлов и делит передачу на куски. Другое дело, что я не хочу сжимать каждый файл, я хочу выбирать индивидуально. Все эти усилия связаны с тем, что клиент — это мобильное приложение, где каждый цикл процессора и каждый байт очень ценны.   -  person Tupteq    schedule 21.03.2013