Nginx: сжатие gzip.

Потоковое сжатие (часто называемое «на лету») уменьшает размер отдаваемого контента, что ускоряет его отдачу и снижает трафик, но и увеличивает вычислительную нагрузку на сервер, а это приводит к замедлению всей системы. Следовательно, этим методом стоит отдавать только динамичный контент, а статичный хранить в сжатом виде. О раздаче сжатого с помощью gzip статичного контента написано в этой статье.

Настройка сервера для сжатия.

Для поддержки сжатия, nginx должен быть собран с модулем «ngx_http_gzip_module», собранные пакеты nginx поставляются с данным модулем.

Сжатие включается директивой «gzip on;» в контексте «http», «server», «location» или «if» в контексте «location». Контекст «http» по умолчанию находится в файле «/etc/nginx/nginx.conf», остальные в «/etc/nginx/conf.d/default.conf».

Если сервер отдаёт сжатый контент, то он должен уведомить об этом клиент отправив в заголовке поле «Vary: Accept-Encoding», отправка этого поля включается директивой: «gzip_vary on;».

Таким образом минимальная конфигурация будет выглядеть примерно так:location / { gzip on; gzip_vary on; }При такой конфигурации все значения будут установлены по умолчанию. Сжиматься будут только ответы с MIME-типом «text/html», степень сжатия=1, проксированные запросы не сжимаются. Для изменения значений в контексте могут быть указаны и другие директивы, о них ниже.

Чтобы изменения внесённые в конфигурационный файл вступили в силу, необходимо перезагрузить nginx командой:sudo nginx -s reload

Степень сжатия ответа.

По умолчанию уровень сжатия равен 1, изменить это значение можно директивой:gzip_comp_level уровень;Значение уровня может быть от 1 до 9, чем выше уровень сжатия, тем меньше размер ответа и трафик, но выше вычислительная нагрузка. Стоит отметить, что после 6 степень сжатия увеличивается слабо, но вычислительная нагрузка возрастает очень сильно, поэтому, обычно, нет смысла устанавливать уровень больше 6.

Достигнутый коэффициент сжатия сохраняется в переменной $gzip_ratio, эту переменную можно записать в лог, для этого нужно прописать в файле /etc/nginx/nginx.conf, в контексте «http» две строки:log_format ratio «$gzip_ratio»;
access_log /var/log/nginx/ratio.log ratio;
Теперь в файле /var/log/nginx/ratio.log, можно посмотреть достигнутый коэффициент сжатия.

MIME-тип ответа.

По умолчанию nginx, сжимает только ответы «text/html», эти ответы, при включении сжатия, сжимаются всегда (даже если указан другой MIME-тип), если нужно сжать ответ с каким-либо другим MIME-типом, то необходимо указать его в директиве:gzip_types mime-type;Значение «*» соответствует любому MIME-типу.

Количество буферов сжатия и их размер.

Сервер сжимает ответ в 32 буфера размером по 4k байта или 16 буферов по 8k байт, это зависит от платформы, количество буферов и их размер можно изменить директивой:gzip_buffers количество_буферов размер_буфера;Для примера, по умолчанию эта директива выглядит так:gzip_buffers 16 8k;

Минимальная длина ответа для сжатия.

Nginx, по умолчанию, не сжимает ответ длина, которого менее 20-ти байт, длина определяется из поля «Content-Length» в заголовке ответа. Увеличить или уменьшить минимальную длину можно директивой:gzip_min_length значение;Значение может быть указано в байтах (без суффикса, по умолчанию 20), килобайтах(с суффиксом k в конце), и мегабайтах(с суффиксом m в конце), например: значение 1024 = 8k = 1m.

Минимальная HTTP-версия запроса.

Минимальная HTTP-версия запроса при которой сжимается ответ по умолчанию — 1.1, изменить этот параметр можно директивой:gzip_http_version версия;Значение указывается в виде номера версии, например по умолчанию, значение установлено в 1.1.

Сжатие ответа для проксированных запросов.

Nginx, не сжимает ответ в случае, если запрос проксированный, это определяется по наличию в заголовке поля «Via», для разрешения сжатия нужно использовать директиву с условием:gzip_proxied условие;В этой директиве возможно указать несколько условий одновременно. Возможные значения:

  • any — любой проксированный запрос;
  • auth — если в заголовке запроса есть поле «Authorization»;
  • expired — если в заголовке есть поле «Expires», имеющее значение запрещающее кэширование;
  • no_etag — если нет поля «Etag»;
  • no_last_modified — если в заголовке нет поля «Last-Modified»;
  • условия «no_cache», «no_store», «private» - если есть поле «Cache-Control» в заголовке ответа, с соответствующим значением;

Запрет сжатия для некоторых клиентов.

Для запрета сжатия для некоторых клиентов существует директива:gzip_disable регулярное_выражение;Запрет будет установлен на все запросы, в которых поле заголовка «User-Agent» будет совпадать с регулярным выражением.

Комментарии
Оглавление:
Полезные ссылки: