Как защитить сайт от ботов и снизить нагрузку на сервер
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-коды ответа;
- количество одновременных соединений;
- обращения к ресурсоёмким страницам.
Как определить, что запросы создаёт бот
Одним из признаков автоматического трафика является большое количество однотипных запросов за короткий промежуток времени.Например, подозрительным может быть поведение, при котором один источник:
- отправляет сотни запросов в минуту;
- последовательно перебирает страницы сайта;
- обращается к несуществующим URL;
- постоянно запрашивает один и тот же ресурсоёмкий URL;
- пытается обращаться к /wp-login.php или /xmlrpc.php;
- отправляет запросы с большим количеством разных 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;
- файл не блокирует сетевые подключения;
- запрос всё равно может попасть на сервер.
Как снизить нагрузку на сервер
Фильтрация ботов — только одна часть оптимизации. Даже при нормальном количестве запросов сайт может создавать высокую нагрузку из-за PHP, базы данных или большого количества динамического контента.Для снижения нагрузки можно:
- включить кеширование;
- использовать FastCGI Cache;
- использовать Redis или Memcached;
- отдавать статический контент через Nginx;
- использовать CDN;
- оптимизировать PHP-FPM;
- оптимизировать запросы к MySQL/MariaDB;
- ограничить доступ к ресурсоёмким URL;
- защитить API от большого количества запросов;
- отключить ненужные эндпоинты;
- использовать rate limiting.
Как защитить 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;
- прокси.
Также не стоит блокировать всех клиентов с определённым User-Agent. Один и тот же User-Agent может использоваться как ботом, так и легитимным приложением.
Лучше начинать с мягких ограничений:
- определить источник нагрузки;
- проверить его запросы;
- установить rate limit;
- посмотреть результаты;
- при необходимости усилить ограничение;
- заблокировать только явно нежелательный трафик.
Мониторинг после настройки
После изменения конфигурации необходимо проверить, действительно ли нагрузка снизилась.Стоит контролировать:
- загрузку CPU;
- использование RAM;
- Load Average;
- количество соединений;
- количество запросов в секунду;
- PHP-FPM;
- MySQL/MariaDB;
- access.log;
- количество ответов 403;
- количество ответов 429;
- количество ошибок 5xx.
При этом необходимо убедиться, что большое количество 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, чтобы отсеивать запросы до их попадания на сервер.
Такой подход позволяет снизить нагрузку на сервер и одновременно минимизировать риск блокировки обычных пользователей.