International conference of developers
and users of free / open source software

Способы повышения производительности высоконагруженных проектов на CMS Drupal

Виталий Иоскевич, Минск, Беларусь

LVEE 2011

Drupal is a popular CMS/CMF used to power the different types of web-projects worldwide. The desire of developers to make their system competitive in terms of functionality and flexibility sooner or later leads to increase of server load and reduced performance. Extensive functionality, flexibility in configuration and extensibility through third-party modules are undoubtedly a huge advantage, enabling to carry out projects of varying complexity and purpose, but the price often is a poor performance of high loaded Drupal-powered sites. In our review we are going to revise existing standard methods of Drupal performance optimization (both server- and client-side) and demonstrate custom solutions that can be applied to some of the critical areas of Drupal-powered high-loaded website. In our real life example we are going to show how to build Google Map page, capable to show thousands of markers based on Drupal content nodes.

Drupal (7-ая, текущая версия) является достаточно развитой системой управления контентом. Стремление разработчиков сделать свою систему универсальной и более функциональной, чем у конкурентов, рано или поздно приводит к тому, что возрастают нагрузки на сервер, снижается быстродействие. Обширный функционал, гибкость в конфигурировании и расширяемость посредством сторонних модулей несомненно являются огромным преимуществом, благодаря которому позволяет выполнять проекты различной сложности и назначения, но плата за него — низкая производительность готового решения.

Чем больше число использованных на сайте сторонних модулей (в т. ч. собственной разработки), тем ниже производительность сайта при больших нагрузках (большом количестве посетителей), а именно при построении сайтов с предполагаемым большим числом посетителей никак не обойтись стандартным функционалом CMS. Таким образом, данная CMS оказывается весьма требовательной к ресурсам сервера, и в большинстве случаев проблема решается выбором специализированных дорогих хостингов — выделенный сервер или несколько серверов.

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

Основные методы повышения производительности Drupal:

  • включить кэш в модулях, позволяющих кэширование (таких как Views, Panels, Feeds, SWF Tools и т.п.);
  • увеличить время жизни кэша для стандартной системы кэширования Drupal. При этом надо иметь ввиду, что посетители будут видеть обновления содержимого значительно позже;
  • если нет большой необходимости в статистике, можно выключить стандартные модули statistics и database logging. Они используют дополнительные запросы к БД при загрузке страницы. Кроме того, можно найти альтернативу данным модулям;
  • использовать модуль CSS Gzip. Уменьшает размер файлов и количество http-запросов;
  • использовать модуль Global Redirect. Предотвращает кэширование дубликатов содержимого сайта по ссылкам псевдонимам (синонимам) в случае использования «Clean URL»;
  • использовать модуль Javascript Aggregator. Настройки Drupal позволяют объединить js-файлы, однако этот модуль позволяет еще и уменьшить конечный размер передаваемого файла;
  • заменить системный cron на более функциональный модуль Elysia Cron. В отличие от системного, Elysia Cron позволяет распределить задачи по времени одна за одной, а не все вместе, при этом снижая пиковую нагрузку на сервер;
  • перенести вызов javascript вниз станицы;
  • помещать сторонние библиотеки вне каталога модулей /sites/all/modules – например, в /sites/all/libraries. В таком случае Drupal не будет просматривать ненужные ему файлы;
  • конвертировать таблицы MySQL в UTF8 InnoDB;
  • создать индексы для медленных запросов Views. Желательно проанализировать такие запросы и увеличить производительность созданием индексов для полей;
  • использовать ImageMagick вместо стандартной GD image
  • library, т. к. он лучше использует ресурсы сервера и дает лучшее качество изображений;
  • использовать модуль Content Delivery Network integration. Он позволяет распределить файлы на множество разделенных серверов. При этом снижается динамическая нагрузка на сервер, но требуется дополнительная плата за каждый сервер;

Наиболее продуктивный способ увеличения производительности – отдельная эффективная система кэширования.

Boost. Одна из лучших систем кэширования для shared hosts. Cоздает копии html-станиц, которые генерирует Drupal, и хранит их в каталоге cache. Используя правила «.htaccess», Boost проверяет, существует ли необходимый файл. Если да, то загружает статичный html, полностью избегая Drupal/PHP/MySQL. Если нет, генерирует файл. Старые файлы удаляются по cron для того, чтобы выводимое содержимое сайта оставалось свежим (актуальным).

Memcache. Серверная система кэширования, сохраняющая
страницы сайта в оперативной памяти сервера. Все что необходимо для эффективной работы в данном случае — быстрое ОЗУ большого объема. Его можно успешно использовать как для кэширования анонимных пользователей, так и для зарегистрированных. Но возможен и вариант, когда Memcache кэширует зарегистрированных пользователей, а Boost используется для кэширования анонимов. К преимуществам варианта можно отнести возможность кэширования анонимов и зарегистрированных пользователей, а к недостаткам — то, что нужен хотя бы VPS, c достаточной оперативной памятью и невозможность работы на shared hosting.

APC (Alternate PHP Cache). Система кэширования op-code для серверов Apache. Подход весьма эффективен при большом числе активных модулей на сайте. Суть системы заключается в кэшировании компилированного байт-кода PHP-скрипта для того, чтобы избежать расходов ресурсов сервера на разбор и компиляцию исходного кода при каждом запросе. Для дальнейшего повышения производительности кэшированный код хранится в общей памяти и непосредственно выполняется оттуда, тем самым сводя к минимуму количество медленных операций чтения файлов и копирования в памяти во время выполнения. К преимуществам относится ускорение компиляции скриптов Drupal и уменьшение использования ресурсов сервера, к недостаткам — необходимость произвести специальное конфигурирование сервера.

Varnish (reverse proxy http-accelerator). Данная система выступает на первом плане над сервером Apache, PHP и Drupal.
Varnish сохраняет кэшированное содержимое в оперативной памяти, и таким образом экономит ресурсы на загрузке Apache и Drupal. В результате этого Varnish предоставляет высокую производительность для кэшированных страниц для анонимных пользователей и является предпочтительным вариантом для сложных ресурсоемких сайтов, требующих значительной масштабируемости. Для работы с Drupal 6 необходима была отдельная «оптимизированная» сборка дистрибутива под названием PressFlow и установка модуля интеграции Varnish HTTP Accelerator Integration. Для текущей версии Drupal достаточно установки модуля.

Пример проекта с высокой нагрузкой — 350.org (Drupal 6)

К характеристикам проекта можно отнести следующие:

  • 150 000+ уникальных посетителей в день
  • 6000+ ивентов, созданных пользователями
  • ок. 500 авторизованных пользователей постоянно на сайте
  • самая посещаемая страница: карта ивентов (/map)

Кэширование критично как для анонимов, так и для авторизованных пользователей. Используется Pressflow/Varnish и специальные меры для повышения производительности:

  • Отказ от Views для генерации больших массивов данных
  • XML-файл на диск вместо DB-кэша (плюсы/минусы)
  • Кэширование на диск всех RSS-фидов
  • Ajax-запросы информации для маркеров на карте.