- Настройка gzip-сжатия и кеширования в Apache2
- Чуть теории
- Необходимые модули Apache2
- Итоговый .htaccess
- gzip-сжатие
- Кеширование
- Немного в цифрах
- Полезное
- Как работает сжатие GZIP
- GZIP compression
- GZIP-сжатие данных сайта на сервере
- Содержание
- Что такое GZIP-сжатие данных сайта?
- Поддержка GZIP-сжатия браузерами
- Как проверить GZIP-сжатие данных сайта?
- Сервис PageSpeed Insights
- Сервис HTTP Compression Test
- Сервис GIDZipTest
- Виды GZIP-сжатия данных сайта
- Динамическое сжатие
- Статическое сжатие
- Как включить GZIP-сжатие данных сайта?
- Включение GZIP на сервере Apache
- Динамическое сжатие на Apache
- Статическое сжатие на Apache
- Включение GZIP на сервере Nginx
- Динамическое сжатие на Nginx
- Статическое сжатие на Nginx
- Совместное функционирование модулей
- Включение GZIP с помощью PHP
Настройка gzip-сжатия и кеширования в Apache2
Статья рассчитана на опытных пользователей, которые уже имеют некоторый опыт настройки Apache 2.4, использовали .htaccess и понимают нафига он нужен. Дальше речь пойдет о том, как настроить кеширование и gzip-сжатие файлов. Хотя правильно будет сказать не файлов, а ответа сервера ( response ). Поскольку ответ может формироваться динамически, те же изображения, JavaScript, CSS и т.д.
Чуть теории
Кеширование. Основной принцип заключается в том, что обмениваясь заголовками, сервер сообщает клиенту (браузеру) что такой-то контент можно закешировать на продолжительное время — неделя, месяц, год.. После чего, при последующих запросах этого контента, браузер будет вытягивать данные из кеша. Лафа может закончиться, когда:
- Время жизни кеша истекло;
- Пользователь очистил кеш вручную — Ctrl + F5 ,
- Закончилось доступное под кеш пространство и закешированные данные был перезаписан более новым;
- Данные были обновлены на стороне сервера;
Используя кеширование вы снижаете нагрузку на сервер и экономите клиенту трафик и время. Однако нужно понимать, что у матерого серфера кеш может полностью затираться ежедневно, а то и чаще — все зависит от количества посещаемых сайтов и объема доступной под кеш квоты.
Сжатие. Полезная штука, которая позволяет сжимать (с помощью gzip) данные на сервере и распаковывать после получения на клиенте (в браузере). Клиент должен уметь распаковывать сжатые данные, о чем он сообщает в заголовке Accept-Encoding, например:
Опять же мы экономим на трафике и, соответственно, сокращаем время ожидания. Но, при этом, чуть больше нагружаем ЦП при распаковке данных.
Необходимые модули Apache2
Для включения кеширования нам нужен модуль mod_deflate , для кеширования — mod_headers или mod_expires . Также mod_headers вам пригодится чтобы удалять заголовок ETag, он лишний и могут быть проблемы с кешированием через mod_header при включенном сжатии. Для включение выполните:
Для отключения модулей воспользуйтесь командой a2dismod :
Итоговый .htaccess
Сразу приведу пример файла .htaccess, в котором настроено кеширование и сжатие. Файл будет содержать краткие примечания, а ниже разберем все директивы и правила более детально.
Примечание
FilesMatch и Files
сопоставляют шаблон только с именем файла, поэтому вы не можете указывать пути к файлам в этих директивах.
Чтобы указать область видимости кеша, используйте следующие правила:
gzip-сжатие
Apache2 больше не поддерживает модуль mod_gzip, теперь основным модулем является mod_deflate, который мы включили ранее. Чтобы проверить что сжатие работает — убедитесь что ответ содержит заголовок Content-Encoding:
Сжатие может быть настроено для определенных MIME-типов файлов, за это отвечает правило AddOutputFilterByType .
Внимание!
Модуль deflate при сжатии может удалять заголовок Content-Length, поскольку длина сжатого ответа неизвестна на момент передачи заголовков. Однако, при удалении из ответа заголовка ETag — ситуация нормализуется. Почему?
Примечание
Сжимать изображения и видео файлы особого смысла нет — толку это даст мало, поскольку jpeg или gif уже сами по себе являются сжатыми форматами.
Кеширование
Для кеширования мы активировали модули mod_headers и mod_expires . Эти модули позволяют устанавливать заголовки в ответе сервера и подсказать браузеру схему кеширования.
Внимание!
Я замечал не понятное для меня поведение при включении mod_deflate и настройке кеширования через mod_headers . Пропадал заголовок Content-Length и кеширование переставало работать. Решение нашлось — удаление заголовка из ответа:
В случае с mod_expires сжатие и кеширование работало нормально даже с выключенным модулем mod_headers . Отпишитесь, если вы знаете почему происходит так.
Немного в цифрах
Проанализируем профит от gzip-сжатия на примере библиотеки jquery-2.0.3.js. По факту, файл (не минифицированный) весит 236,5KB. mod_deflate сжимает его до 70 KB — не плохо. При следующем запросе, если включено кеширование, даже эти 70 KB не будут загружаться по сети — браузер достанет jQuery из кеша.
Проверим как жмутся минифицированные CSS/JS файлы на примере исходников Twitter Bootstrap 3. Имеем 2 файла bootstrap.min.css (100,5 KB) и bootstrap.min.js (27,1 KB) общим весом 127,6 KB. При включенном сжатии мы получаем 16,5 KB и 7,1 KB соответственно, в общем 23,6 KB.
В обеих случаях экономия порядка 70% трафика!
Полезное
- https://github.com/h5bp/html5-boilerplate/blob/master/.htaccess (базовая настройка .htaccess)
- http://habrahabr.ru/post/154643/ (Почти идеальный .htaccess)
#apache2, #.htaccess, #cache, #gzip, #оптимизация
Источник
Как работает сжатие GZIP
сервак умирает необходимо задуматься об оптимизации. В последнем дайджесте PHP (№ 40) была упомянута ссылкой статья «How GZIP Compression Works». Исходя из статистики, 56% веб-сайтов используют GZIP. Я надеюсь, эта статья раскроет перед читателем достоинства этой технологии.
В тексте возможны ошибки (делал вычитку несколько раз, но всё же вдруг), поэтому заранее прошу прощения и прошу сообщать мне обо всех проблемах через личные сообщения, если какая-то часть перевода покажется вам некорректной.
Даже в современном мире, со скоростным интернет соединением и неограниченными хранилищами информации, сжатие данных по-прежнему актуально, особенно для мобильных устройств и стран с медленным интернет-соединением. Этот пост описывает метод де-факто сжатия без потерь для сжатия текстовых данных на веб-сайтах: GZIP.
GZIP compression
GZIP обеспечивает сжатие без потерь, иными словами, исходные данные можно полностью восстановить при распаковке. Он основан на алгоритме DEFLATE, который использует комбинацию алгоритма LZ77 и алгоритма Хаффмана.
Алгоритм LZ77
Алгоритм LZ77 заменяет повторные вхождения данных на «ссылки». Т.е. если в имеющихся данных какая-то цепочка элементов встречается более одного раза, то все последующие её вхождения заменяются «ссылками» на её первый экземпляр. Алгоритм прекрасно рассмотрен horror_x и описан здесь. Каждая такая ссылка имеет два значения: смещение и длина.
Давайте рассмотрим пример:
Original text: «ServerGrove, the PHP hosting company, provides hosting solutions for PHP projects» (81 bytes)
LZ77: «ServerGrove, the PHP hosting company, p ides solutions for jects» (73 bytes, assuming that each reference is 3 bytes)
Как вы могли заметить, слова «hosting» и «PHP» повторяются, поэтому во второй раз, когда подстрока найдена, она будет заменена ссылкой. Есть и другие совпадения, такие как «er», но т.к. это незначительно (в данном случае — «er» отсутствует в других словах), остается оригинальный текст.
Кодирование Хаффмана
Кодирование Хаффмана является методом кодирования с переменной длиной, которая назначает более короткие коды к более частым «символам». Проблема с переменной длиной кода, как правило в том, что нам нужен способ узнать, когда код закончился и начался новый, чтобы расшифровать его.
Кодирование Хаффмана решает эту проблему, создав код префикса, где ни одно кодовое слово не является префиксом другого. Это может быть более понятно на примере:
>Original text: «ServerGrove»
ASCII codification: «01010011 01100101 01110010 01110110 01100101 01110010 01000111 01110010 01101111 01110110 01100101» (88 bits)
ASCII представляет собой систему кодировки символов с фиксированной длиной, так что буква «е», которая повторяется три раза, а также является наиболее часто встречаемой буквой в английском языке, имеет такой же размер как буква «G», которая появляется только один раз. Используя эту статистическую информацию, Хаффман может создать наиболее оптимизированную систему
Huffman: «1110 00 01 10 00 01 1111 01 110 10 00» (27 bits)
Метод Хаффмана позволяет нам получить более короткие коды для «e», «r» и «v», в то время как «S» и «G» получаются более длинными. Объяснения, как использовать метод Хаффмана, выходят за рамки этого поста, но если вы заинтересовались, я рекомендую вам ознакомиться с отличным видео на Computerphile (или статьей на Хабре).
DEFLATE как алгоритм, который используется в GZIP сжатии, является комбинацией обоих этих алгоритмов.
Является ли GZIP лучшим метод сжатия?
Ответ — нет. Есть другие методы, которые дают более высокие показатели сжатия, но существует несколько хороших причин использовать этот.
Во-первых, даже при том что GZIP не самый лучший метод сжатия, он обеспечивает хороший компромисс между скоростью и степенью сжатия. Сжатие и распаковка у GZIP происходят быстро и степень сжатия на высоком уровне.
Во-вторых, нелегко внедрить новый глобальный метод сжатия данных, который смогут использовать все. Браузерам потребуется обновление, что на сегодняшний день гораздо проще за счёт автообновления. Как бы то ни было, браузеры — не единственная проблема. Chromium пытался добавить поддержку BZIP2, более лучшего метода основанного на преобразовании Барроуза-Уилера, но от него пришлось отказаться, т.к. некоторые промежуточные прокси-серверы искажали данные, т.к. не могли распознать заголовки bzip2 и пытались обработать gzip контент. Баг-репорт доступен здесь.
GZIP + HTTP
Процесс получения сжатого контента между клиентом (браузером) и сервером достаточно прост. Если у браузера есть поддержка GZIP/DEFLATE, он даёт серверу понять это благодаря заголовку “Accept-Encoding”. Тогда, сервер может выбрать — отправлять содержимое в сжатом или оригинальном виде.
Реализация
Спецификация DEFLATE обеспечивает некоторую свободу разработчикам реализовать алгоритм с использованием различных подходов, пока полученный поток совместим со спецификацией.
GNU GZIP
7-zip так же доступен для Windows и обеспечивает реализацию для других методов сжатия, таких как 7z, xz, bzip2, zip и прочих.
Zopfli
Zopfli идеально подходит для одноразового сжатия, например в ситуациях, когда файл единажды сжимается и многоразово используется. Он в 100 раз медленнее, но сжатие на 5% лучше, чем у других. Хабрапост.
Включение GZIP
Apache
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
Существует несколько известных багов в некоторых версиях браузеров, поэтому рекомендуется* также добавить:
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
Header append Vary User-Agent
*это решение на текущий момент уже потеряло актуальность, как и вышеуказанные браузеры, поэтому данную информацию можно воспринимать в ознакомительных целях
Кроме того, можно использовать предварительно сжатые файлы вместо того, чтобы сжимать их каждый раз. Это особенно удобно для файлов, которые не меняются при каждом запросе, например CSS и JavaScript, которые могут быть сжаты с использованием медленных алгоритмов. Для этого:
Это даёт Apache понять, что файлы с расширением .gz должны предоставляться сжатыми (линия 2), нужно проверить доступность принятия gzip браузером (линия 3), и если сжатый файл существует (линия 4), мы добавляет .gz для запрашиваемого файла.
Nginx
gzip on;
gzip_min_length 1000;
gzip_types text/plain application/xml;
Источник
GZIP-сжатие данных сайта на сервере
GZIP-сжатие страниц сайта обеспечивает значительное (до 90%) уменьшение объёма соответствующего веб-трафика, увеличивая скорость загрузки сайта и снижая нагрузку на сервер.
Содержание
Что такое GZIP-сжатие данных сайта?
GZIP-компрессор использует алгоритм сжатия Deflate, в результате работы которого происходит замена и перекодировка повторяющихся фрагментов данных.
GZIP-сжатие продуктивно применяется по отношению к текстовой информации, которой заполнено большинство веб-ресурсов (в том числе файлы с расширениями .html , .js , .css , .svg ).
| Файл | Размер | Размер в сжатом виде | Разница | Коэффициент сжатия |
|---|---|---|---|---|
| uikit.js | 119 КБ | 22 КБ | 97 КБ | 82% |
| uikit.min.js | 57 КБ | 15 КБ | 42 КБ | 74% |
| uikit.css | 181 КБ | 30 КБ | 151 КБ | 83% |
| uikit.min.css | 105 КБ | 19 КБ | 86 КБ | 81% |
Данные таблицы наглядно демонстрируют очень высокую эффективность применения GZIP-сжатия как для обычных, так и для предварительно минифицированных файлов.
Коэффициент сжатия может отличаться в зависимости от содержания и размера файла и может достигать значения в 90%.
Аргументы в пользу применения GZIP-сжатия данных сайта:
Уменьшение объёма веб-трафика Это особенно актуально в мобильных сетях: не все используют безлимитный интернет на мобильных устройствах. Снижение нагрузки на сервер несмотря на то, что серверу постоянно приходится сжимать передаваемые данные, нагрузка снижается за счет уменьшения их объёма. Увеличение скорости загрузки сайта Уменьшается объём трафика — сайт загружается быстрее. Поддержка всеми современными браузерами Сжатые данные будут быстро распаковываться и отображаться в любых современных браузерах.
Поддержка GZIP-сжатия браузерами
Как уже отмечалось, современные браузеры, такие как Chrome, Firefox, Edge, а также мобильные их версии, без проблем формируют веб-страницы из полученной от сервера сжатой информации.
Прежде, чем послать браузеру сжатые данные, сервер получает от него HTTP-заголовок запроса Accept-Encoding , в котором сообщается, какие способы кодирования данных браузер поддерживает:
Если сервер убеждается в том, что браузер поддерживает GZIP-сжатие (получает от браузера HTTP-заголовок Accept-Encoding: gzip ), то он передаёт данные в сжатом виде (если эта возможность активирована), при этом формируя HTTP-заголовок ответа Content-Encoding: gzip :
Если HTTP-заголовок запроса браузера Accept-Encoding не подтверждает поддержку GZIP, или передача сжатых данных не настроена на сервере, то данные передаются в несжатом виде.
Как проверить GZIP-сжатие данных сайта?
На многих веб-серверах по умолчанию применяется динамическое GZIP-сжатие веб-страниц на лету. Чтобы проверить сжатие GZIP онлайн для определённого сайта, существует ряд способов, включающих утилиты для браузера и специализированные веб-сервисы.
Сервис PageSpeed Insights
Онлайн-сервис PageSpeed Insights позволяет оценить практически все значимые факторы, влияющие на скорость загрузки веб-страницы, в том числе и сжатие передаваемых данных.
Если сжатие не осуществляется, то в списке актуальных для проверенной веб-страницы рекомендаций по оптимизации скорости загрузки будет содержаться рекомендация «Включите сжатие» со списком всех ресурсов, вес которых можно уменьшить при передаче, а также коэффициент сжатия и результат уменьшения для каждого отдельного ресурса и веб-страницы в целом:
Сервис HTTP Compression Test
Сервис HTTP Compression Test является узконаправленным и определяет, активировано ли сжатие данных для веб-страницы, а также общий объём сжимаемых данных страницы в обычном и сжатом виде. Если GZIP-сжатие не применяется, то сервис отображает, насколько результативным будет его активация:
Сервис GIDZipTest
Сервис GIDZipTest также определяет, передаёт ли страница веб-трафик в сжатом виде в режиме онлайн. Но кроме этого отчет содержит информацию о возможных результатах применения GZIP-компрессии, а также сводку по передаваемым HTTP-заголовкам веб-страницы:
Виды GZIP-сжатия данных сайта
Существует статическое и динамическое GZIP-сжатие данных.
Динамическое сжатие
Динамическое GZIP-сжатие подразумевает сжатие сервером указанных в конфигурационных файлах данных при передаче браузеру («на лету»). Чтобы задействовать этот тип сжатия данных сайта, достаточно активировать на сервере необходимые модули.
Статическое сжатие
Статическое GZIP-сжатие подразумевает передачу сервером предварительно сжатых файлов, размещенных на сайте с расширением .gz .
Чтобы обеспечить статическое сжатие данных сайта, необходимо предварительно сжать нужные статические файлы (CSS, JS, SVG) в формате GZIP, например с помощью архиватора 7zip, и разместить в соответствующие директории с расширениями .gz . После этого необходимо внести в конфигурационный файл сервера директивы, обеспечивающие передачу сжатых файлов вместо обычных.
Этот приём позволяет снизить нагрузку на сервер, исключая процесс регулярного сжатия передаваемой информации, но требует ручного обновления сжатых файлов, если это будет необходимо.
Как обеспечить тот или иной тип сжатия для сайта читайте далее.
Как включить GZIP-сжатие данных сайта?
Чтобы включить сжатие, необходимо убедиться, что веб-сервер поддерживает эту возможность. Можно уточнить этот момент в службе поддержки хостинг-провайдера. Если сжатие поддерживается, то нужно внести изменения в конфигурационные файлы.
Следует учитывать, что GZIP-компрессор сжимает любой поток байтов, но некоторые данные, например в файлах изображений, уже являются в некоторой мере сжатыми. Очередное сжатие таких данных посредством GZIP не принесёт ни какого результата, но создаст лишнюю нагрузку на сервер. Поэтому активация этой функции сопровождается указанием серверу на то, какие типы данных должны подвергаться сжатию.
| Тип данных | Категория | Расширение | MIME-тип |
|---|---|---|---|
| Обычный текст | — | — | text/plain |
| HTML | Разметка | .html | text/html |
| XHTML | Разметка | .xhtml | application/xhtml+xml |
| XML | Разметка | .xml | application/xml, text/xml |
| CSS | Стили | .css | text/ CSS ( Cascading Style Sheets — каскадные таблицы стилей ) — формальный веб-ориентированный язык, предназначенный для форматирования HTML-элементов. |
«>css
Включение GZIP на сервере Apache
На серверах Apache (от версии 2) применяется модуль mod_deflate, включение которого обеспечивает динамическое (на лету) сжатие передаваемых сервером данных.
Динамическое сжатие на Apache
Чтобы включить динамическое GZIP-сжатие на сервере Apache, нужно разместить в файле httpd.conf (при возможности) или в .htaccess (размещается в корневой папке сайта) следующий код:
Директива AddOutputFilterByType DEFLATE содержит список всех MIME-типов данных, которые должны подвергаться сжатию, разделённых пробелом. Код получился не удобным для восприятия. Для его оптимизации можно применять символ обратной косой черты \ перед переносом строк в директиве. В результате перенос строки не будет считаться таковым и код станет более комфортным для восприятия:
Типы данных для сжатия в файле .htaccess указывается в формате MIME, в качестве разделителей могут выступать пробел(ы) и перенос(ы) строк, если перед переносом строки поставить символ \ (экранирование).
Также для отдельных категорий типов данных можно указывать отдельную директиву AddOutputFilterByType DEFLATE , чтобы избежать использования символа экранирования:
Условия выполнения сжатия (доступность модулей mod_deflate и mod_filter ) в файле .htaccess могут быть представлены в другом виде:
После активации GZIP в файле .htaccess следует проверить его работу. Если сайт работает не на Apache, или модуль mod_deflate не активирован, то сжатие работать не будет.
Если после внесения изменений в файл .htaccess GZIP-сжатие данных сайта не заработало, то следует обратиться в службу поддержки хостинг-провайдера.
Статическое сжатие на Apache
После предварительного сжатия и размещения файлов с расширением .gz на сайте, в файл конфигурации ( httpd.conf или .htaccess ) необходимо прописать следующие строки:
Пояснение значений директив:
RewriteEngine On Активирует модуль перенаправлений (редиректов). AddEncoding gzip .gz Указывает, что файлы с расширением .gz сжаты методом GZIP. RewriteCond %
Включение GZIP на сервере Nginx
Для сжатия на серверах Nginx применяются модули ngx_http_gzip_module (для динамического сжатия) и ngx_http_gzip_static_module (для динамического сжатия).
Динамическое сжатие на Nginx
Чтобы активировать модуль ngx_http_gzip_module необходимо в конфигурационном файле nginx.conf прописать следующий код:
Пояснение значений директив:
gzip on Активирует модуль. gzip_comp_level 5 Устанавливает степень сжатия на 5 из 9. Опытным путём доказано, что устанавливать значение выше 5 не целесообразно, т. к. это увеличит нагрузку на сервер, при этом данные будут сжиматься не значительно. gzip_types MIME-типы данных для сжатия, разделённые пробелами.
Описание всех возможных директив модуля ngx_http_gzip_module смотрите на официальном сайте.
Статическое сжатие на Nginx
Для обеспечения передачи сервером предварительно сжатых файлов в файл конфигурации nginx.conf нужно добавить строку:
Совместное функционирование модулей
Для совмещения динамического и статического сжатия на сервере Nginx можно применить следующий код:
Это обеспечит передачу предварительно сжатых файлов с расширением .gz при их наличии, а при отсутствии будет происходить динамическое сжатие передаваемых данных.
Включение GZIP с помощью PHP
Реализация GZIP-сжатия данных веб-страниц возможна средствами PHP, в частности с помощью PHP-модуля zlib (должен быть активирован).
Например, для сжатия веб-страницы можно разместить перед тегом html PHP-файла, формирующего саму страницу, следующий код:
Источник