Настройка Boost для статического кэширования в Drupal
Коротко о Boost
Boost — модуль для Drupal, который создаёт статические HTML-файлы для анонимных посетителей и отдаёт их напрямую через веб‑сервер (Apache), минуя тяжёлую загрузку PHP/Drupal. Ключевая идея: отдать предгенерированный файл для GET/HEAD-запросов анонимных пользователей.
Определение в одну строку: Boost — файловый кеш для Drupal, который отдаёт страницы без выполнения PHP для анонимных посетителей.
Важные понятия:
- DRUPAL_UID — кука, которую Boost использует, чтобы отличать вошедших в систему пользователей (кеш не используется).
- Каталог кеша — обычно /var/www/www.example.com/web/cache/normal/www.example.com/.
Генерация правил .htaccess и куда их вставить
Перейдите на вкладку .HTACCESS в интерфейсе Boost — здесь модуль генерирует правила Apache, которые проверяют наличие готового HTML-файла в каталоге кеша (/var/www/www.example.com/web/cache) и отдают его анонимным пользователям. Значения по умолчанию обычно подходят — нажмите Save configuration.



Нажмите на кнопку генерации .htaccess, и вы увидите блок правил, который нужно добавить в ваш /var/www/www.example.com/web/.htaccess:

Ниже — точные правила, которые Boost сгенерировал (сохраните их как есть):
### BOOST START ###
# Allow for alt paths to be set via htaccess rules; allows for cached variants (future mobile support)
RewriteRule .* - [E=boostpath:normal]
# Caching for anonymous users
# Skip boost IF not get request OR uri has wrong dir OR cookie is set OR request came from this server OR https request
RewriteCond %{REQUEST_METHOD} !^(GET|HEAD)$ [OR]
RewriteCond %{REQUEST_URI} (^/(admin|cache|misc|modules|sites|system|openid|themes|node/add|comment/reply))|(/(edit|user|user/(login|password|register))$) [OR]
RewriteCond %{HTTPS} on [OR]
RewriteCond %{HTTP_COOKIE} DRUPAL_UID
RewriteRule .* - [S=3]
# GZIP
RewriteCond %{HTTP:Accept-encoding} !gzip
RewriteRule .* - [S=1]
RewriteCond %{DOCUMENT_ROOT}/cache/%{ENV:boostpath}/%{HTTP_HOST}%{REQUEST_URI}_%{QUERY_STRING}\.html -s
RewriteRule .* cache/%{ENV:boostpath}/%{HTTP_HOST}%{REQUEST_URI}_%{QUERY_STRING}\.html [L,T=text/html,E=no-gzip:1]
# NORMAL
RewriteCond %{DOCUMENT_ROOT}/cache/%{ENV:boostpath}/%{HTTP_HOST}%{REQUEST_URI}_%{QUERY_STRING}\.html -s
RewriteRule .* cache/%{ENV:boostpath}/%{HTTP_HOST}%{REQUEST_URI}_%{QUERY_STRING}\.html [L,T=text/html]
### BOOST END ###Обратите внимание на строку RewriteCond %{HTTP_COOKIE} DRUPAL_UID. Boost ставит куку DRUPAL_UID для вошедших пользователей — при её наличии кеш не отдается. Это гарантирует, что только анонимные посетители получат статический HTML.
Boost также укажет, куда именно вставить блок — ниже секции с RewriteBase и выше правила, перенаправляющего запросы в index.php.
Редактирование .htaccess: важные изменения
Откройте .htaccess вашего сайта:
vi /var/www/www.example.com/web/.htaccess- Отключаем использование mod_expires для HTML
Мы комментируем секцию чтобы браузеры не кешировали HTML. Иначе вы потеряете контроль над тем, что видит посетитель (браузер может отдавать устаревшую копию, даже если файловый кеш был обновлён). Вместо этого добавим заголовки, запрещающие кеширование:
[...]
##
## # Enable expirations.
## ExpiresActive On
##
## # Cache all files for 2 weeks after access (A).
## ExpiresDefault A1209600
##
##
## # Do not allow PHP scripts to be cached unless they explicitly send cache
## # headers themselves. Otherwise all scripts would have to overwrite the
## # headers set by mod_expires if they want another caching behavior. This may
## # fail if an error occurs early in the bootstrap process, and it may cause
## # problems if a non-Drupal PHP file is installed in a subdirectory.
## ExpiresActive Off
##
##
Header set Expires "Sun, 19 Nov 1978 05:00:00 GMT"
Header set Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"
[...]Важно: разрешено кешировать статические ресурсы (изображения, JS, CSS) с помощью mod_expires, но HTML кешировать в браузере не рекомендуется.
- Единый вариант с www или без
В .htaccess есть две правила (закомментированы) для редиректа между example.com и www.example.com. Включите только одно, чтобы Boost не создавал две отдельные копии кеша (для www и для non-www).
[...]
# If your site can be accessed both with and without the 'www.' prefix, you
# can use one of the following settings to redirect users to your preferred
# URL, either WITH or WITHOUT the 'www.' prefix. Choose ONLY one option:
#
# To redirect all users to access the site WITH the 'www.' prefix,
# (http://example.com/... will be redirected to http://www.example.com/...)
# uncomment the following:
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
#
# To redirect all users to access the site WITHOUT the 'www.' prefix,
# (http://www.example.com/... will be redirected to http://example.com/...)
# uncomment the following:
# RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
# RewriteRule ^ http://%1%{REQUEST_URI} [L,R=301]
[...]- Вставляем блок Boost
Добавьте сгенерированный ранее блок ### BOOST START ### ниже RewriteBase / и выше блока с RewriteCond %{REQUEST_FILENAME} !-f.
[...]
# Modify the RewriteBase if you are using Drupal in a subdirectory or in a
# VirtualDocumentRoot and the rewrite rules are not working properly.
# For example if your site is at http://example.com/drupal uncomment and
# modify the following line:
# RewriteBase /drupal
#
# If your site is running in a VirtualDocumentRoot at http://example.com/,
# uncomment the following line:
# RewriteBase /
### BOOST START ###
# Allow for alt paths to be set via htaccess rules; allows for cached variants (future mobile support)
RewriteRule .* - [E=boostpath:normal]
# Caching for anonymous users
# Skip boost IF not get request OR uri has wrong dir OR cookie is set OR request came from this server OR https request
RewriteCond %{REQUEST_METHOD} !^(GET|HEAD)$ [OR]
RewriteCond %{REQUEST_URI} (^/(admin|cache|misc|modules|sites|system|openid|themes|node/add|comment/reply))|(/(edit|user|user/(login|password|register))$) [OR]
RewriteCond %{HTTPS} on [OR]
RewriteCond %{HTTP_COOKIE} DRUPAL_UID
RewriteRule .* - [S=3]
# GZIP
RewriteCond %{HTTP:Accept-encoding} !gzip
RewriteRule .* - [S=1]
RewriteCond %{DOCUMENT_ROOT}/cache/%{ENV:boostpath}/%{HTTP_HOST}%{REQUEST_URI}_%{QUERY_STRING}\.html -s
RewriteRule .* cache/%{ENV:boostpath}/%{HTTP_HOST}%{REQUEST_URI}_%{QUERY_STRING}\.html [L,T=text/html,E=no-gzip:1]
# NORMAL
RewriteCond %{DOCUMENT_ROOT}/cache/%{ENV:boostpath}/%{HTTP_HOST}%{REQUEST_URI}_%{QUERY_STRING}\.html -s
RewriteRule .* cache/%{ENV:boostpath}/%{HTTP_HOST}%{REQUEST_URI}_%{QUERY_STRING}\.html [L,T=text/html]
### BOOST END ###
# Pass all requests not referring directly to files in the filesystem to
# index.php. Clean URLs are handled in drupal_environment_initialize().
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^ index.php [L]
[...]Отключение встроенного кеша Drupal
Включение Boost вместе со встроенным кешем Drupal усложнит предсказуемость того, что видит пользователь. Поэтому отключите кеш Drupal в: Home > Administration > Configuration > Development > Performance.

