Настройка сжатия Gzip (ngx_http_gzip_module) в Nginx

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

Данная функция не всегда работает на практике (некоторые типы файлов сжимаются лучше чем другие), так файлы .jpeg или .png в исходном виде сжатые, поэтому их сжатия и уменьшения размера не происходит. Тогда как текстовые файлы можно уменьшить почти вдвое.

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

Документация Nginx Модуль ngx_http_gzip_module.

Для начала создадим пару файлов в дефолтном каталоге Nginx для тестирования сжатия файлов с помощью gzip.

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

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

Для тестирования создаем файл test.html (HTML-страница) в каталоге Nginx по умолчанию, используя truncate, размер которого 1 кб чтобы сжатие было незаметным.

truncate -s 1k /var/www/html/test.html

Создадим проверочные файлы для форматов .jpg, .css и .js.

truncate -s 1k /var/www/html/test.jpg
truncate -s 1k /var/www/html/test.css
truncate -s 1k /var/www/html/test.js

Веб-сервер Nginx отдает сжатый файл в ответ на запрос с заголовком HTTP (Accept-Encoding: gzip)

curl -H "Accept-Encoding: gzip" -I http://localhost/test.html

вы получите ответ сервера, который свидетельствует о том, что для отправки этого файла использовалось сжатие:

HTTP/1.1 200 OK
Server: nginx/1.14.0 (Ubuntu)
Date: Sat, 18 Jul 2020 13:12:13 GMT
Content-Type: text/html
Last-Modified: Sat, 18 Jul 2020 13:11:57 GMT
Connection: keep-alive
Content-Encoding: gzip

В настройках по умолчанию веб-сервера Nginx прописана поддержка сжатия формата .html, другие расширения обслуживаются в исходном размере. Проверить это можно в файле test.jpg

curl -H "Accept-Encoding: gzip" -I http://localhost/test.jpg

Получаем вывод:

HTTP/1.1 200 OK
Server: nginx/1.14.0 (Ubuntu)
Date: Sat, 18 Jul 2020 13:12:41 GMT
Content-Type: image/jpeg
Content-Length: 0
Last-Modified: Sat, 18 Jul 2020 13:12:01 GMT
Connection: keep-alive
ETag: "569e973e-0"
Accept-Ranges: bytes

В выводе отсутствует Content-Encoding: gzip заголовок, то есть файл отдается без сжатия. Удостоверимся также на формате .css:

curl -H "Accept-Encoding: gzip" -I http://localhost/test.css

получаем такой же результат в выводе, с отсутствием в заголовке Content-Encoding: gzip

Настроим Nginx для обслуживания всех форматов файлов. Изменяем gzip конфигурацию, внося коррективы в файл конфигурации /etc/nginx/nginx.conf.

  • Запретим сжимать файлы меньше 100 байт (которые не выигрывают от сжатия, а как мы уже знаем, само сжатие потребляет значительные ресурсы). Для этого используем директиву gzip_min_length (по умолчанию gzip_min_length равно 20).
  • Добавим в gzip_types директиву с дополнительными типами файлов, обозначающими веб-шрифты, .ico значки и изображения .svg. Директива gzip_types разрешает сжатие ответа методом gzip для указанных MIME-типов в дополнение к text/html. Специальное значение "*" соответствует любому MIME-типу. Ответы с типом text/html сжимаются всегда.
        ##
        # Gzip Settings
        ##
 
        gzip on;
        gzip_min_length 100;
        gzip_vary on;
        gzip_proxied any;
        gzip_comp_level 6;
        gzip_buffers 16 8k;
# Устанавливает минимальную HTTP-версию запроса, необходимую для сжатия ответа
        gzip_http_version 1.1;
        gzip_types text/plain text/css application/json application/javascript text/xml
 application/xml application/xml+rss text/javascript
 application/vnd.ms-fontobject application/x-font-ttf
 font/opentype image/svg+xml image/x-icon;

Сохраняем и закрываем файл.

После закрытия проверяем корректность синтаксиса конфигурационного файла:

nginx -t

Если проверка прошла успешно, то выполняем перезагрузку Nginx, чтобы изменения применились.

systemctl restart nginx.service

Повторите команды из Шаг 2.

Согласно внесенным правкам, исключено сжатие только для расширения.jpg. Для других типов файлов сжатие активно, о чём будет свидетельствовать Content-Encoding: gzip заголовок в выводе. Если это так, вы успешно настроили gzip сжатие в Nginx.

Как видите изменить конфигурацию Nginx для использования сжатия gzip несложно, но преимущества могут быть огромными. Мало того, что посетители с ограниченной пропускной способностью получат сайт быстрее, все остальные пользователи также увидят заметный прирост скорости. Поисковые системы будут рады быстрой загрузке сайта. Скорость загрузки теперь является важным показателем того, как поисковые системы ранжируют веб-сайты, и использование gzip — один из больших шагов к ее улучшению.

PQ VPS сервера в 28+ странах.