Друпал - очень ресурсоемкая CMF, особенно когда начинает идти трафик на сайт, а также добавлены скрипты и "говнокод" которые замедляют работу сайта с "коробки". Выделенных на хостингах ресурсов для среднестатистического сайта на Друпал с посещаемостью свыше пары сотни человек в сутки обычно не хватает, и вам начинают приходить уведомления от службы поддержки хостинга о том, что сайт дает чрезмерную нагрузку на сервер и если проблему не устранить, сайт будет заблокирован. Что делать?
Вот пример нагрузки сайта с посещаемостью до 500 уников в сутки на сервера хостинга Таймвеб:
А вот сайт с посещаемостью до 3000 уников в сутки на хостинге Ukraine.com.ua

Оптимизация Друпал для снижения нагрузки на сервер
- Удаляем все неиспользуемые модули
- Отключаем модуль "Statistic". Если Вам необходимо вести статистику на сайте (просмотры страниц, фильтрация по кол-ву просмотров и.т.д.) - ищем альтернативы такие как Google Analitics + Google analitics counter
- Отключаем модуль Database logging
- Включаем объединение файлов CSS и JS. В настройках производительности (admin/config/development/performance) ставим галочки:
Кеш блоков и страниц для анонимов не ставим.
- Ограничиваем запуск крон. Переходим в Cron (admin/config/system/cron) и ставим от 6 часов, не меньше. Частые запуски крона дают нагрузку. Но и более одного дня не ставьте, так как будет накапливаться кеш что увеличит базу данных и место на диске
- Ставим модуль Boost. Это модуль расширенного кеша страниц. По сути, когда анонимный пользователь заходит на сайт, в системе (/cache/normal/) создается html файл с содержимым этой страницы, который затем и подгружается вместо динамических страниц Друпал, чем и снижается нагрузка на сервер и увеличивается скорость загрузки страниц. В настройках модуля (admin/config/system/boost) ставим на каких страницах использовать или не использовать кеш:
Ниже ставим галочки для всех типов документов и время кеша - 1 час (если поставить больше есть вероятность того, что будет быстро расти занимаемое место на диске)
Переходим во вкладку настройки htaccess. Там обычно оставляем все без изменений, за исключением настроек "Options +FollowSymLinks" и "Options +SymLinksIfOwnerMatch"; На большинстве серверов работает директива Options +FollowSymLinks, но на таких хостингах как например ukraine.com.ua нужно ставить Options +SymLinksIfOwnerMatch, иначе сайт начнет выдавать ошибки доступа.
Сохраняемся и переходим во вкладку ".htaccess Generation", копируем весь код, и вставляем его в наш .htaccess файл на сервере в корневой директории сайта. Модуль установлен. Проверить его работоспособность можно пройдя в папку /cache/normal/ в корень сайта и посмотреть, создаются ли там html страницы сайта.
В некоторых случаях предлагаемый сгенерированный код не всегда корректно работает на некоторых хостингах, поэтому рекомендую использовать этот:### 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 %{HTTP_COOKIE} DRUPAL_UID [OR] RewriteCond %{ENV:REDIRECT_STATUS} 200 RewriteRule .* - [S=7] # GZIP RewriteCond %{HTTP:Accept-encoding} !gzip RewriteRule .* - [S=3] 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] RewriteCond %{DOCUMENT_ROOT}/cache/%{ENV:boostpath}/%{HTTP_HOST}%{REQUEST_URI}_%{QUERY_STRING}\.xml -s RewriteRule .* cache/%{ENV:boostpath}/%{HTTP_HOST}%{REQUEST_URI}_%{QUERY_STRING}\.xml [L,T=application/xml,E=no-gzip:1] RewriteCond %{DOCUMENT_ROOT}/cache/%{ENV:boostpath}/%{HTTP_HOST}%{REQUEST_URI}_%{QUERY_STRING}\.json -s RewriteRule .* cache/%{ENV:boostpath}/%{HTTP_HOST}%{REQUEST_URI}_%{QUERY_STRING}\.json [L,T=text/javascript,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] RewriteCond %{DOCUMENT_ROOT}/cache/%{ENV:boostpath}/%{HTTP_HOST}%{REQUEST_URI}_%{QUERY_STRING}\.xml -s RewriteRule .* cache/%{ENV:boostpath}/%{HTTP_HOST}%{REQUEST_URI}_%{QUERY_STRING}\.xml [L,T=text/xml] RewriteCond %{DOCUMENT_ROOT}/cache/%{ENV:boostpath}/%{HTTP_HOST}%{REQUEST_URI}_%{QUERY_STRING}\.js -s RewriteRule .* cache/%{ENV:boostpath}/%{HTTP_HOST}%{REQUEST_URI}_%{QUERY_STRING}\.js [L,T=text/javascript] RewriteCond %{DOCUMENT_ROOT}/cache/%{ENV:boostpath}/%{HTTP_HOST}%{REQUEST_URI}_%{QUERY_STRING}\.json -s RewriteRule .* cache/%{ENV:boostpath}/%{HTTP_HOST}%{REQUEST_URI}_%{QUERY_STRING}\.json [L,T=application/javascript] ### BOOST END ###
Закрываем папку cache в robots.txt (Disallow: /cache/) дабы избежать их попадания в индекс
- Устанавливаем модуль Views content cache. Большую часть нагрузки дают выводимые страницы и блоки через Views. Этот модуль позволяет их кэшировать и выводить запросы из кэша не делая каждый раз при этом кучу запросов в базу данных. Отличие от встроенного во Views кэширования является то, что этот модуль обновляет кэш при появлении новых материалов или их обновления и всегда выводит актуальную информацию.
Установка модуля стандартная, настройка производится непосредственно в нужном нам Views.
Выбираем тип материала при обновлении которого будет обновляться кеш вьюхи, и время хранения. Опять таки, более часа не советую ставить.
Минусом модуля является то, что при большой посещаемости и большом количестве Views, быстро разрастется база данных. На некоторых хостингах есть ограничения на размер баз данных.
Другие способы борьбы с превышением нагрузки на сервер
- Перейти на другой тарифный план который позволит перекрыть существующие нагрузки
- Перейти на Друпал хостинг https://dh.it-patrol.ru/ . Там вы будете платить за нагрузки по факту. То есть, нагрузки любые, но чем они больше, тем больше платить. Суммы иногда внушительные могут получатся, поэтому дешевле будет третий вариант
- Переходить на выделенный VPS сервер (например от этого хостинга)
- Реализовать поиск и фильтры на сайте через Apache Solr
- Нанять программиста который приведет в порядок код на сайте, из-за которого и возникает нагрузка.
- Закрыть все ненужные страницы в robots.txt для того, чтобы поисковые боты не сканили сайт там, где его сканить не нужно.
- Ограничить скорость обхода сайта роботам Яндекса в панели вебмастера. Часто роботы Яндекса создают хорошую нагрузку на сервер своими обходами. Директива Crawl Delay которая прописывалась ранее в robots.txt более не рабочая.
- Посмотреть логи и заблокировать IP адреса, которые часто сканируют сайт и дают нагрузку. Инструмент просмотра логов и блокировки IP дают практически все нормальные хостинги. Вот пример бана самых назойливых ботов через добавление комманд в файл .htaccess
# Bad robots Blocks RewriteCond %{HTTP_USER_AGENT} AhrefsBot [OR] RewriteCond %{HTTP_USER_AGENT} MJ12bot [OR] RewriteCond %{HTTP_USER_AGENT} BLEXBot [OR] RewriteCond %{HTTP_USER_AGENT} msnbot [OR] RewriteCond %{HTTP_USER_AGENT} bingbot [OR] RewriteCond %{HTTP_USER_AGENT} DotBot [OR] RewriteCond %{HTTP_USER_AGENT} xenu [OR] RewriteCond %{HTTP_USER_AGENT} SemrushBot RewriteRule ^(.*)$ – [F,L]
Ваши варианты? Может что упустил еще.
- 59 просмотров