Введение
Скорость загрузки вашего веб-сайта напрямую связана с объемом всех файлов, которые необходимо загрузить браузеру. Поэтому чем меньше вес этих файлов, тем быстрее загружается ваш ресурс.
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, несложно, но выгода от использования этой утилиты может быть огромной. Рады будут не только пользователи из-за того, что сайт будет загружаться быстрее, но и поисковые системы, так как время загрузки ресурса напрямую влияет на ранжирование сайта в поисковой выдаче.
Комментарии