Ускорение работы сайта на CMS Drupal

Скорость сайта это один из его самых важных параметров. Если сайт будет загружаться долго, то посетитель просто уйдет c сайта, не дождавшись загрузки. Гугл так же стал обращать внимание на скорость загрузки сайта и понижает позиции сайта, если он медленный.  

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

Есть два классных инструмента для проверки скорости сайта - YSlow и GTmetrix,  их нужно использовать после каждого внесения изменения. Записывай ключевые параметры измерений (загрузку страницы, размер страницы, число HTTP запросов и общую оценку в баллах) перед каждым внесением изменений, чтобы быть уверенным, что ты двигаешься в правильном направлении. Также можно попробывать JMeter и Apache Bench.

Встроенное кеширование  и аггрегация

ВКЛЮЧИ ВСТРОЕННОЕ КЭШИРОВАНИЕ

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

Включить встроенное кэширование можно на странице настройки производительности: Конфигурация -> Производительность (Configuration -> Performance) admin/config/development/performance.

ВКЛЮЧИ ВСТРОЕННОЕ КЭШИРОВАНИЕ БЛОКОВ

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

Включить встроенное кэширование блоков можно на странице настройки производительности: Конфигурация -> Производительность (Configuration -> Performance) admin/config/development/performance.

ВКЛЮЧИ ВСТРОЕННУЮ CSS И JS АГГРЕГАЦИЮ.

В той же админской форме, где настройка кэширования страниц, ты можешь включить CSS и JSS аггрегацию.          

Данная аггрегация уменьшает количество HTTP запросов за счет преобразования множества CSS и Javascript файлов в несколько компактных файлов.     

Кэширование представлений (views)

ВКЛЮЧИТЕ КЭШИРОВАНИЯ ПРЕДСТАВЛЕНИЙ (VIEWS)

Представления - самый популярный модуль в Друпале (в Друпал 8 он включен в ядро) и используется на большинстве сайтов.

Без кеширования, каждый раз когда пользователь загружает страницу происходит запрос к базе данных, множество таких запросов очень удлиняют время загрузки страницы. Если кэш представлений включен, то результат сохраняется в таблице кэша представлений, что значительно уменьшает количество запросов. 

Кэширование представлений очень классная штука для залогниненных пользователей, т.к. результат кэширования остается даже,  если остальные части страницы нет.

Включи кэширование содержимого представлений (Views Content Cache) 

Обратная сторона кэширования представлений в том, что результаты отображается не в реальном времени. Если Вы установите кэширование на 10 минут, результат не будет обновлятся в течении 10 минут. Если контент изменится, то в течении 10 минут эти изменения отображаться не будут.

Views Content Cache решает эту проблему. Он проверяет изменился ли контент и, если контент изменился, то кэш обновляется.

После активации модуля, заходим в базовые настройки представления: в настройках кэширования, выберите соответствующий тип кэширования.

Включи кэширования блоков для представлений (views block cache)  

У друпала имеется встроенное кэширование для блоков. Но, по умолчанию, блоки представлений исключаются из кэширования, поэтому для их кэширования нужно использовать кэширование блоков для представлений.

Заходим в редактирование нужного нам представления и в advanced settings видим опцию кэширования блоков (Block caching)и в ней выбираем настройки кэширования (глобально, постранично, по роли, по пользователю).

Включи Лайтпейджер для представлений (Views Litepager)

Если Вы используете родной пейджер или мини-пейджер, то требуется запрос COUNT для всех страниц для корректного отображения пейджера. Это добавляет время для исполнения и особенно, когда используется InnoDB.

Views Litepager избавляет от необходимости использовать запросы COUNT отображая только ссылки "Предыдущая", "Следующая". Вы потеряете немного функциональности, зато выиграете в скорости.

Делай HTML файлы статичными

ВКЛЮЧИ BOOST

Boost  превращает все страницы Друпала в статичные HTML файлы и хранит их в папке для кэширования на диске сервера. Когда пользователь посещает страницу, сервер возвращает ему закэшированную страницу с диска без использования  PHP и MySQL - это дает огромный прирост в скорости.  Boost очень хорошо показывает себя на небольших сайтах на шаред хостингах (обычные), где не установлен Varnish (Varnish кэширует в память вместо файловой системы и это получается быстрее). Boost работает для анонимных пользователей, для залогниненных пользователей Boost не кэширует страницы.

Ускоряй страницы с ошибкой 404

ВКЛЮЧИ МОДУЛЬ FAST 404

