Как защитить сайт от ботов и снизить нагрузку на сервер

01 Sep 2026, 12:27:53
Автоматические боты могут отправлять большое количество запросов к сайту, загружая страницы, изображения, API и другие ресурсы. При высокой частоте запросов увеличивается нагрузка на CPU, RAM, PHP-FPM, базу данных, сетевой интерфейс и дисковую подсистему.
При этом не каждый бот является вредоносным. Поисковые роботы и сервисы мониторинга могут работать легитимно, но даже они способны создавать заметную нагрузку при неправильной настройке.
В этой статье рассмотрим, как определить источник нагрузки, найти подозрительный трафик, ограничить количество запросов и защитить сайт от нежелательных ботов, не блокируя обычных пользователей.

Какие бывают боты

Автоматические запросы к сайту можно условно разделить на несколько категорий:
  • поисковые роботы — Googlebot, Bingbot и другие поисковые системы;
  • полезные боты — сервисы мониторинга, проверки доступности и другие автоматические системы;
  • парсеры — собирают содержимое страниц;
  • сканеры — ищут уязвимости и открытые сервисы;
  • вредоносные боты — выполняют подбор паролей, массовые запросы и другие нежелательные действия;
  • агрессивные боты — отправляют большое количество запросов за короткий промежуток времени.
Не каждый бот представляет угрозу. Основной проблемой становится слишком высокая частота запросов, особенно если они обращаются к ресурсоёмким страницам.

Как определить источник нагрузки

Прежде чем блокировать IP-адреса или User-Agent, необходимо определить, какой именно трафик создаёт нагрузку.
Первым делом стоит проверить веб-сервер и его access.log.

Просмотр access.log в реальном времени

Для Nginx:
tail -f /var/log/nginx/access.log
Если используется другой путь к журналу, необходимо указать соответствующий файл.

Поиск IP-адресов с наибольшим количеством запросов

awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
Команда покажет IP-адреса, которые встречаются в журнале чаще всего.

Поиск наиболее запрашиваемых URL

awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
Это позволяет определить страницы и эндпоинты, к которым обращаются чаще всего.

Проверка конкретного IP

После обнаружения подозрительного адреса можно посмотреть его запросы:
grep "192.0.2.10" /var/log/nginx/access.log | tail -100
При анализе необходимо обратить внимание на:
  • количество запросов;
  • частоту запросов;
  • IP-адрес;
  • User-Agent;
  • запрашиваемые URL;
  • HTTP-коды ответа;
  • количество одновременных соединений;
  • обращения к ресурсоёмким страницам.
Важно: большое количество запросов с одного IP не всегда означает атаку. За одним IP могут находиться несколько пользователей, например при использовании NAT. Кроме того, это может быть поисковый робот или легитимный API-клиент.

Как определить, что запросы создаёт бот

Одним из признаков автоматического трафика является большое количество однотипных запросов за короткий промежуток времени.
Например, подозрительным может быть поведение, при котором один источник:
  • отправляет сотни запросов в минуту;
  • последовательно перебирает страницы сайта;
  • обращается к несуществующим URL;
  • постоянно запрашивает один и тот же ресурсоёмкий URL;
  • пытается обращаться к /wp-login.php или /xmlrpc.php;
  • отправляет запросы с большим количеством разных URL;
  • создаёт большое количество одновременных соединений.
При этом одного признака недостаточно. User-Agent, IP и URL необходимо рассматривать вместе.

Как фильтровать нежелательный трафик

Защиту лучше настраивать поэтапно. Сначала необходимо определить источник нагрузки, затем применить мягкое ограничение и только после анализа результатов переходить к блокировке.

1. Блокировка IP-адреса

Если определён конкретный вредоносный IP, его можно заблокировать на уровне Nginx:
deny 192.0.2.10;
Это простой способ остановить трафик от конкретного адреса.
Однако постоянная блокировка IP не является универсальным решением. Боты могут использовать большое количество адресов, прокси или менять IP.
Поэтому блокировку лучше использовать для явно нежелательных источников, а для массового трафика применять rate limiting.

2. Ограничение частоты запросов

Rate limiting позволяет ограничить количество запросов от одного клиента.
Например:
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
Затем ограничение можно применить к нужному разделу:
location / {
    limit_req zone=one burst=20 nodelay;
}

В данном примере клиент может отправлять запросы с определённой скоростью, а небольшой кратковременный всплеск допускается параметром burst.
При превышении установленного ограничения Nginx может задерживать или отклонять запросы. Это позволяет снизить нагрузку, не блокируя пользователя полностью.
Значения rate и burst необходимо подбирать с учётом особенностей сайта. Слишком строгие ограничения могут затронуть обычных пользователей.

3. Ограничение одновременных соединений

Если клиент открывает большое количество параллельных соединений, можно ограничить их количество:
limit_conn_zone $binary_remote_addr zone=addr:10m;
И применить ограничение:
location / {
    limit_conn addr 10;
}

Это особенно полезно для защиты от клиентов, которые создают большое количество одновременных подключений.

Фильтрация по User-Agent

Nginx позволяет фильтровать запросы по User-Agent.
Например, если известно, что определённый бот является нежелательным:
if ($http_user_agent ~* "BadBot") {
    return 403;
}

Однако User-Agent нельзя использовать как единственный критерий блокировки. Его легко изменить, поэтому злоумышленник может представить свой запрос как обычный браузер или поискового робота.
Фильтрацию User-Agent лучше использовать как дополнительный уровень защиты.

Помогает ли robots.txt

Файл robots.txt предназначен для управления поведением поисковых роботов.
Например:
User-agent: *
Crawl-delay: 5

Такие правила могут попросить поддерживаемого робота делать паузы между запросами.
Однако robots.txt не является механизмом защиты:
  • вредоносные боты могут полностью игнорировать файл;
  • не все роботы поддерживают Crawl-delay;
  • файл не блокирует сетевые подключения;
  • запрос всё равно может попасть на сервер.
Поэтому robots.txt следует рассматривать как рекомендацию для добросовестных роботов, а не как средство защиты от атак.

Как снизить нагрузку на сервер

Фильтрация ботов — только одна часть оптимизации. Даже при нормальном количестве запросов сайт может создавать высокую нагрузку из-за PHP, базы данных или большого количества динамического контента.
Для снижения нагрузки можно:
  • включить кеширование;
  • использовать FastCGI Cache;
  • использовать Redis или Memcached;
  • отдавать статический контент через Nginx;
  • использовать CDN;
  • оптимизировать PHP-FPM;
  • оптимизировать запросы к MySQL/MariaDB;
  • ограничить доступ к ресурсоёмким URL;
  • защитить API от большого количества запросов;
  • отключить ненужные эндпоинты;
  • использовать rate limiting.
Особенно важно кешировать страницы, которые часто запрашиваются ботами. Если каждый запрос приводит к запуску PHP и обращению к базе данных, даже относительно небольшой поток запросов может создать высокую нагрузку.

Как защитить WordPress от ботов

WordPress часто становится целью автоматических запросов. Особое внимание стоит обратить на следующие URL:
/wp-login.php
/xmlrpc.php
/wp-admin/
/wp-json/


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

Ограничение запросов к wp-login.php

Например:
location = /wp-login.php {
    limit_req zone=one burst=5 nodelay;
}

Это позволяет ограничить количество запросов к странице авторизации.

Отключение XML-RPC

Если XML-RPC не используется, доступ к нему можно запретить:
location = /xmlrpc.php {
    deny all;
}

Перед отключением необходимо убедиться, что XML-RPC действительно не используется сайтом или подключёнными сервисами.

Когда использовать CDN или WAF

Если большой объём нежелательного трафика приходит непосредственно на VPS, блокировка средствами Nginx может быть недостаточной.
Например:
Бот → VPS → Nginx → PHP → MySQL

В этом случае сервер принимает соединения и обрабатывает запросы ещё до того, как они будут отфильтрованы.
При использовании CDN или WAF схема выглядит иначе:
Бот → CDN/WAF → VPS → Nginx → PHP → MySQL

CDN или WAF может отфильтровать часть нежелательного трафика до того, как он достигнет сервера.
Это особенно полезно при большом количестве запросов, массовом сканировании и других ситуациях, когда сам сервер уже испытывает высокую нагрузку.

Как не заблокировать обычных пользователей

При настройке фильтрации важно не ориентироваться только на IP-адрес.
Один внешний IP может использоваться сразу несколькими пользователями из-за:
  • NAT;
  • корпоративных сетей;
  • мобильных операторов;
  • VPN;
  • прокси.
Поэтому слишком жёсткое ограничение, например 1 запрос в секунду на IP, может затронуть обычных пользователей.
Также не стоит блокировать всех клиентов с определённым User-Agent. Один и тот же User-Agent может использоваться как ботом, так и легитимным приложением.
Лучше начинать с мягких ограничений:
  1. определить источник нагрузки;
  2. проверить его запросы;
  3. установить rate limit;
  4. посмотреть результаты;
  5. при необходимости усилить ограничение;
  6. заблокировать только явно нежелательный трафик.
Такой подход снижает вероятность блокировки обычных пользователей.

Мониторинг после настройки

После изменения конфигурации необходимо проверить, действительно ли нагрузка снизилась.
Стоит контролировать:
  • загрузку CPU;
  • использование RAM;
  • Load Average;
  • количество соединений;
  • количество запросов в секунду;
  • PHP-FPM;
  • MySQL/MariaDB;
  • access.log;
  • количество ответов 403;
  • количество ответов 429;
  • количество ошибок 5xx.
Особое внимание следует уделять HTTP-коду 429 Too Many Requests. Его увеличение может означать, что настроенное ограничение действительно срабатывает.
При этом необходимо убедиться, что большое количество 429 не связано с блокировкой обычных пользователей.

Пошаговый алгоритм защиты

Если сайт начал испытывать повышенную нагрузку из-за большого количества запросов, можно действовать следующим образом:
1. Проверьте нагрузку на сервер.
Определите, какой ресурс загружен: CPU, RAM, PHP-FPM, база данных или сеть.
2. Проверьте access.log.
Найдите IP-адреса и URL, которые получают наибольшее количество запросов.
3. Проанализируйте источник.
Проверьте User-Agent, частоту запросов, URL и характер обращений.
4. Начните с rate limiting.
Ограничьте частоту запросов, не блокируя клиента полностью.
5. Проверьте результат.
Сравните нагрузку на сервер до и после изменения конфигурации.
6. Заблокируйте явно вредоносные источники.
Для конкретных IP или известных вредоносных User-Agent можно использовать блокировку.
7. Оптимизируйте сайт.
Добавьте кеширование, оптимизируйте PHP и базу данных, ограничьте ресурсоёмкие эндпоинты.
8. Используйте CDN/WAF при большом объёме трафика.
Если нежелательный трафик слишком велик, его лучше фильтровать до того, как он попадёт на сервер.

Заключение

Защита от ботов начинается не с блокировки IP-адресов, а с анализа трафика. Сначала необходимо определить, кто создаёт нагрузку, какие URL запрашиваются и с какой частотой.
После этого можно постепенно применять rate limiting, ограничение одновременных соединений, фильтрацию отдельных IP и User-Agent, кеширование и другие методы оптимизации.
Если объём нежелательного трафика становится слишком большим, стоит использовать CDN или WAF, чтобы отсеивать запросы до их попадания на сервер.
Такой подход позволяет снизить нагрузку на сервер и одновременно минимизировать риск блокировки обычных пользователей.