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

Обсудить

Введение

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

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

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

Из данной статьи вы узнаете, как настроить nginx, установленный на сервере с Ubuntu 14.04, так, чтобы утилита gzip использовалась для сжатия нужных файлов перед отправкой их пользователю.

Требования

Для выполнения всех шагов этого руководства вам понадобятся:

  • сервер с установленной ОС Ubuntu 14.04 и пользователем, который может выполнять команды sudo;
  • установленный на сервере nginx.

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

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

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

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

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

При помощи команды truncate создайте тестовый файл primer.html в nginx (директории по умолчанию). Расширение указывает на то, что это веб-страница:

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

Далее создайте еще несколько файлов с разными расширениями: один - изображение в формате jpg, другой – таблица стилей в формате css, а третий – JavaScript-файл в формате js:

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

Шаг 2: проверка действий сервера по умолчанию

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

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

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

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

HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Date: Tue, 9 Feb 2016 15:05:34 GMT
Content-Type: text/html
Last-Modified: Tue, 04 Mar 2014 18:37:19 GMT
Connection: keep-alive
Content-Encoding: gzip

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

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

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

И вы увидите немного отличающийся от предыдущего ответ:

HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Date: Tue, 9 Feb 2016 15:11:57 GMT
Content-Type: image/jpeg
Content-Length: 0
Last-Modified: Tue, 9 Feb 2016 15:07:38 GMT
Connection: keep-alive
ETag: "569e973e-0"
Accept-Ranges: bytes

Заголовка Content-Encoding: gzip, который присутствовал в предыдущем ответе, нет, а значит, отправленный файл не подвергался сжатию.

Подобный тест можно провести и с использованием файла primer.css:

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

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

HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Date: Tue, 9 Feb 2016 15:25:43 GMT
Content-Type: text/css
Content-Length: 0
Last-Modified: Tue, 9 Feb 2016 15:23:36 GMT
Connection: keep-alive
ETag: "569e9a91-0"
Accept-Ranges: bytes

Шаг 3: настройка gzip в nginx

Теперь вам необходимо настроить сервер nginx так, чтобы gzip сжимал не только файлы в формате html, но и другие файлы, которые выгодно отправлять в сжатом виде.

Для того, чтобы изменить настройки gzip на сервере nginx, откройте настройки nginx в редакторе nano (или в другом, удобном вам текстовом редакторе):

$ 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_type, которой вы определите, какие еще типы файлов будет сжимать gzip (например, иконки, изображения в формате 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:

$ sudo service nginx restart

Шаг 4: проверка новой конфигурации

Заключительным шагом является проверка, все ли работает так, как нужно.

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

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

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

Если это так, значит, вы настроили nginx верно.

Заключение

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

VDS/VPS

Комментарии

С помощью соцсетей
У меня нет аккаунта Зарегистрироваться
Нажимая кнопку «Зарегистрироваться», я даю согласие на обработку своих персональных данных, указанных в форме регистрации.
С помощью соцсетей
У меня уже есть аккаунт Войти
Нажимая кнопку «Зарегистрироваться», я даю согласие на обработку своих персональных данных, указанных в форме регистрации.
Инструкции по восстановлению пароля высланы на Ваш адрес электронной почты.
Пожалуйста, укажите email, который Вы использовали для входа на сайт.