Зачем использовать deflate вместо gzip для текстовых файлов, обслуживаемых Apache?


215

Какие преимущества предлагает любой метод для файлов html, css и javascript, обслуживаемых сервером LAMP. Есть ли лучшие альтернативы?

Сервер предоставляет информацию для картографического приложения с использованием Json, поэтому большой объем небольших файлов.

См. Также Есть ли какой-либо сбой в производительности при выборе gzip вместо deflate для сжатия http?


поменял принятые ответы ... текущий консенсус - два к одному в пользу gzip
Кен

1
mod_deflate для Apache 2, mod_gzip для Apache 1.3.
СПРБР

Ответы:


315

Зачем использовать deflate вместо gzip для текстовых файлов, обслуживаемых Apache?

Простой ответ - нет .


RFC 2616 определяет deflate как:

deflate Формат "zlib", определенный в RFC 1950 в сочетании с механизмом сжатия "deflate", описанным в RFC 1951

Формат zlib определен в RFC 1950 как:

     0   1
     +---+---+
     |CMF|FLG|   (more-->)
     +---+---+

       0   1   2   3
     +---+---+---+---+
     |     DICTID    |   (more-->)
     +---+---+---+---+

     +=====================+---+---+---+---+
     |...compressed data...|    ADLER32    |
     +=====================+---+---+---+---+

Итак, несколько заголовков и контрольная сумма ADLER32

RFC 2616 определяет gzip как:

gzip Формат кодирования, создаваемый программой сжатия файлов "gzip" (GNU zip), как описано в RFC 1952 [25]. Этот формат представляет собой кодирование Лемпеля-Зива (LZ77) с 32-битным CRC.

RFC 1952 определяет сжатые данные как:

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

CRC-32 медленнее, чем ADLER32

По сравнению с циклической проверкой избыточности той же длины, она меняет надежность на скорость (предпочитая последнюю).

Итак ... у нас есть 2 механизма сжатия, которые используют тот же алгоритм для сжатия, но другой алгоритм для заголовков и контрольной суммы.

Теперь лежащие в основе TCP-пакеты уже достаточно надежны , поэтому проблема здесь не в Adler 32, а в CRC-32, который использует GZIP.


Оказывается, во многих браузерах за эти годы реализован некорректный алгоритм дефляции. Вместо того, чтобы ожидать заголовок zlib в RFC 1950, они просто ожидали сжатую полезную нагрузку. Аналогичным образом различные веб-серверы допустили одну и ту же ошибку.

Таким образом, в течение многих лет браузеры начали реализовывать реализацию нечеткой логики с дефляцией, они пытаются использовать заголовок zlib и контрольную сумму adler, а в случае неудачи - полезную нагрузку.

Результатом такой сложной логики является то, что она часто нарушается. В Verve Studio есть пользовательский тестовый раздел, показывающий, насколько плоха ситуация.

Например: deflate работает в Safari 4.0, но не работает в Safari 5.1, он также всегда имеет проблемы с IE.


Таким образом, лучше всего избегать дефляции в целом, незначительное повышение скорости (из-за adler 32) не стоит риска поломки полезной нагрузки.


Разве не должно быть нового стандарта, объединяющего adler32 с gzip?
Pacerier

1
@Sam Saffron, это значит, что если на картинке нет веб-браузера, я могу использовать deflate поверх gzip? Например, если я собираюсь загрузить сжатый файл на мой FTP-сервер.
Xegara

1
Другое очень незначительное отличие состоит в том, что оболочка zlib составляет шесть байтов против 18 байтов для gzip. Таким образом, для очень маленьких пакетов может быть выгодно отправлять на 12 байт меньше. Вывод не меняется, однако, что из-за того, что Microsoft все испортила, неправильно истолковав, что означает «дефляция» в том, что они поставили на свои серверы IIS, проще использовать формат gzip.
Марк Адлер

Но как может быть нарушена полезная нагрузка, если она передается по протоколу TCP? Вся идея TCP заключается в передаче непрерывных полезных данных.
user1095108

Этот ответ датируется 2012 годом. Значит, современные браузеры по-прежнему страдают от проблемы неправильной реализации алгоритмов дефляции или безопасно использовать их сейчас? Эта часть ответа еще актуальна?
ihebiheb

172

GZip - это просто deflate плюс контрольная сумма и верхний / нижний колонтитулы. Дефлят быстрее , хотя, как я узнал, трудным путем.

GZIP против дефлята графа


13
Не говоря уже о том, что zlib не поддерживает расширение, и даже если бы оно было, инструкция CRC32 в SSE 4.2 использует полином 1EDC6F41, а формат gzip использует полином EDB88320 - совершенно разные алгоритмы, эффективно.
Джек Ллойд

7
И поскольку deflate быстрее, почему SO использует gzip?
Дэвид Мердок

