Данный раздел подготовлен при помощи Елены Цаплиной (aka Касихиной) — программиста-разработчика и руководителя нескольких Интернет-проектов: студии дизайна и разработки Интернет-сайтов Aquanther (http://www.aquanther.ru/)), ежедневного женского журнала "Мои подружки" (http://www.moipodruzhki.ru/), программного обеспечения (под управлением ОС Windows) под единым названием — HomAff (сокращение от home affairs).
Елена известна своей публикацией о CMS DrupaL DrupaL ( http://drupaL.ru/node/26290 ), получившей широкое распространение в Рунете.
В данный момент под ее руководством (на базе студии Aquanther) разрабатывается мультимедийный курс по созданию и управлению сайтом с использованием CMS DrupaL. В дальнейшем вместе с мультимедийным курсом планируется распространение модифицированных версий CMS DrupaL, специализированных для определенных типов сайтов, и оказание платной поддержки данной CMS.
DrupaL — довольная распространенная CMS, и это наложило на нее свой отпечаток: базовая поставка DrupaL является не готовым решением для определенного вида сайта, а фундаментом для его создания. Существуют "сборки" на базе DrupaL, специализированные под определенные виды сайтов, например, под новостные сайты. Но подобные сборки в данный момент мало распространены и плохо поддерживаются. В связи с этим при создании Интернет-сайта на основе стандартной поставки DrupaL используется большое количество готовых дополнительных модулей и тем оформления для DrupaL либо разрабатываются новые модули и темы специально для данного проекта. Последним этапом работ по созданию сайта является его оптимизация, которую условно можно разбить на 4 шага:
При создании сайта используем DrupaL версии 6, так как в нем лучше реализованы внутренние средства кэширования. Также в дополнительных модулях (Views, PaneL и т. д.) для DrupaL версии 6 внедрены эффективные методы кэширования. К сожалению не все модули DrupaL версии 5 реализованы для DrupaL версии 6 (например, модуль Sphinx), о чем не следует забывать при планировании разработки Интернет-сайта. Далее будем рассматривать только DrupaL версии 6.
Хорошо обдумаем варианты использования модулей наподобие CCK (Content Construction Kit) перед реализацией запланированного. Например, простая задача на хранение в базе сайта тысячи типов продуктов, их названий и описаний, решается с помощью: I создания тысячи терминов таксономии и привязки их к определенному типу материала; I добавления определенному материалу дополнительного поля CCK, в котором будет храниться тип продуктов. При усложнении задачи с помощью условия, что все типы продуктов должны быть разбиты на 10 групп, задача решается двумя вариантами. Вариант первый, с использованием таксономии.
Вариант второй, с использованием CCK.
Кэширование системы меню, фильтров форматов ввода, переменных администрирования (например, название сайта) и настроек модуля производится автоматически. Остальные параметры кэширования можно настроить на странице "Управление — Производительность" ( http://www.exampLe.ru/admin/settings/performance )
На данной странице можно настроить:
Включим кэширование страниц в режим "нормальный". В данном режиме кэширования страниц при просмотре страницы в первый раз (анонимным, незарегистрированным в системе пользователем) производится сохранение сгенерированной страницы в кэш. В дальнейшем при просмотре данной страницы (анонимным пользователем) она не генерируется заново, а берется из кэша, что значительно ускоряет работу Drupal.
Если кэширование страниц включено в режиме "агрессивный", при генерации страницы пропускается загрузка и выгрузка включенных модулей, поэтому часть модулей могут работать некорректно или не работать совсем.
Настроим минимальное время жизни кэша страниц для анонимных пользователей. Данный параметр определяет, через какое время после кэширования страницы производится проверка на то, обновлено ли содержимое данной страницы или нет. Если обновлено, то кэш данной страницы очищается. Т.е. если администратор сайта изменил содержимое страницы, он его увидит сразу, а анонимные пользователи — только по прошествии минимального времени жизни кэша.
Включим компрессию страниц для сохранения сжатого кэша страниц и для передачи страницы браузеру пользователя в сжатом виде, если он поддерживает компрессию gzip. Компрессия производится с помощью библиотеки zLib, установленной как расширение в PHP.
Включим кэширование блоков. Принцип работы кэширования блоков аналогичен принципу кэширования страниц. Для супер-пользователя (первого зарегистрированного пользователя при установке DrupaL, его id равен 1) блоки никогда не кэшируются.
Включим оптимизацию CSS- и JavaScript-файлов. Это уменьшит их размер и количество обращений к серверу при загрузке страниц в браузер. Все CSS- и JavaScript-файлы собираются в один (свой файл для CSS (обычно их бывает два: один для отображения на экране, другой — для отображения при печати) и свой — для JavaScript). Таким образом мы уменьшим количество обращений к серверу при загрузке страницы.
Authcache сохраняет сжатый кэш страниц отдельно для каждого пользователя или роли. Кэш сохраняется в базе данных или в стороннем средстве кэширования (memcahed, APC, и т. д.). Кэшированные версии страниц для аутентифицированных пользователей (кроме супер-пользователя) передаются с помощью AJAX, поэтому достигается очень быстрое отображение страницы в браузере. Если у аутентифицированного пользователя в браузере отключены JavaScript, то он получает страницы не из кэша. На некоторых серверах скорость загрузки страницы уменьшается до 1 миллисекунды.
Для установки модуля:
$conf['cache_inc'] = './sites/all/modules/authcache/api/authcache.inc'; $conf['authcache'] = array( 'default' => array( // технология кэширования - apc, memcache, db, file, // eacc or xcache 'engine' => 'db', // если используем memcached (host:port, например, // 'localhost:11211') 'server' => array(), // если используем процесс memcached, shared или single 'shared' => TRUE, // кэш ключа префикса (для нескольких сайтов) 'prefix' => '', // если используем кэширование на файлах — указываем // путь их сохранения 'path' => 'files/filecache', // статический массив кэша (расширенный) 'static' => FALSE, ), );
В данном коде устанавливаются настройки модуля Authcache. Указываем, что будем хранить кэш страниц в базе данных ('engine' => 'db'), поэтому все остальные установки не имеют значения, и мы оставляем их без изменений. Более подробно о параметрах данного кода можно прочитать на странице http://drupaL.org/project/cacherouter (на английском языке).
Включим модуль Authcache на странице "Управление — Модули" ( http://www.exampLe.ru/admin/buiLd/moduLes ). После чего настроим его работу на странице "Управление — Производительность — Authcache" ( http://www.exampLe.ru/admin/settings/performance/authcache ):
Изменим настройки элементов на страницах сайта так, чтобы страница для разных пользователей, принадлежащих одной роли, выглядела одинаково (т. е., например, запретим пользователям управлять видимостью блоков на сайте, если такие блоки существуют).
В шаблонах тем оформления используем переменные:
Можно также ознакомиться с примером /sites/all/modules/authcache/modules/authcache_example, который показывает, как настроить блоки с пользовательским содержанием (с контентом пользователя).
$conf['cache_inc'] = './sites/all/modules/cacherouter/cacherouter.inc'; $conf['cacherouter'] = array( 'default' => array( 'engine' => 'db', 'server' => array(), 'shared' => TRUE, 'prefix' => '', 'path' => 'sites/default/files/filecache', 'static' => FALSE, 'fast_cache' => TRUE, ), );
После осуществления действий, приведенных выше, страницы создаваемого сайта будут отдаваться сервером браузеру пользователя в сжатом виде, а вот CSS и JavaScript — нет. Исправим это:
### START CSS GZIP ### # Requires mod_mime to be enabled. <IfModule mod_mime.c=""> # Send any files ending in .gz with x-gzip encoding # in the header. AddEncoding x-gzip .gz </IfModule> # Gzip compressed css files are of the type 'text/css'. <FilesMatch "\.css\.gz$"> ForceType text/css </FilesMatch> <IfModule mod_rewrite.c=""> RewriteEngine on # Serve gzip compressed css files RewriteCond %{HTTP:Accept-encoding} gzip RewriteCond %{REQUEST_FILENAME}\.gz -s RewriteRule ^(.*)\.css $1\.css\.gz [L,QSA,T=text/css] </IfModule> ### End CSS GZIP ###
Если в шаблонах темы оформления необходимо использовать дополнительные CSS и JavaScript, то желательно подключать их с помощью следующих команд:
для того, чтобы они оптимизировались (включались в один исходный CSS или JavaScript-файл) и сжимались совместно со всеми остальными CSS- или JavaScript-файлами, используемыми на сайте.
От оптимизации Drupal с помощью модулей, перейдем к более сложной оптимизации — оптимизации конфигурации и обслуживания Drupal.
ini_set('session.gc_maxlifetime', 200000);
на
ini_set('session.gc_maxlifetime', 86400); // 24 часа (в секундах)
Также в этом файле можно сократить время жизни кэшированных страниц сеансов до 24 часов, изменив строку
ini_set('session.cache_expire', 200000);
на
ini_set('session.cache_expire', 1440); // 24 часа (в минутах)
Напоследок в этом же файле изменим время хранения cookie в браузере пользователя, сократив его до 24 часов:
ini_set('session.cookie_lifetime', 86400); // 24 часа (в секундах)
Если установить время хранения cookie в браузере пользователя равным 0, то cookie будет удаляться сразу после закрытия Интернет-браузера пользователем.
Так как сервер сайта может работать под управлением разных операционных систем:
то в каждом случае настройки оптимизации сервера будут отличаться (т. е. установка eAccelerator в Windows и Lunux сильно различается). Ниже приведены только основные рекомендации по оптимизации сервера. Подробно из рекомендаций рассмотрена лишь установка PHP-акселератора на сервер Ubuntu 8.04, так как PHP-акселератор значительно ускоряет работу сайта.
sudo apt-get install php5-dev sudo apt-get install make
sudo cd /tmp/ sudo wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator- 0.9.5.3.tar.bz2 sudo tar xvjf eaccelerator-0.9.5.3.tar.bz2 sudo cd eaccelerator-0.9.5.3 sudo phpize sudo ./configure —enable-eaccelerator=shared sudo make sudo make install
; eAccelerator configuration ; Note that eAccelerator may also be installed as a PHP extension or as a zend_extension ; If you are using a thread safe build of PHP you must use ; zend_extension_ts instead of zend_extension ;extension = "/usr/lib/php5/20060613+lfs/eaccelerator.so" zend_extension = "/usr/lib/php5/20060613+lfs/eaccelerator.so" eaccelerator.shm_size = "16" eaccelerator.cache_dir = "/var/cache/eaccelerator" eaccelerator.enable = "1" eaccelerator.optimizer = "1" eaccelerator.check_mtime = "1" eaccelerator.debug = "0" eaccelerator.filter = "" eaccelerator.shm_max = "0" eaccelerator.shm_ttl = "0" eaccelerator.shm_prune_period = "0" eaccelerator.shm_only = "0" eaccelerator.compress = "1" eaccelerator.compress_level = "9" eaccelerator.allowed_admin_path = "/var/www/eaccelerator"
; eAccelerator configuration ; Note that eAccelerator may also be installed as a PHP extension or as a zend_extension ; If you are using a thread safe build of PHP you must use ; zend_extension_ts instead of zend_extension ;extension = "/usr/lib/php5/20060613+lfs/eaccelerator.so" zend_extension = "/usr/lib/php5/20060613+lfs/eaccelerator.so" eaccelerator.shm_size = "16" eaccelerator.cache_dir = "/var/cache/eaccelerator" eaccelerator.enable = "1" eaccelerator.optimizer = "1" eaccelerator.check_mtime = "1" eaccelerator.debug = "0" eaccelerator.filter = "" eaccelerator.shm_max = "0" eaccelerator.shm_ttl = "0" eaccelerator.shm_prune_period = "0" eaccelerator.shm_only = "0" eaccelerator.compress = "1" eaccelerator.compress_level = "9" eaccelerator.allowed_admin_path = "/var/www/eaccelerator" ; ionCube Loader configuration zend_extension=/usr/local/lib/ioncube/ioncube_loader_lin_5.2.so ; Zend Optimizer configuration zend_extension=/usr/local/lib/Zend/ZendOptimizer.so zend_optimizer.optimization_level=15
sudo mkdir -p /var/cache/eaccelerator sudo chmod 0777 /var/cache/eaccelerator
sudo /etc/init.d/apache2 restart
# Включить mod_expires. <IfModule mod_expires.c=""> # Разрешить истечение срока. ExpiresActive On # Кэшировать все файлы на две недели после доступа (A). ExpiresDefault A1209600 # Не кэшировать динамически генерируемые страницы. ExpiresByType text/html A1 </IfModule>
<Directory/> AllowOverride … </Directory>
# query_cache_limit = 1M # query_cache_size = 16M
на
query_cache_limit = 1M query_cache_size = 64M
После чего перезапустим MySQL командой
/etc/init.d/mysql restart
Слишком маленький размер кэша — малоэффективен, а слишком больой размер кэша приводит к тому, что поиск нужной информации в кэше тратит много времени. Поэтому рекомендуем поэкспериментировать с размером кэша на каждом конкретном сервере и подобрать его оптимальный размер.
Для просмотра информации о сервере из Drupal существует удобный модуль — System information (http://drupal.org/project/systeminfo ). После его установки и активации информацию о вашем сервере можно посмотреть на странице http://www.example.ru/admin/reports/systeminfo.