Поиск по сайту:

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


Введение

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

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

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

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

Предпосылки

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

  • Один сервер Ubuntu 14.04 с пользователем sudo без полномочий root
  • Nginx установлен на вашем сервере, следуя руководству How To Install Nginx on Ubuntu 14.04.

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

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

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

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

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

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

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

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

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

Шаг 2 — Проверка поведения по умолчанию

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

Давайте проверим, обслуживается ли файл HTML с именем test.html со сжатием. Команда запрашивает файл с нашего сервера Nginx и указывает, что можно обслуживать сжатый контент gzip с помощью заголовка HTTP (Accept-Encoding: gzip).

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

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

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 сжатие gzip в Nginx включается автоматически после установки с настройками по умолчанию.

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

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

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

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.

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

Шаг 3 — Настройка параметров gzip Nginx

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

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

  1. sudo nano /etc/nginx/nginx.conf

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

. . .
##
# `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.

После применения этих изменений раздел настроек должен выглядеть так:

. . .
##
# `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.

  1. sudo service nginx restart

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

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

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

  1. curl -H "Accept-Encoding: gzip" -I http://localhost/test.html
  2. curl -H "Accept-Encoding: gzip" -I http://localhost/test.jpg
  3. curl -H "Accept-Encoding: gzip" -I http://localhost/test.css
  4. curl -H "Accept-Encoding: gzip" -I http://localhost/test.js

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

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

Заключение

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