Настройка gzip на Nginx в CentOS 7

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

gzip – это популярная программа сжатия данных. Веб-сервер Nginx можно настроить для поддержки gzip. Сжатые файлы будут в дальнейшем распакованы браузером. Таким образом можно сократить количество данных, передаваемых между веб-сервером и браузером.

Некоторые файлы сжимаются лучше, чем другие. Например, сжать текстовые файлы очень просто: в результате их можно уменьшить в два раза. А изображения (файлы jpeg или png) сжаты изначально, потому дополнительное сжатие gzip почти не дает результатов. Имейте в виду: сжатые файлы используют ресурсы сервера, потому рекомендуется сжимать только те файлы, на чей размер программа gzip может значительно повлиять.

Данное руководство поможет настроить Nginx для использования gzip.

Требования

  • Сервер CentOS 7.
  • Пользователь с правами sudo.
  • Предварительно установленный веб-сервер Nginx (пошаговое руководство по установке – здесь).

1: Создайте тестовые файлы

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

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

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

В данном примере настройки Nginx не будет сжимать слишком маленькие файлы. Создайте тестовый файл по имени test.html размером в 1 килобайт.

sudo truncate -s 1k /usr/share/nginx/html/test.html

Создайте ещё несколько тестовых файлов: jpg, таблицу стилей css и JavaScript-файл js.

sudo truncate -s 1k /usr/share/nginx/html/test.jpg
sudo truncate -s 1k /usr/share/nginx/html/test.css
sudo truncate -s 1k /usr/share/nginx/html/test.js

2: Проверьте стандартное поведение сервера

Теперь нужно проверить, как Nginx сжимает файлы.

Попробуйте сжать тестовый HTML-файл test.html.

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

Примечание: HTTP-заголовок Accept-Encoding: gzip указывает, что веб-сервер может обслуживать сжатый при помощи gzip контент.

В ответ сервер вернёт несколько заголовков HTTP.

HTTP/1.1 200 OK
Server: nginx/1.6.3
Date: Fri, 11 Mar 2016 12:53:06 GMT
Content-Type: text/html
Content-Length: 1024
Last-Modified: Fri, 11 Mar 2016 12:48:02 GMT
Connection: keep-alive
ETag: "56e2be82-400"
Accept-Ranges: bytes

Как видите, в выводе нет никаких упоминаний о gzip; значит, сервер не поддерживает сжатие gzip. По умолчанию в системе CentOS 7 сжатие gzip на сервере Nginx отключено. Если сжатие включено, сервер добавляет к предыдущим строкам заголовок:

Content-Encoding: gzip.

Итак, на данный момент сервер не сжимает никаких файлов. Чтобы убедиться в этом, запросите тестовый файл test.jpg:

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

Сервер вернёт примерно такой результат:

HTTP/1.1 200 OK
Server: nginx/1.6.3
Date: Fri, 11 Mar 2016 12:58:03 GMT
Content-Type: image/jpeg
Content-Length: 1024
Last-Modified: Fri, 11 Mar 2016 12:48:05 GMT
Connection: keep-alive
ETag: "56e2be85-400"
Accept-Ranges: bytes

Заголовок Content-Encoding: gzip в выводе отсутствует; значит, файл не был сжат.

Повторите тест с файлом CSS:

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

Как видите, этот файл тоже не сжимается:

HTTP/1.1 200 OK
Server: nginx/1.6.3
Date: Fri, 11 Mar 2016 12:59:04 GMT
Content-Type: text/css
Content-Length: 1024
Last-Modified: Fri, 11 Mar 2016 12:48:05 GMT
Connection: keep-alive
ETag: "56e2be85-400"
Accept-Ranges: bytes

3: Включение и настройка gzip в Nginx

Теперь нужно включить gzip и настроить сжатие файлов.

Модуль gzip является одним из основных модулей Nginx, то есть он уже установлен, но нуждается в настройке.

Как правило, на свежей установке Nginx в CentOS 7 все файлы каталога /etc/nginx/conf.d с расширением .conf загружаются автоматически. Это позволяет быстро настроить дополнительные модули.

Чтобы включить gzip, создайте конфигурационный файл gzip.conf:

sudo nano /etc/nginx/conf.d/gzip.conf

Вставьте в него следующий код:

##
# `gzip` Settings
#
#
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;

Сохраните и закройте файл.

Только что добавленный код состоит из следующих директив:

  • gzip on включает сжатие файлов.
  • gzip_disable “msie6” исключает
  • Internet Explorer 6 из списка браузеров, которые будут получать сжатые файлы (в IE6 полностью отсутствует поддержка gzip)
  • gzip_vary и gzip_proxied обеспечивает правильную работу прокси-серверов.
  • gzip_comp_level 6 задаёт количество сжимаемых файлов. Чем больше файлов нужно сжать, тем больше расходуется ресурсов.
  • gzip_http_version 1.1 ограничивает сжатие браузерами, поддерживающими протокол HTTP/1.1 (браузеры, не поддерживающие этот протокол, скорее всего, не поддерживают сжатия gzip).
  • gzip_min_length 256 устанавливает минимальный объём сжимаемого файла. Теперь сервер не будет сжимать файлы меньше 256 байт.
  • gzip_types перечисляет MIME-типы файлов, которые нужно сжать; в данном случае в список включены файлы HTML, XML, Javascript и JSON, таблицы стилей CSS, изображения SVG, иконки и веб-шрифты.

Чтобы обновить настройки, перезапустите Nginx.

sudo systemctl restart nginx

4: Проверьте настройку

После настройки Nginx нужно убедиться, что сервер работает должным образом.

Для этого запросите тестовые файлы (как в разделе 2). Вывод должен содержать заголовок Content-Encoding: gzip.

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

Теперь в выводе появится заголовок, которого не было раньше:

HTTP/1.1 200 OK
Server: nginx/1.6.3
Date: Fri, 11 Mar 2016 13:19:16 GMT
Content-Type: text/html
Last-Modified: Fri, 11 Mar 2016 12:48:02 GMT
Connection: keep-alive
Vary: Accept-Encoding
Content-Encoding: gzip

Проверьте остальные тестовые файлы:

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

Теперь несжатым останется только test.jpg, файл изображения.

Заключение

Настройка сжатия gzip на Nginx очень проста и даёт сайту множество преимуществ. Посетители и поисковые системы смогут загружать сайт гораздо быстрее.

Tags: , ,

Добавить комментарий