Как добавить модуль gzip в Nginx в Ubuntu 14.04

Вступление

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

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

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

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

Предпосылки

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

[[step-1 -—- created-test-files]] == Шаг 1. Создание тестовых файлов

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

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

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

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

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

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

Таким же образом создадим еще несколько тестовых файлов: один файл изображенияjpg, одну таблицу стилейcss и один файл JavaScriptjs.

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

[[step-2 -—- verify-the-default-behavior]] == Шаг 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.4.6 (Ubuntu)
Date: Tue, 19 Jan 2016 20:04:12 GMT
Content-Type: text/html
Last-Modified: Tue, 04 Mar 2014 11:46:45 GMT
Connection: keep-alive
Content-Encoding: gzip

В последней строке вы можете увидеть заголовокContent-Encoding: gzip. Это говорит нам о том, что для отправки этого файла использовалось сжатиеgzip. Это произошло потому, что в Ubuntu 14.04 Nginx автоматически включил сжатиеgzip после установки с настройками по умолчанию.

Однако по умолчанию Nginx сжимает только файлы HTML. Каждый другой файл при новой установке будет обслуживаться без сжатия. Чтобы убедиться в этом, вы можете запросить наше тестовое изображение с именемtest.jpg таким же образом.

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

Результат должен немного отличаться от предыдущего:

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

HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Date: Tue, 19 Jan 2016 20:10:34 GMT
Content-Type: image/jpeg
Content-Length: 0
Last-Modified: Tue, 19 Jan 2016 20:06:22 GMT
Connection: keep-alive
ETag: "569e973e-0"
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.4.6 (Ubuntu)
Date: Tue, 19 Jan 2016 20:20:33 GMT
Content-Type: text/css
Content-Length: 0
Last-Modified: Tue, 19 Jan 2016 20:20:33 GMT
Connection: keep-alive
ETag: "569e9a91-0"
Accept-Ranges: bytes

[[step-3 -—- configuring-nginx-39-s-gzip-settings]] == Шаг 3. Настройка параметров gzip Nginx

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

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

sudo nano /etc/nginx/nginx.conf

Найдите раздел настроекgzip, который выглядит так:

/etc/nginx/nginx.conf

. . .
##
# `gzip` Settings
#
#
gzip on;
gzip_disable "msie6";

# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
. . .

Вы можете видеть, что по умолчанию сжатиеgzip разрешено директивойgzip on, но некоторые дополнительные настройки закомментированы знаком комментария#. Мы внесем несколько изменений в этот раздел:

  • Включите дополнительные настройки, раскомментировав все закомментированные строки (т.е. удалив# в начале строки)

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

  • Добавьте в директивуgzip_types дополнительные типы файлов, обозначающие веб-шрифты, значкиico и изображения SVG.

После того, как эти изменения были применены, раздел настроек должен выглядеть следующим образом:

/etc/nginx/nginx.conf

. . .
##
# `gzip` Settings
#
#
gzip on;
gzip_disable "msie6";

gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
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/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;
. . .

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

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

sudo service nginx restart

[[step-4 -—- verifying-the-new-configuration]] == Шаг 4 - Проверка новой конфигурации

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

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

curl -H "Accept-Encoding: gzip" -I http://localhost/test.html
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