Коротко: если у вас свой сервер с nginx и PHP-FPM, защиту Bot Guard можно подключить без плагина CMS. nginx перед каждым запросом спрашивает небольшой PHP-шлюз, пускать ли посетителя, шлюз передаёт данные запроса в Bot Guard и отвечает «пропустить», «заблокировать» или «показать проверку браузера». Установка занимает около пятнадцати минут, архив с файлами лежит ниже.
Когда это нужно
Для WordPress и 1С-Битрикс у нас есть готовые плагин и модуль. Вариант для nginx подходит, если сайт не на этих системах (самописный, Laravel, Django, статический сайт, интернет-магазин на другой платформе) или если вы хотите, чтобы проверка шла на уровне сервера, раньше, чем запрос дойдёт до приложения. Бот в этом случае вообще не нагружает ваш PHP, базу и CMS: отказ выдаёт nginx.
Как это устроено
- Посетитель обращается к сайту, nginx принимает запрос.
- Директива
auth_requestотправляет внутренний подзапрос в шлюзgate.php. Подзапрос не виден посетителю. - Шлюз передаёт в Bot Guard IP-адрес, User-Agent, метод, referer, язык браузера и адрес запроса и получает ответ: нормальный посетитель, бот или подозрительный.
- Шлюз отвечает nginx кодом: 204 (пропустить), 403 (заблокировать) или 401 (показать тихую проверку браузера).
- На 401 nginx отдаёт страницу
challenge.html. Скрипт на ней незаметно получает у Bot Guard метку-cookie и перезагружает страницу. Человек этого не замечает, простой скрипт-бот проверку не проходит.
Если Bot Guard не ответил за две секунды или ответ непонятен, посетитель пропускается: защита не должна останавливать сайт. Настоящих поисковых роботов (Google, Яндекс и другие) Bot Guard проверяет сам, по обратному DNS, отдельно настраивать их не нужно.
Что понадобится
- nginx с модулем
http_auth_request_module. Он есть в большинстве сборок, проверка:nginx -V 2>&1 | grep auth_request. - PHP 7.4 или новее с расширением curl (PHP-FPM).
- Сайт, добавленный в личном кабинете на bot-guard.ru: оттуда берётся номер сайта.
Установка
1. Скачайте архив bot-guard-nginx-1.0.zip и распакуйте файлы gate.php и challenge.html в каталог /etc/nginx/botguard/.
2. Впишите номер сайта в страницу проверки (замените 123 на свой номер):
sed -i 's/YOUR_SITE_ID/123/g' /etc/nginx/botguard/challenge.html
3. Добавьте блоки в конфиг сайта. Полный пример лежит в архиве (nginx.conf.example), главное:
location = /_botguard_gate {
internal;
fastcgi_pass unix:/run/php/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME /etc/nginx/botguard/gate.php;
fastcgi_param BOTGUARD_SITE_ID 123;
fastcgi_param HTTP_X_REAL_IP $remote_addr;
fastcgi_param HTTP_X_ORIGINAL_URI $request_uri;
fastcgi_param HTTP_X_ORIGINAL_METHOD $request_method;
fastcgi_param HTTP_COOKIE $http_cookie;
include fastcgi_params;
fastcgi_pass_request_body off;
fastcgi_param CONTENT_LENGTH "";
}
location @botguard_challenge {
root /etc/nginx/botguard;
default_type text/html;
add_header Cache-Control "no-store" always;
try_files /challenge.html =500;
}
error_page 401 = @botguard_challenge;
location / {
auth_request /_botguard_gate;
# ... ваш обычный location (proxy_pass, try_files или fastcgi_pass) ...
}
Подставьте свой номер сайта и путь к сокету PHP-FPM. Статику (картинки, стили, скрипты) удобно вынести в отдельный location без auth_request: так вы не тратите проверки на файлы.
4. Проверьте и перезагрузите:
nginx -t && systemctl reload nginx
Как проверить, что работает
- Откройте сайт обычным браузером: он должен открываться как раньше, без задержки и без капчи.
- В личном кабинете Bot Guard в статистике сайта должны появиться визиты.
- Проверка скриптом: запрос без User-Agent шлюз пропускает (нет данных для решения), а запрос от известного плохого бота получает 403. Не тестируйте с собственного IP много раз подряд: защита может занести его в список блокировок, это нормально, но неприятно.
Подводные камни
- Не используйте
returnиrewrite ... breakвнутри защищаемогоlocation. Эти директивы выполняются раньшеauth_request, и защита молча перестаёт работать. Нужныproxy_pass,try_filesилиfastcgi_pass. - Если PHP-FPM лёг,
auth_requestотдаст посетителю ошибку. Шлюз сам пропускает посетителя при сбое Bot Guard, но за доступностью PHP-FPM следите отдельно (например, дайте шлюзу свой пул процессов). - Реальный IP за прокси или CDN. Если перед nginx стоит балансировщик, настройте модуль
realip, иначе шлюз увидит IP балансировщика, а не посетителя. - Кэширование. Не включайте кэш ответов шлюза на уровне nginx: решение зависит от посетителя.
Что передаётся в Bot Guard
IP-адрес, User-Agent, метод запроса, referer, язык браузера и адрес запрошенной страницы. Содержимое страниц, формы и пароли не передаются. Сроки хранения и цели описаны в политике конфиденциальности.
Отпечаток TLS: заготовка на будущее
У крупных сервисов защиты есть сигнал, которого нет у плагинов, — отпечаток TLS-соединения (JA3/JA4): скрипт может назваться Chrome, но рукопожатие у него другое. Плагин CMS его не видит, а nginx — может, если собран с нужным модулем. Шлюз уже умеет принимать отпечаток в заголовке X-JA3 (строка в конфиге закомментирована), но пока только пересылает его: на решение он не влияет. Мы добавим его в оценку, когда накопим данные.
Вопросы и ответы
Это платно? На дату публикации Bot Guard бесплатен, условия описаны в условиях использования.
Замедлит ли это сайт? К каждому запросу добавляется один быстрый подзапрос к Bot Guard (ограничение — две секунды, обычно заметно меньше). Статику лучше исключить из проверки.
А если у меня WordPress или Битрикс? Проще поставить плагин или модуль.
Чем это отличается от fail2ban? fail2ban банит по строкам в логе после того, как бот уже отработал; здесь решение принимается до обработки запроса, и учитываются данные всей сети подключённых сайтов. Подробнее про логи и fail2ban: статья.
Если хотите понять, сколько ботов приходит на ваш сайт до подключения, начните с бесплатных инструментов: разбор access-лога или Яндекс.Метрики.
Защитите свой сайт от ботов прямо сейчас
Подключение занимает несколько минут — вставьте один PHP-сниппет, и Bot Guard начнёт фильтровать ботов, скрейперов и попытки SQL-инъекций автоматически.