Сегодня хочу поделиться опытом, как защитить сайт от DDoS-атак, не жертвуя SEO-показателями. Вы узнаете, как настроить rate limits, внедрить «невидимую» CAPTCHA и проверить, не замедлится ли сайт для поисковых роботов. В статье будут реальные примеры кода, тесты и лайфхаки, которые я применяю в своих проектах.
Почему DDoS-защита может убить SEO?
Представьте, вы настроили мощный файрволл, ограничили запросы, добавили CAPTCHA на каждую форму. А через месяц заметили, что трафик из Яндекса упал на 30%. Причина? Поисковые боты стали получать ошибки 429 или бесконечно решать капчи. Результат — краулинговый бюджет сократился, страницы выпали из индекса.
Моя задача найти баланс, отсечь ботов-атакеров, но пропустить Googlebot и Yandex. Расскажу, как это сделать.
Настройка Rate Limits
Rate Limit (ограничение частоты запросов) — основа защиты от DDoS. Но если настроить его неправильно, под удар попадут и пользователи, и поисковики.
Шаг 1. Определяем нормальный трафик
Перед настройкой я анализирую логи Nginx за 30 дней. Например:
- Среднее число запросов от одного IP: 120/мин.
- Пиковые значения (во время акций): 500/мин.
Шаг 2. Настраиваем Nginx
В конфигурации сервера добавляю зону для ограничений:
http { limit_req_zone $binary_remote_addr zone=api_limit:10m rate=200r/m; } server { location / { limit_req zone=api_limit burst=300 nodelay; } }
Пояснение:
rate=200r/m
— 200 запросов в минуту с одного IP.burst=300
— разрешаем кратковременные всплески до 300 запросов.nodelay
— не задерживаем запросы, а сразу отклоняем лишние.
Важно! Исключаем поисковых ботов. Для этого проверяем User-Agent и добавляем условие:
map $http_user_agent $is_bot { default 0; ~*(Googlebot|YandexBot|Bingbot) 1; } server { location / { if ($is_bot) { limit_req off; # Отключаем лимит для ботов } } }
CAPTCHA
CAPTCHA — эффективный инструмент, но её неправильная реализация блокирует краулеры. Мой подход — «невидимая» проверка для ботов.
Пример: интеграция hCaptcha с проверкой IP
Использую Cloudflare и их сервис Turnstile. Код для PHP:
// Проверяем, является ли посетитель ботом $user_agent = $_SERVER['HTTP_USER_AGENT']; $is_search_bot = preg_match('/Googlebot|YandexBot|Bingbot/', $user_agent); if (!$is_search_bot) { // Показываем CAPTCHA только людям $secret = "ваш_ключ"; $response = $_POST['cf-turnstile-response']; $url = "https://challenges.cloudflare.com/turnstile/v0/siteverify"; $data = array( 'secret' => $secret, 'response' => $response ); $result = json_decode(file_get_contents($url, false, stream_context_create(array( 'http' => array( 'method' => 'POST', 'header' => "Content-Type: application/x-www-form-urlencoded\r\n", 'content' => http_build_query($data) ) )))); if (!$result->success) { die("Пройдите CAPTCHA!"); } }
Как это работает:
- Поисковые боты видят страницу без CAPTCHA.
- Пользователи решают CAPTCHA только при подозрительной активности (например, 100 запросов в минуту).
Сравнительные тесты: что происходит со скоростью?
Я провел эксперимент на тестовом сайте (WordPress, 500 страниц).
Параметр | Без защиты | С Rate Limit | Rate Limit + CAPTCHA |
---|---|---|---|
Время загрузки (с) | 1.2 | 1.3 | 1.4 |
Запросов/сек | 1500 | 900 | 700 |
Ошибки краулеров | 0% | 12% | 0% |
Выводы:
- Rate Limit снижает нагрузку, но может блокировать ботов.
- CAPTCHA с исключениями для SEO возвращает ошибки краулеров к 0%, но добавляет +0.1с к загрузке.
Мои 3 правила для баланса
- Белые списки для ботов. Всегда исключайте Googlebot, YandexBot и других легитимных краулеров из ограничений.
- Мониторьте логи. Раз в неделю проверяйте, не блокируются ли поисковики.
- Тестируйте скорость. После настройки защиты запускайте Lighthouse или WebPageTest. Если TTFB вырос на 30% оптимизируйте кэширование.