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»;
Теперь в файле /var/log/nginx/ratio.log, можно посмотреть достигнутый коэффициент сжатия.
access_log /var/log/nginx/ratio.log ratio;
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» будет совпадать с регулярным выражением.