Скорость загрузки страниц может очень сильно увеличиться, если на сайте много битых ссылок на картинки и файлы CSS. Друпал всё равно будет пытаться загружать эти ссылки на каждой странице, где они расположены, но они будут возвращать ошибку 404 (страница не найдена). Друпал будет проводить весь цикл загрузки страницы, даже если выдается ошибка 404, что ведет к очень большому напрасному расходу ресурсов.

 Fast 404 модуль меняет эту ситуацию отдавая легкие сообщения при возникновении ошибки 404.

Избавляйся от ненужных модулей

УДАЛИ МОДУЛЬ СТАТИСТИКИ (STATISTICS MODULE)

Модуль статистики (Statistics module) собирает данные подобно Гугл Аналитик (Google Analytics) столько раз сколько раз контент просматривается. Это добавляет множественные записи в базу данных при каждой загрузке страницы.

Рекомендуется использовать Google Analytics (или подобную) вместо того, чтобы хранить эти записи в базе данных. Вы можете использовать Google Analytics Reports модуль, чтобы видеть данные гугл аналитики на друпал сайте.

ВЫКЛЮЧИ PHP FILTER

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

Чтобы это исправить, просто отключите модуль PHP Filter. Но сам модуль не удаляйте, т.к. он  модуль ядра друпала.

ВЫКЛЮЧИ UPDATE MANAGER

Update Manager обращается к Drupal.org, чтобы проверить нуждаются ли модули на сайте в обновлении. Проверяя, он добавляет нагрузку на сайт.

Update Manager лучше запускать на версии сайта для разработки, а не на живом сайте.

Уменьшай число модулей

ОГРАНИЧИВАЙ ЧИСЛО ИСПОЛЬЗУЕМЫХ МОДУЛЕЙ

Любой установленный и включенный модуль замедляет загрузку страницы. Поэтому перед установкой модуля всегда задавай себе вопрос "А зачем он мне, вообще, нужен? Возможно ли обойтись без него?"

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

СНАЧАЛА ОТКЛЮЧАЙ, А ТОЛЬКО ПОТОМ УДАЛЯЙ НЕИСПОЛЬЗУЕМЫЕ МОДУЛИ!

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

Ты можешь найти и отключить эти сиротские модули с помощью модулей:  Clean Missing Modules или Missing Module.

Картинки

УМЕНЬШАЙ ВЕС КАРТИНОК

Картинки с большим размером файла требуют долгое время для своей загрузки. Где это возможно, всегда старайся уменьшит размер файлов картинок.

Для полей типа image,  используй стили картинок (admin/config/media/image-styles) для уменьшения картинок до требуемого размера.

 Image Resize Filter делает это намного проще для картинок, которые вставляются в текст через  WYSIWYG редактор типа tinyMCE или CKeditor. Когда ты устанавливаешь высоту и ширину картинки Image Resize Filter автоматически уменьшает её размер.

УСТАНОВИ IMAGEAPI OPTIMISE

Если даже используешь стили картинок (image styles) и  Image Resize Filter для уменьшения картинок, картинка всё равно содержит данные, которые увеличивают время загрузки. ImageAPI Optimise модуль удаляет эти данные не влияя на качество картинки.

ImageAPI Optimise module требует некоторые утилиты для установки на сервер. Если у тебя нет доступа к серверу, то в настройках выбирай Yahoo’s Smush.it.

Продвинутое кэширование

УСТАНОВИ ENTITY CACHE

Контент, пользователи, термины таксономии - это всё сущности (Entities). Большинство сущностей имеют поля и когда каждая сущность загружается, запросы делаются также для каждого поля, что приводит ко множеству запросов к базе данных.

Entity Cache  кеширует всю сущность в таблице кэширования (cache table). Каждая загружаемая сущность становится просто одной строчкой в таблице кэширования базы.

Пользоваться модулем очень просто. Просто включаешь, никакой доп. конфигурации не требуется.

Предупреждение! У меня был отличный рост производительности на сложных сайтах с кучей полей. Но если у тебя простенький сайт, то рост производительности не будет так заметен. Также я заметил конфликт между Ubercart Price Per Role и Entity Cache.

УСТАНОВИ ПРОДВИНУТУЮ АГГРЕГАЦИЮ CSS/JS (ADVANCED CSS/JS AGGREGATION)

Advanced CSS/JS Aggregation модуль намного эффективнее, чем встроенная аггрегация CSS и Javascript.

Уменьши число запусков крона

По умолчанию крон настроен на запуск каждые 3 часа, это означает, что каждые 3 часа пользователь будет получать очень медленную загрузку страниц.

Самое лучшее - отключить крон на сайте и настроить крон на сервере.

Автора автора