40
Ну, этот ответ оказывается неправильным ... см .: zoompf.com/blog/2012/02/lose-the-wait-http-compression ... в частности, у клиента есть 2 способа, которыми они могут "интерпретировать" дефляцию, без заголовка / контрольной суммы и с заголовком zlib. Реализация во всех браузерах правильного дефлята плохая. выкачивания следует избегать.
Сэм Шафран

4
@sam Кроме того, я просто перезапустил тесты и на современном чипе Intel я получил gzip 1441/692 и выкачал 1286/531. Второе число - декомпрессия, первое - компресс. Так выкачивает это еще быстрее, не ваши тесты показывают , в противном случае? (Я согласен, что это может быть бесполезно по другим причинам, но ответ правильный , выкачка быстрее ..)
Джефф Этвуд

6
@JeffAtwood но вопрос не был быстрее?
Кен,

16

Скорее всего, вы не сможете выбрать опцию deflate. Вопреки тому, что вы можете ожидать, mod_deflate использует не deflate, а gzip. Таким образом, хотя большинство сделанных замечаний являются действительными, они, скорее всего, не актуальны для большинства.


4

Я думаю, что нет большой разницы между deflate и gzip, потому что gzip - это просто заголовок, обернутый вокруг deflate (см. RFC 1951 и 1952).


3

Основная причина в том, что deflate быстрее кодируется, чем gzip и на занятом сервере, что может иметь значение. Со статическими страницами это другой вопрос, так как они легко могут быть предварительно сжаты один раз.


возможно, с помощью gzip вы не можете начать передачу заголовка, пока не получите, не сохраните и не сожмете все данные? (потому что вам нужна контрольная сумма для создания заголовка)
OJW

8
В формате gzip контрольная сумма идет в конце файла, в частности, так что можно начинать запись блоков с дефляцией по мере их обработки без необходимости задерживать все.
Джек Ллойд,

2

mod_deflate требует меньше ресурсов на вашем сервере, хотя вы можете заплатить небольшой штраф с точки зрения степени сжатия.

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


Для тех, кто интересуется, с deflate мои текстовые файлы идут от 30 КБ до 10 КБ - поэтому файлы должны быть даже меньше, чем это, чтобы не получить никакой экономии. Я предполагаю менее 1 КБ или что-то подобное.
hextech

0

Не должно быть никакой разницы в gzip & deflate для декомпрессии. Gzip просто выкачивает заголовок из нескольких десятков байт, включая контрольную сумму. Контрольная сумма является причиной более медленного сжатия. Однако, когда вы предварительно сжимаете миллионы файлов, вам нужны эти контрольные суммы в качестве проверки работоспособности вашей файловой системы. Кроме того, вы можете использовать инструменты командной строки для получения статистики по файлу. Для нашего сайта мы предварительно сжимаем тонну статических данных (весь открытый каталог, 13 000 игр, автозаполнение для миллионов ключевых слов и т. Д.), И мы на 95% быстрее, чем все сайты по Alexa. Факсо Поиск, Тем не менее, мы используем собственный собственный веб-сервер. Apache / mod_deflate просто не вырезал его. Когда эти файлы сжимаются в файловую систему, вы получаете не только удар по файлу с минимальным размером блока файловой системы, но и все ненужные накладные расходы на управление файлом в файловой системе, о которых веб-сервер может заботиться меньше. Ваши проблемы должны быть связаны с общим объемом дискового пространства и временем доступа / распаковки, а также со скоростью, необходимой для предварительного сжатия этих данных. След занимает важное место, потому что, несмотря на то, что дисковое пространство дешево, вы хотите, чтобы как можно больше помещалось в кэш.


GZip, вероятно, проверяет контрольную сумму при распаковке, отсюда и разница в скорости при распаковке.
Сеун Осева

-1

В Ubuntu с Apache2 и уже установленным модулем deflate (который используется по умолчанию) вы можете включить сжатие gzip deflate в два простых шага:

a2enmod deflate
/etc/init.d/apache2 force-reload

И тебя нет! Я обнаружил, что страницы, которые я обслуживал по моей связи с ADSL, загружались намного быстрее.

Редактировать: Согласно комментарию @ GertvandenBerg, это включает сжатие gzip, а не дефляцию.


6
За исключением того, что это разрешает gzip, так как mod_deflate сбивает с толку только сжатие gzip ...
Герт ван ден Берг

@GertvandenBerg Я обновил свой ответ, но, к сведению, gzip является deflate, только с дополнительными заголовками и контрольной суммой
aidan

@aiden да, но контрольная сумма влияет на производительность ... (а сырой дефлят не соответствует стандарту)
Герт ван ден Берг

-4

если я правильно помню

  • gzip сжимает чуть больше, чем выкачивает
  • дефляция более эффективна

2
gzip является дефлятом с заголовком. И HTTP 1.1 deflate - это на самом деле zlib (который также является оболочкой для deflate)
Дэвид Мердок
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.