Уменьшение нагрузки на сервер для сайтов на Drupal

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

Вот пример нагрузки сайта с посещаемостью до 500 уников в сутки на сервера хостинга Таймвеб:

nagruzka_na_server_panel_upravleniya_hostingom_taymveb.png

А вот сайт с посещаемостью до 3000 уников в сутки на хостинге Ukraine.com.ua


analiz_proizvoditelnosti_saytov.png
Оптимизация Друпал для снижения нагрузки на сервер

  1. Удаляем все неиспользуемые модули
  2. Отключаем модуль "Statistic". Если Вам необходимо вести статистику на сайте (просмотры страниц, фильтрация по кол-ву просмотров и.т.д.) - ищем альтернативы такие как Google Analitics + Google analitics counter
  3. Отключаем модуль Database logging
  4. Включаем объединение файлов CSS и JS. В настройках производительности (admin/config/development/performance) ставим галочки:
    proizvoditelnost.png

    Кеш блоков и страниц для анонимов не ставим.
     
  5. Ограничиваем запуск крон. Переходим в Cron (admin/config/system/cron) и ставим от 6 часов, не меньше. Частые запуски крона дают нагрузку. Но и более одного дня не ставьте, так как будет накапливаться кеш что увеличит базу данных и место на диске
    cron.png
  6. Ставим модуль Boost.  Это модуль расширенного кеша страниц. По сути, когда анонимный пользователь заходит на сайт, в системе (/cache/normal/) создается html файл с содержимым этой страницы, который затем и подгружается вместо динамических страниц Друпал, чем и снижается нагрузка на сервер и увеличивается скорость загрузки страниц. В настройках модуля (admin/config/system/boost) ставим на каких страницах использовать или не использовать кеш:
    boost_1.png

    Ниже ставим галочки для всех типов документов и время кеша - 1 час (если поставить больше есть вероятность того, что будет быстро расти занимаемое место на диске)

    boost_2.png

    Переходим во вкладку настройки htaccess. Там обычно оставляем все без изменений, за исключением настроек "Options +FollowSymLinks"  и "Options +SymLinksIfOwnerMatch"; На большинстве серверов работает директива Options +FollowSymLinks, но на таких хостингах как например ukraine.com.ua нужно ставить Options +SymLinksIfOwnerMatch, иначе сайт начнет выдавать ошибки доступа.
    boost3.png
    boost4.png
    Сохраняемся и переходим во вкладку ".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/) дабы избежать их попадания в индекс
     
  7. Устанавливаем модуль Views content cache. Большую часть нагрузки дают выводимые страницы и блоки через Views. Этот модуль позволяет их кэшировать и выводить запросы из кэша не делая каждый раз при этом кучу запросов в базу данных. Отличие от встроенного во Views кэширования является то, что этот модуль обновляет кэш при появлении новых материалов или их обновления и всегда выводит актуальную информацию.

    Установка модуля стандартная, настройка производится непосредственно в нужном нам Views.
    stranica_katalog_soderzhimoe.png
    stranica_katalog_soderzhimoe_1.png

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

    stranica_katalog_soderzhimoe_2.png

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

Другие способы борьбы с превышением нагрузки на сервер

  1. Перейти на другой тарифный план который позволит перекрыть существующие нагрузки
  2. Перейти на Друпал хостинг https://dh.it-patrol.ru/ . Там вы будете платить за нагрузки по факту. То есть, нагрузки любые, но чем они больше, тем больше платить. Суммы иногда внушительные могут получатся, поэтому дешевле будет третий вариант
  3. Переходить на выделенный VPS сервер (например от этого хостинга)
  4. Реализовать поиск и фильтры на сайте через Apache Solr
  5. Нанять программиста который приведет в порядок код на сайте, из-за которого и возникает нагрузка.
  6. Закрыть все ненужные страницы в robots.txt для того, чтобы поисковые боты не сканили сайт там, где его сканить не нужно.
  7. Ограничить скорость обхода сайта роботам Яндекса в панели вебмастера. Часто роботы Яндекса создают хорошую нагрузку на сервер своими обходами. Директива Crawl Delay которая прописывалась ранее в robots.txt более не рабочая. 

    skorost_obhoda.png
     
  8. Посмотреть логи и заблокировать 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]

     

Ваши варианты? Может что упустил еще. 

Average: 10 (1 vote)