Боремся с нежелательной чрезмерной нагрузкой на сайт

Недавно мне написал один из моих постоянных клиентов, для которого я периодически дорабатываю интернет-магазин на Magento 1.9.3.4. Вместе с доработкой сайта осенью я сделал перенос с зарубежного хостинга на Российский (делалось это для соответствия интернет-магазина закону № 152-ФЗ «О персональных данных».

Заказчик перенаправил письмо от Timeweb — выбранного нами хостинга, в котором говорилось о чрезмерной нагрузке на сервер, оказываемой нашим сайтом на виртуальный сервер. Прежде всего, я зашел в панель управления хостингом для оценки нагрузки согласно монитору ресурсов.

Действительно — нагрузка была превышена, причем в некоторые дни оказываемая на сервер нагрузка была выше нормальной в 20 раз! В остальные же дни она стабильно была выше нормальной отметки в 1,5 — 2 раза.

Далее я опишу действия, которые были предприняты мной для устранения чрезмерной нагрузки на сервер. Хочу обратить Ваше внимания, что действия, проделанные мной, являются базовыми и применимы относительно конкретного сайта, написанного на Magento 1.9.3.4.

Автор данного поста не даёт никаких гарантий, что описанные ниже манипуляции помогут снизить нагрузку на сервер в случае с сайтами, основанными на других движках.

Прежде чем предпринимать какие-либо действия, нужно понять, что является причиной нагрузки на сервер. Оптимальным и наиболее распространенным вариантом определения источника нагрузки является проверка логов сервера. В случае Magento логи можно найти в корне сайта, в директории var/log/. Там Вы можете найти два вида логов — system.log, exception.log. В system,log содержатся сведения об ошибках php. Просмотрите его, чтобы определить наиболее распространенные ошибки на сайте. В моем случае действительно был ряд ошибок, которые я устранил, но это не привело к снижению нагрузки на сервер. Поэтому я стал копать дальше.

Дальше необходимо проверить логи сервера. Их название и способ получения могут отличаться в зависимости от хостинга, который Вы используете. В случае с Timeweb, логи записываются, если они включены в панели управления сайтом. Логи сервера лежат в корне сайта и имеют названия access_log и error_log. Нас интересует access_log. В access_log Вы можете посмотреть IP-адреса устройств, которые обращаются к Вашему сайту, их цель (страница, файл или директория) и кол-во обращений.

В ходе анализа логов я выявил:

  • несколько IP адресов, с которых было подозрительно много обращений;
  • несколько вредоносных ботов, обращающихся к сайту;
  • ряд IP-адресов, обращающихся к директории /downloader/index.php.

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

Блокируем нежелательные IP адреса через .htaccess

Если на Вас сервер идёт значительный трафик с конкретных IP-адресов, Вы можете снизить нагрузку, заблокировав доступ конкретным IP адресам через .htacess. Для этого добавляем в ,htaccess следующий кусок кода:

Order allow,deny
allow from all
Deny from xxx.xxx.xxx.xxx

где xxx.xxx.xxx.xxx — это нежелательный IP-адрес. Адресов может быть несколько. Для блокировки нескольких IP-адресов записываем их через пробел.

Блокируем вредоносных ботов через robots.txt и .htaccess

Блокировать нежелательных ботов рекомендуется сразу двумя способами, потому что зачастую боты игнорируют правила, прописанные в robots.txt.

  User-agent: AhrefsBot
Disallow: /
User-agent: SemrushBot
Disallow: /

где user-agent — это название самого бота. Название ботов, обращающихся к Вашему сайту, Вы можете получить в логах сервера (в моем случае — это access_log)

AhrefsBot и SemrushBot — одни из самых распространенных ботов, но это далеко не полный перечень. В моём случае я решил не мелочится и заблокировать большую часть наиболее распространенных ботов. Мой перечень получился таким:

User-agent: Exabot
Disallow: /
User-agent: IDBot
Disallow: /
User-agent: Bingbot
Disallow: /
User-agent: Wotbox
Disallow: /
User-agent: Baiduspider
Disallow: /
User-agent: Baiduspider-image
Disallow: /
User-agent: Baiduspider-video
Disallow: /
User-agent: Baiduspider-news
Disallow: /
User-agent: Baiduspider-favo
Disallow: /
User-agent: Baiduspider-cpro
Disallow: /
User-agent: Baiduspider-ads
Disallow: /
User-agent: Baidu
Disallow: /
User-agent: MJ12bot
Disallow: /
User-agent: AhrefsBot
Disallow: /
User-agent: dotbot
Disallow: /
User-agent: Riddler
Disallow: /
User-agent: SemrushBot
Disallow: /
User-agent: LinkpadBot
Disallow: /
User-agent: BLEXBot
Disallow: /
User-agent: FlipboardProxy
Disallow: /
User-agent: aiHitBot
Disallow: /
User-agent: trovitBot
Disallow: /

Теперь необходимо продублировать блокировку для вышеуказанных ботов через .htaccess, на тот случай, если один из ботов решит проигнорировать запрет, указанный в robots,txt. Код на запрет ботов запишем в <ifModule mod_rewrite.c>.

RewriteCond %{HTTP_USER_AGENT} Exabot [OR]
RewriteCond %{HTTP_USER_AGENT} IDBot [OR]
RewriteCond %{HTTP_USER_AGENT} Wotbox [OR]
RewriteCond %{HTTP_USER_AGENT} Baiduspider [OR]
RewriteCond %{HTTP_USER_AGENT} Baiduspider-image [OR]
RewriteCond %{HTTP_USER_AGENT} Baiduspider-video [OR]
RewriteCond %{HTTP_USER_AGENT} Baiduspider-news [OR]
RewriteCond %{HTTP_USER_AGENT} Baiduspider-favo [OR]
RewriteCond %{HTTP_USER_AGENT} Baiduspider-cpro [OR]
RewriteCond %{HTTP_USER_AGENT} Baiduspider-ads [OR]
RewriteCond %{HTTP_USER_AGENT} AhrefsBot [OR]
RewriteCond %{HTTP_USER_AGENT} MJ12bot [OR]
RewriteCond %{HTTP_USER_AGENT} Detectify [OR]
RewriteCond %{HTTP_USER_AGENT} dotbot [OR]
RewriteCond %{HTTP_USER_AGENT} Riddler [OR]
RewriteCond %{HTTP_USER_AGENT} SemrushBot [OR]
RewriteCond %{HTTP_USER_AGENT} LinkpadBot [OR]
RewriteCond %{HTTP_USER_AGENT} BLEXBot [OR]
RewriteCond %{HTTP_USER_AGENT} FlipboardProxy [OR]
RewriteCond %{HTTP_USER_AGENT} aiHitBot [OR]
RewriteCond %{HTTP_USER_AGENT} trovitBot [OR]
RewriteRule ^(.*)$ – [F,L] 

Блокируем нежелательный доступ к файлам директории /downloader magento

Для того, чтобы заблокировать доступ к конкретной директории, необходимо внутри этой директории создать новый .htaccess или отредактировать существующий.

В данном случае мы не ограничиваем доступ конкретным IP, а наоборот, позволяем только конкретным IP получить доступ к сайту. Для этого вставим в .htaccess следующий код:

 Order deny,allow
Deny from all
Allow from ххх.ххх.ххх.ххх

где — xxx.xxx.xxx.xxx — это IP-адрес, которому Вы предоставляете доступ к директории. Вы можете вписать несколько IP адресов через пробел.

В конкретном случае мы запрещаем доступ к директории менеджера установки расширений Magento. Соответственно, здесь необходимо указать рабочие IP-адреса людей, задействованных в установке расширений на платформу.

Итог

Приведенные выше меры помогли в моем случае снизить среднюю нагрузку практически в четыре раза и позволяют держать её на отметке, в два раза меньшей предельного для данного хостинга значения. Ниже график нагрузки за последний месяц, на котором отчетливо видно феноменальные скачки нагрузки и резкое снижение — как раз в тот момент, когда мною были приняты вышеописанные меры.

Оставьте комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Прокрутить вверх