Изменения в PHP-файлах: куки при логине/логауте
Чтобы логин/логаут пользователей работал корректно с Boost, нужно внести две правки.
- /var/www/www.example.com/web/modules/user/user.module — ставим куку DRUPAL_UID при успешном логине
Откройте файл:
vi /var/www/www.example.com/web/modules/user/user.moduleВ функции user_authenticate($name, $password) добавьте следующие строки (примерные номера строк 2191–2193 в исходном):
[...]
function user_authenticate($name, $password) {
$uid = FALSE;
if (!empty($name) && !empty($password)) {
$account = user_load_by_name($name);
if ($account) {
// Allow alternate password hashing schemes.
require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
if (user_check_password($password, $account)) {
// Successful authentication.
$uid = $account->uid;
if ($uid && !isset($_COOKIE['DRUPAL_UID'])) {
setcookie('DRUPAL_UID', $uid, $_SERVER['REQUEST_TIME'] + ini_get('session.cookie_lifetime'), ini_get('session.cookie_path'), ini_get('session.cookie_domain'));
}
// Update user to new password scheme if needed.
if (user_needs_new_hash($account)) {
user_save($account, array('pass' => $password));
}
}
}
}
return $uid;
}
[...]- /var/www/www.example.com/web/sites/all/modules/boost/boost.module — удаляем куку при выходе
Откройте файл:
vi /var/www/www.example.com/web/sites/all/modules/boost/boost.moduleВ функции boost_set_cookie($uid, $expires = NULL) закомментируйте старую строку удаления куки и добавьте удаление с пустым значением, чтобы кука корректно удалялась при логауте:
[...]
function boost_set_cookie($uid, $expires = NULL) {
if (!$expires) {
$expires = ini_get('session.cookie_lifetime');
$expires = (!empty($expires) && is_numeric($expires)) ? REQUEST_TIME + (int)$expires : 0;
setcookie(BOOST_COOKIE, strval($uid), $expires, ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure') == '1');
}
else {
//setcookie(BOOST_COOKIE, '0', $expires, ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure') == '1');
setcookie(BOOST_COOKIE, '', $expires, ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure') == '1');
}
}
[...]Эти правки обеспечат, что DRUPAL_UID выставляется при логине и удаляется при выходе, поэтому кеш не будет мешать корректной аутентификации.
Проверка результата: что должно появиться и как тестировать
После того как первые анонимные пользователи посетят сайт, в каталоге кеша появятся HTML-файлы. Проверьте так:
ls -l /var/www/www.example.com/web/cache/normal/www.example.com/Пример вывода:
root@server1:~# ls -l /var/www/www.example.com/web/cache/normal/www.example.com/
total 36
-rw-rw-r-- 1 www-data www-data 11465 Aug 10 11:59 _.html
-rw-rw-r-- 1 www-data www-data 9619 Aug 10 11:59 nginx-413-request-entity-too-large_.html
-rw-rw-r-- 1 www-data www-data 9628 Aug 10 12:00 postfix-mail-loops-back-to-myself_.html
root@server1:~#.  Тесты входа/выхода: убедитесь, что пользователи могут корректно войти и выйти. С внесёнными изменениями в user.module и boost.module это должно работать без проблем. Cron и очистка кеша: Drupal cron отвечает за удаление устаревших файлов кеша. При обновлении контента (создание/обновление страницы, комментарий) Boost также очищает соответствующие кеш-файлы, чтобы пользователи не видели устаревший контент. Нагрузочное тестирование: используйте Apache Benchmark (ab) или аналогичный инструмент для замера запросов в секунду. После настройки вы должны увидеть заметный рост RPS для анонимных запросов. ## Критерии приёмки - Для анонимных запросов сервер отдает готовые HTML-файлы из каталога cache. . - Вошедшие пользователи не получают кешированный HTML (DRUPAL_UID присутствует). - После редактирования содержимого соответствующие кеш-файлы удаляются. - Кеш Drupal отключён в админке. ## Контрольный чеклист для администратора (ролевой чеклист) Администратор сайта: - [ ] Вставлен блок Boost в .htaccess именно между RewriteBase и проверкой файлов. - [ ] Отключен кеш Drupal в админке. - [ ] Настроен единственный вариант с www/non-www. - [ ] Заголовки браузерного кеширования запрещают кеширование HTML. Разработчик/инженер: - [ ] Изменения в user.module добавляют установку DRUPAL_UID. - [ ] Изменения в boost.module корректно удаляют куку при логауте. - [ ] Протестировано логирование/логауты для разных браузеров. Оператор/DevOps: - [ ] Права на каталог cache корректны (веб‑сервер может записывать туда). - [ ] Cron настроен и выполняется для чистки устаревших кеш-файлов. ## Когда Boost не подходит или даёт проблемы (контрпримеры) - Динамические личные страницы (dashboards) у большого числа аутентифицированных пользователей: Boost кеширует только для анонимов, поэтому не решит проблему для персонализированных страниц. - Сайт сильно полагается на AJAX для первичной отрисовки контента: отдача статического HTML может не дать ожидаемой интерактивности без дополнительных правок. - Сложная логика кеш-инвалидации (много взаимозависимого контента): управление «что и когда чистить» усложняется. ## Альтернативные подходы - Varnish Cache — reverse proxy перед веб-сервером, гибкий и быстрый, хорош для больших нагрузок. - Nginx FastCGI Cache — быстрый встроенный кеш у Nginx. - CDN (Cloudflare, Fastly) — отличная опция для глобального распределения статического контента. Выбор зависит от инфраструктуры и требований к персонализации. ## Мини‑методология тестирования и быстрые команды 1. Проверить появление файлов в каталоге cache: ``` ls -l /var/www/www.example.com/web/cache/normal/www.example.com/ ``` .
- Тест RPS:
ab -n 1000 -c 50 http://www.example.com/- Проверить вход/выход: войти пользователем и убедиться, что контент обновляется и кука DRUPAL_UID ставится/удаляется.
Безопасность и конфиденциальность
- Убедитесь, что в кеш не попадает персональная информация. Boost кеширует только для анонимных пользователей; при правильной настройке это снижает риск утечки приватных данных.
- Проверьте заголовки и права доступа к каталогу cache.
Резюме
Boost даёт простой способ кардинально снизить нагрузку на PHP/Drupal, отдавая статические HTML-файлы анонимным пользователям. Основные шаги: добавить сгенерированные правила в .htaccess, запретить браузерное кеширование HTML, настроить куки при логине/логауте, отключить встроенный кеш Drupal и протестировать работу. Альтернативы включают Varnish, Nginx FastCGI Cache и CDN — выбор зависит от требований к персонализации и инфраструктуры.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента