Как добавить модуль gzip в Nginx на CentOS 7

Вступление

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

http://www.gzip.org/ [+ gzip +] - популярная программа сжатия данных. Вы можете настроить Nginx для использования + gzip + для сжатия файлов, которые он обслуживает на лету. Эти файлы затем распаковываются браузерами, которые поддерживают их при извлечении, без каких-либо потерь, но с преимуществом меньшего объема данных, передаваемых между веб-сервером и браузером.

Из-за того, как работает сжатие в целом, а также как работает + gzip +, некоторые файлы сжимаются лучше, чем другие. Например, текстовые файлы сжимаются очень хорошо, часто в результате получаются в два раза меньше. С другой стороны, изображения, такие как файлы JPEG или PNG, уже сжаты по своей природе, а второе сжатие с использованием + gzip + дает мало или вообще не дает результатов. Сжатие файлов расходует ресурсы сервера, поэтому лучше всего сжимать только те файлы, которые в результате значительно уменьшат его размер.

В этом руководстве мы обсудим, как настроить Nginx, установленный на вашем сервере CentOS 7, для использования сжатия + gzip + для уменьшения размера контента, отправляемого посетителям сайта.

Предпосылки

Чтобы следовать этому уроку, вам понадобится:

Шаг 1 - Создание тестовых файлов

На этом шаге мы создадим несколько тестовых файлов в каталоге Nginx по умолчанию для сжатия текста + gzip +.

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

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

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

Создайте файл размером 1 килобайт с именем + test.html + в каталоге Nginx по умолчанию, используя + truncate +. Расширение означает, что это HTML-страница.

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 + со сжатием. Команда запрашивает файл с нашего сервера Nginx и указывает, что можно обрабатывать сжатый контент + gzip + с помощью заголовка HTTP (+ Accept-Encoding: gzip +).

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

В ответ вы должны увидеть несколько заголовков HTTP-ответа:

Заголовки ответа Nginx

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 +.

Не только HTML-страницы, но и все остальные файлы при новой установке будут обслуживаться без сжатия. Чтобы убедиться в этом, вы можете запросить наш тестовый образ с именем + test.jpg + таким же образом.

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

Результат должен быть практически таким же, как и раньше:

Заголовки ответа Nginx

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

Еще раз, нет никакого упоминания о сжатии в выводе.

Заголовки ответов Nginx для файла 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

Следующим шагом является настройка Nginx для включения сжатия для всех форматов файлов, которые могут получить выгоду от сжатия.

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

Чтобы включить модуль + gzip + Nginx, создайте файл конфигурации с именем + gzip.conf +, используя + nano + или ваш любимый текстовый редактор.

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

Вставьте следующее содержимое.

/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.

  • + gzip_disable" msie6 "+ исключает Internet Explorer 6 из браузеров, которые будут получать сжатые файлы, поскольку IE6 вообще не поддерживает + gzip +.

  • Настройки + gzip_vary + и + gzip_proxied + гарантируют, что прокси-серверы между браузером и сервером правильно распознают сжатие.

  • + gzip_comp_level 6 + устанавливает, сколько файлов будет сжато. Чем выше число, тем выше уровень сжатия и использование ресурсов. 6 - разумная золотая середина.

  • + gzip_http_version 1.1 + используется для ограничения сжатия + gzip + браузерами, поддерживающими протокол HTTP / 1.1. Если браузер не поддерживает его, есть большая вероятность, что он также не поддерживает + gzip +.

  • + gzip_min_length 256 + говорит Nginx не сжимать файлы размером менее 256 байт. Очень маленькие файлы едва выигрывают от сжатия.

  • + gzip_types + перечисляет все типы MIME, которые будут сжаты. В этом случае список включает HTML-страницы, таблицы стилей CSS, файлы Javascript и JSON, файлы XML, значки, изображения SVG и веб-шрифты.

Чтобы включить новую конфигурацию, перезапустите Nginx.

sudo systemctl restart nginx

Шаг 4 - Проверка новой конфигурации

Следующим шагом является проверка работоспособности изменений конфигурации.

Мы можем проверить это так же, как мы это делали на шаге 2, используя + curl для каждого из тестовых файлов и проверяя вывод для заголовка` + Content-Encoding: gzip`.

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

В ответ вы должны увидеть заголовок + Content-Encoding: gzip +, которого раньше не было:

Заголовки ответа Nginx

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

Вы можете проверить все остальные файлы таким же образом:

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 +, который является файлом изображения, должен оставаться без сжатия. В обоих других примерах вы должны найти заголовок + Content-Encoding: gzip в выходных данных.

Если это так, вы успешно настроили сжатие + gzip + в Nginx!

Заключение

Изменить конфигурацию Nginx для полного использования сжатия + gzip + легко, но преимущества могут быть огромными. Не только посетители с ограниченной пропускной способностью получат сайт быстрее, но и Google будет рад, что сайт загрузится быстрее. Скорость набирает обороты как важная часть современной сети, и использование + gzip + - это один большой шаг для ее улучшения.

Related