12 способов как ускорить загрузку сайта на Битрикс
Узнай как можно ускорить загрузку сайта на Битрикс в браузере. А так же основные понятия, используемые при оптимизации скорости сайта — CDN, минимизация css, минимизация js и прочее полезное.
Это перевод статьи на тему ускорения загрузки сайта, от 12 декабря 2006 года. Может показаться, что это пыльное старьё, но рекомендаций актуальны и на сегодняшний день.
Оригинал статьи — «Best Practices for Speeding Up Your Web Site».
1. Свести к минимуму HTTP-запросы
80% времени отклика для конечного пользователя тратится на внешний интерфейс (front-end). Большая часть этого времени связана с загрузкой всех компонентов веб-страницы: изображений, таблиц стилей, скриптов, флэш-роликов и др. Чем меньше этих компонентов, тем меньше требуется HTTP-запросов для создания страницы. Это ключевой момент для создания быстрых страниц.
Один из вариантов сократить количество компонентов веб-страницы — это упростить ее дизайн. Но можно ли создавать страницы с разнообразным и богатым содержимым, и при этом с небольшим временем отклика? Вот несколько способов сократить количество HTTP-запросов, сохранив дизайн страницы.
С помощью объединения файлов можно сократить количество HTTP-запросов, объединив все скрипты в один и все таблицы стилей — в один файл стилей. Объединение файлов становится более сложной задачей, когда скрипты и таблицы стилей различаются от страницы к странице, но, включив это в свой релиз, вы улучшите время отклика.
CSS-спрайты предпочтительны для уменьшения числа изображений. Объедините фоновые изображения в одно и используйте такие свойства CSS, как background-image и background-position для отображения нужной области.
Карты изображений объединяют несколько изображений в одно. Суммарный размер остается почти прежним, но загрузка страницы ускоряется за счёт меньшего количества HTTP-запросов. Карты изображений применимы лишь в случае смежных картинок, к примеру, панель навигации. Определение координат для карты может потребовать довольно много времени и внимания. Для навигации карты изображений неудобны и поэтому не рекомендуются к использованию.
Встроенные изображения используют схему data: URL scheme для вставки данных изображения прямо на страницу. Это может увеличить размер файла HTML. Чтобы сократить количество HTTP-запросов и не увеличивать размер веб-страницы, встроенные изображения можно сохранять в CSS-файлах (кэширующихся). Встроенные изображения пока поддерживаются не всеми основными браузерами (в частности, не поддерживаются Internet Explorer 5–7, дата публикации — 12 дек. 2006 г. Современный Internet Explorer 11 поддерживает встроенные изображения. Прим. перев.)
Начните с сокращения количества HTTP-запросов на странице. Это важнейшая рекомендация для улучшения производительности страницы у новых посетителей. Как показано в блоге Tenni Theurer Browser Cache Usage — Exposed!, 40-60% ежедневных посетителей сайта приходят с пустым кэшем. Быстрая загрузка страницы при первом посещении улучшает впечатление пользователя от вашего сайта.
Про «1С-Битрикс»
В системе есть штатная функция объединения и сжатия CSS- и JS-файлов, которая включается в настройках главного модуля. При включении этой опции в идеальном случае на странице подключается 3 CSS и 3 JS-файла.
Бывают ситуации, когда штатная опция работает не так как нужно, например, не учитывает условные комментарии для IE ( ), т.е. условие пропадёт, а «специальный файл» пойдёт в общую солянку. Из предыдущего абзаца следует, что Битрикс подключает служебные CSS- и JS-файлы, как сэкономить на их подключении можно прочитать в этом посте.2. Использовать сеть доставки контента (CDN — Content Delivery Network)
Расстояние от пользователя до вашего веб-сервера влияет на время отклика. Размещение контента на множестве серверов с различным местоположением позволит пользователям быстрее загружать ваши страницы. Но с чего начать?
Прежде всего, не пытайтесь переписать ваше приложение для работы в распределенной архитектуре. В зависимости от приложения, изменение архитектуры может включать обескураживающие задачи, к примеру, синхронизацию состояния сессии и репликацию транзакций базы данных на различных серверах. Попытки сократить расстояние между пользователями и вашим контентом могут застрять и не пойти дальше этого шага в разработке архитектуры.
Помните, что 80-90% времени отклика для конечного пользователя определяется временем загрузки компонентов страницы: картинок, стилей, скриптов, Flash-роликов. Это — золотое правило производительности. Лучше заняться распределением статического контента, чем браться за сложную задачу модификации архитектуры приложения. Это не только существеннее сократит время отклика, но это и легче благодаря сетям доставки контента.
Сеть доставки контента (CDN) — это группа веб-серверов, распределенных по различным местоположениям, чтобы обеспечить наиболее эффективную доставку контента пользователям. Обычно для доставки контента конкретному пользователю выбирается ближайший по сети сервер, например, с минимальным количеством перенаправлений между сетями или минимальным временем отклика.
Некоторые крупные интернет-компании располагают собственной CDN, но экономичнее использовать CDN-службу провайдера, к примеру, Akamai Technologies, EdgeCast или level3. Стартапы и частные веб-сайты, возможно, не могут позволить себе CDN-службу, но с ростом вашей целевой аудитории и переходом на глобальный уровень CDN становится необходимой. В Yahoo! службы, перенесшие свой статический контент с веб-серверов приложений на CDN (как сторонние, так и внутренние CDN-службы Yahoo), улучшили время отклика для конечных пользователей на 20% и более. Переход на CDN — относительно легкое изменение программного кода, которое значительно улучшит время загрузки вашего сайта.
Про «1С-Битрикс»
«1С-Битрикс: Управление сайтом» — первая российская CMS, интегрированная с сетью CDN на уровне самой платформы! Любой владелец сайта может значительно ускорить свой проект буквально в «один клик» без каких-либо дополнительных настроек!
Подключение: в административной панели вашего сайта в разделе «Настройки» — «Облачные сервисы Битрикс» — «Ускорение сайта (CDN)» отметьте галочку «Включить ускорение сайта» и сохраните изменения.
3. Добавить заголовок Expires или Cache-Control
Это правило включает в себя два аспекта:
- Статические компоненты: установите политику «Never expire» в заголовке Expires
- Динамические компоненты: используйте подходящий заголовок Cache-Control для условных запросов браузера.
Дизайн веб-страниц становится все богаче, что означает все большее количество скриптов, стилей, изображений и Flash-роликов на странице. Новому посетителю придется выполнить несколько HTTP-запросов, но с помощью заголовка Expires можно кэшировать эти компоненты. Это позволяет избежать ненужных HTTP-запросов при последующих обращениях к странице. Заголовки Expires часто используются с изображениями, но их следует применять на всех компонентах страницы, включая скрипты, стили и Flash-ролики.
Браузеры (и прокси-серверы) используют кэш для сокращения количества и размеров HTTP-запросов для ускорения загрузки веб-страниц. Веб-сервер использует заголовок Expires в HTTP-запросе, чтобы указать длительность хранения компонента в кэше клиента. К примеру, этот заголовок Expires сообщает браузеру, что данный компонент будет актуален до 10 апреля 2010:
Expires: Thu, 15 Apr 2010 20:00:00 GMT
Если ваш сервер работает на Apache, используйте директиву ExpiresDefault для срока кэширования по отношению к текущей дате. Этот пример директивы ExpiresDefault устанавливает срок хранения на 10 лет относительно текущей даты.
ExpiresDefault «access plus 10 years»
Имейте в виду, что, если вы используете заголовок Expires, вам придется изменить имя компонента при изменении его содержания. В Yahoo! это входит в процесс сборки: номер версии содержится в имени компонента, к примеру, yahoo_2.0.6.js.
Применение заголовка Expires влияет только на просмотр страницы при повторном посещении. Количество HTTP-запросов для новых посетителей с пустым кэшем остается прежним. Следовательно, влияние на производительность зависит от того, как часто пользователи загружают вашу страницу с «полным» кэшем. («Полный» кэш уже содержит все компоненты веб-страницы). В Yahoo! мы провели измерения и обнаружили, что процент посетителей с «полным» кэшем — 75-85%. С помощью заголовка Expires можно увеличить количество компонентов, которые кэшируются в браузере и используются при повторных посещениях страницы, не нагружая интернет-подключение пользователя.
4. Использовать сжатие GZip
Время передачи HTTP-запроса и отклика можно существенно сократить с помощью фронт-энд решений. Конечно, пропускная способность подключения пользователя, его провайдер, расположение в сети и т.д. не зависят от разработчиков. Но есть и другие параметры, влияющие на время отклика. Сжатие сокращает время отклика за счёт уменьшения размера HTTP-отклика.
Начиная с HTTP/1.1, веб-клиенты поддерживают сжатие с заголовком Accept Encoding в HTTP-запросе.
Accept-Encoding: gzip, deflate
Если веб-сервер обнаруживает в запросе этот заголовок, он может сжать компоненты HTTP-отклика с помощью одного из методов, перечисленных клиентом. Веб-сервер оповещает об этом клиента с помощью заголовка Content-Encoding в HTTP- отклике.
Content-Encoding: gzip
Gzip — самый распространённый и эффективный метод сжатия (на дату написания статьи — 12 дек. 2006 г. — Прим. перев.). Другой алгоритм сжатия, который может вам встретиться, — deflate, но он менее эффективен и популярен.
Gzip-сжатие сокращает размер отклика примерно на 70%. Приблизительно 90% интернет-трафика (на дату написания статьи) передается через браузеры, заявляющие о поддержке gzip. Если вы используете Apache, модуль, определяющий настройки сжатия, зависит от версии: Apache 1.3 использует mod_gzip, а Apache 2.x — mod_deflate.
Известны некоторые проблемы с браузерами и прокси-серверами, которые могут вызвать несоответствие между тем, что браузер ожидает получить, и получаемым сжатым контентом. К счастью, эти проблемы сокращаются по мере обновления браузеров. Модули Apache автоматически добавляют к отклику подходящие заголовки Vary.
Веб-серверы определяют, что сжимать, на основании типа файла, но обычно довольно ограничены в этом выборе. Большинство сайтов сжимают HTML-документы. Также стоит сжимать скрипты и стили, но многие сайты упускают эту возможность. В принципе, имеет смысл сжимать любой текстовый отклик, включая XML и JSON. Изображения и PDF- файлы сжимать не стоит, так как они уже сжаты. Применение к ним gzip не только напрасно увеличивает нагрузку на процессор, но также может увеличить размер файла.
Максимально широкое применение сжатия к различным типам файлов — простой способ уменьшить размер страницы и улучшить впечатление пользователя.
5. Располагать таблицы стилей в начале документа
Во время исследования производительности в Yahoo! мы обнаружили, что в результате переноса таблиц стилей в раздел страницы HEAD страница кажется более быстрой. Причина этого в том, что при расположении стилей в разделе HEAD страница визуализируется постепенно.
Разработчики фронт-энда, заинтересованные в высокой производительности, предпочитают постепенную загрузку страницы, то есть, мы хотим, чтобы браузер отображал имеющийся контент по мере его получения. Это особенно важно для высоконагруженных страниц и пользователей с медленным подключением. Существуют исследования и документы, доказывающие важность обратной связи для пользователей, например, индикаторов загрузки. В нашем случае HTML-страница и есть индикатор загрузки! При постепенной загрузке шапки, навигационной панели, логотипа в шапке все эти компоненты выполняют функцию обратной связи для пользователя, ожидающего загрузки страницы. Это улучшает общее впечатление пользователя.
Проблема с расположением стилей в нижней части документа состоит в том, что это блокирует постепенную загрузку во многих браузерах, включая Internet Explorer. Эти браузеры блокируют визуализацию, чтобы не пришлось перерисовывать элементы в случае изменения стилей. В результате пользователь видит пустую белую страницу.
Спецификация HTML явно подчеркивает, что таблицы стилей должны находиться в разделе HEAD: «В отличие от элемента A, элемент LINK может находиться только в разделе HEAD, но появляться может неограниченное число раз». Ни одна из альтернатив, пустой белый экран или поток нестилизованного контента, риска не стоит. Наилучшее решение — следовать спецификации HTML и загружать стили в разделе HEAD.
Для ещё большего ускорения загрузки сайта объединённый CSS-файл можно перенести вниз страницы, перед закрывающим тегом