Помощник веб-разработчикаСтатьиИнструменты

Nginx: сжатие контента

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

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

Для включения сжатия контента, в конфигурационном файле /etc/nginx/conf.d/default.conf в контексте «location», «server», «if», находящемся в контексте «location» или /etc/nginx/nginx.conf в контексте «http», надо вписать директиву:

gzip    on;

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

gzip_vary    on;

Таким образом минимальная конфигурация блока должна выглядеть примерно так:

location / {
	gzip    on;
	gzip_vary    on;
}

При такой конфигурации, сжиматься будут только ответы с MIME-типом «text/html», степень=1, проксированные запросы не сжимаются.

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

По умолчанию, уровень сжатия равен 1, изменить это значение можно директивой:

gzip_comp_level    уровень;

Значения уровня могут быть от 1 до 9, необходимо учитывать - чем выше уровень, тем выше нагрузка на сервер.

MIME-тип ответа

Nginx, сжимает только ответы «text/html», эти ответы, при включении сжатия, сжимаются всегда, но если нужно сжать ответ с каким-либо другим 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-версия запроса при которой nginx сжимает ответ, по умолчанию 1.1, изменить этот параметр можно директивой:

gzip_http_version     версия;

значение указывается в виде номера версии, например по умолчанию, значение установлено в 1.1

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

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

gzip_proxied    условие;

В этой директиве возможно указать несколько условий одновременно. Возможные значения:

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

Для запрета сжатия для некоторых клиентов существует директива:

gzip_disable    регулярное_выражение;

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

Тестирование настроек сжатия

Для тестирования настроек сервера нужно прописать в файле /etc/nginx/nginx.conf, в контексте «http» две строки:

log_format    ratio «$gzip_ratio»;
access_log  /home/user/ratio.log ratio;

После чего перезагружаем сервер командой:

nginx -s reload

Теперь в файле /home/user/ratio.log, можно видеть достигнутый коэффициент сжатия.