Когда сайт на Cloudflare перестаёт открываться у российских пользователей, бизнес ищет чем заменить Cloudflare, и часто первым шагом становится перенос балансировщика на собственную или локальную инфраструктуру. Но L7-атака ломает привычную картину: сотни медленных запросов, каждый из которых держит соединение десятки секунд, превращают равномерный round-robin в лотерею, где один сервер получает лавину тяжёлых сессий, а остальные простаивают. Именно на этом этапе решается, выдержит ли веб-платформа нагрузку или упадёт целиком.
Дальше разберём два алгоритма балансировки в условиях атаки на уровне приложений. Round-robin раздаёт запросы по кругу и хорош, когда все соединения короткие и однотипные. Least-connections смотрит на число активных запросов к каждому серверу и отправляет новый туда, где очередь короче. Под L7-атакой эта разница становится критичной: медленные соединения накапливаются, и алгоритм, который их не учитывает, быстро загоняет один узел в перегрузку.
Материал построен как чек-лист: что проверить в конфигурации, какие метрики смотреть, где проходит граница между «справляется» и «пора менять схему». Отдельно покажем, как российский аналог Cloudflare с встроенной балансировкой и защитой от ботов снимает часть этих задач, и почему замена Cloudflare на решение вроде TrafficVeil всё чаще рассматривается как способ удержать сайт в строю во время атаки.
Почему L7-атаки ломают привычную балансировку
L7-атака не обрушивает канал гигабитами. Она открывает сотни соединений и держит их, отправляя по одному запросу раз в 20-40 секунд. Каждый такой запрос занимает рабочий поток приложения: PHP-FPM, Node.js, Tomcat. Сервер формально жив, CPU на 15 процентов, сеть свободна, но очередь запросов растёт, и новые клиенты получают 504.
Именно из-за асимметрии стоимости запросов классические алгоритмы дают сбой. Балансировщик видит соединение, но не видит, что за ним: обычный GET главной страницы за 40 мс или поиск по каталогу с агрегацией, который держит воркер 8 секунд. Если решение принимается по счётчику соединений без учёта их длительности, распределение быстро расходится с реальной нагрузкой.
Что происходит технически:
- Медленные запросы (slowloris, RUDY, рандомные тяжёлые URL) держат соединение открытым минутами.
- Пул воркеров на бэкенде ограничен: 20-50 процессов на типовой сервер.
- Как только пул выбран, сервер перестаёт принимать новые запросы, хотя ресурсы CPU и RAM свободны.
- Health-check по TCP или по коду 200 на лёгкой странице продолжает отдавать “healthy”, и балансировщик льёт трафик в мёртвый по факту узел.
Дальше вступает эффект накопления. Один сервер получил на 30 процентов больше медленных соединений, его очередь выросла, время ответа увеличилось, клиенты начали ретраить запросы. Ретраи пришли на тот же узел, потому что соединение ещё числится активным. Через 5-10 минут узел деградирует полностью, и балансировщик перекладывает его долю на соседей, запуская ту же спираль.
Отдельная проблема: L7-атака часто маскируется под легитимный трафик. User-Agent браузера, валидные cookies, запросы к реальным URL. Отличить атакующее соединение от медленного мобильного клиента на 3G по одному пакету нельзя. Значит, балансировщик обязан работать с тем, что есть, и распределять нагрузку так, чтобы ни один узел не ушёл в перегруз первым.
Именно здесь расходятся два подхода. Round-robin и least-connections по-разному реагируют на то, что запросы стали долгими и дорогими. Дальше разберём, где ломается каждый из них и почему под L7-атакой выбор алгоритма важнее, чем количество серверов за балансировщиком.
Round-robin: простота, которая оборачивается перекосом под атакой
Round-robin работает по принципу карусели: первый запрос идёт на сервер A, второй на B, третий на C, четвёртый снова на A. Никакой телеметрии, никакого состояния, никаких вычислений. Именно поэтому этот алгоритм стоит по умолчанию почти в каждом балансировщике, от nginx до облачных L7-прокси. Для статики и коротких API-запросов этого достаточно: если каждый запрос занимает 20-50 мс, серверы получают примерно одинаковое число соединений, и разница между ними исчезает в пределах статистической погрешности.
Проблема в том, что L7-атака ломает базовое допущение round-robin: что все запросы примерно равны по стоимости обработки. Slowloris, RUDY, медленные POST-запросы, запросы к тяжёлым динамическим страницам с неполными заголовками – всё это создаёт соединения, которые висят десятки секунд, занимая воркеры и пулы соединений к базе. Round-robin об этом не знает. Он продолжает раздавать новые запросы по кругу, не глядя на то, что сервер B уже забит под завязку, а сервер A простаивает.
Почему один сервер становится узким местом
Механика перекоса выглядит так. Атакующий открывает 300 медленных соединений. Round-robin раскидывает их по трём бэкендам: по 100 на каждый. Параллельно идёт легитимный трафик, скажем, 600 запросов в минуту. Алгоритм распределяет и его равномерно, но у сервера B свободных воркеров уже нет: 100 медленных соединений держат пул, очередь растёт, время ответа для реальных пользователей улетает в секунды. Сервер A в это же время обрабатывает свои 100 медленных соединений и часть нормальных, но у него запас ещё есть.
Дальше срабатывает лавина. Пользователи на медленном бэкенде начинают ретраить запросы, каждый ретрай – новое соединение, round-robin снова кидает его на перегруженный узел с вероятностью 1/3. Health-check может не сработать: сервер отвечает на TCP, отдаёт 200 на лёгкую страницу, но динамика уже мертва. В итоге кластер из трёх машин деградирует до пропускной способности одной, а иногда и меньше, потому что ретраи и таймауты съедают остатки ресурсов.
Что стоит запомнить про round-robin под L7-атакой:
- Не учитывает длительность и стоимость запроса, только факт его поступления.
- Неравномерность накапливается: тяжёлые соединения закрепляются за конкретными бэкендами случайно.
- Weighted round-robin помогает только при статически разной мощности серверов, не при атаке.
- Sticky-сессии усугубляют перекос: клиент с медленным соединением остаётся на одном узле.
- Диагностика сложна: метрики CPU могут выглядеть ровно, пока смотришь на средние, а не на p95 и p99.
Round-robin остаётся разумным выбором для однородных коротких запросов и как fallback. Но как только появляется L7-нагрузка с плавающей стоимостью обработки, нужен алгоритм, который смотрит на текущее число активных соединений, а не на порядковый номер запроса.
Least-connections: равномерность за счёт учёта активных запросов
Least-connections работает не по счётчику запросов, а по счётчику активных соединений. Балансировщик держит таблицу: сколько сессий прямо сейчас обслуживает каждый backend. аналог cloudflare warp offers additional context worth reviewing. Новый запрос уходит на сервер с наименьшим значением. Если узел освободился, его счётчик упал, и он снова получает трафик. Логика простая, но именно она спасает под L7-атакой.
Смотрите, что происходит при медленных запросах. Атакующий открывает соединение, отправляет заголовки и держит сессию 20-30 секунд, ничего не досылая. Round-robin в этот момент уже отсчитал свою очередь и отправил следующий запрос на тот же узел. Least-connections видит: на этом сервере 40 висящих сессий, на соседнем 12. Следующий запрос идёт туда, где 12. Нагрузка выравнивается по факту, а не по расписанию.
Разница в цифрах. Возьмём пул из 4 серверов, каждый держит до 100 одновременных соединений. Атака 500 медленных запросов в секунду. Round-robin разложит их строго по 125 на узел, и все четыре упрутся в лимит одновременно. Least-connections отдаст первому серверу 100, второму 100, третьему 100, четвёртому 100, а остальные 100 запросов придержит в очереди балансировщика до освобождения слотов. Сайт остаётся живым, легитимные пользователи проходят.
Что важно понимать: least-connections не защищает сам по себе. Он не отличает бота от покупателя. Его задача – не дать одному узлу утонуть раньше остальных. Если атака однородная и все серверы забиты равномерно, алгоритм лишь отсрочит отказ. Поэтому в связке с ним нужны L7-фильтры, ограничение скорости на IP и GeoIP-фильтрация.
Сравнение по эффективности под L7:
| Критерий | Round-robin | Least-connections |
|---|---|---|
| Учёт длительности запроса | Нет | Да |
| Перекос при медленных сессиях | Высокий | Низкий |
| Сложность настройки | Минимальная | Низкая |
| Поведение при разнородных узлах | Слабое | Устойчивое |
Вывод для практики: если ваш пул однородный и запросы короткие, round-robin хватит. Как только появляются долгие сессии, загрузки, стриминг или L7-атака с медленными соединениями, least-connections даёт заметно ровнее картину. Держите оба алгоритма в конфиге и переключайте по ситуации.
Сравнение под L7-атакой: когда round-robin проигрывает least-connections
Ключевой инсайт прост: least-connections выравнивает нагрузку по количеству активных соединений, а round-robin считает только факт выдачи запроса. Пока запросы короткие (50-200 мс), разница незаметна: оба алгоритма дают отклонение в пределах 5-10%. Как только появляются медленные запросы на 5-30 секунд, картина меняется.
Сценарий из практики. Четыре бэкенда, round-robin, идёт L7-атака типа slowloris: 2000 соединений, каждое держится 20 секунд и отправляет заголовки по байту. Round-robin раздаёт их строго по кругу. Но если один сервер уже занят легитимным экспортом отчёта или бэкапом, он получает свою порцию атакующих соединений сверху и упирается в лимит воркеров. Остальные три стоят полупустые. Клиенты видят 502 и таймауты.
Теперь least-connections. Балансировщик смотрит на счётчик активных соединений и отправляет новый запрос туда, где их меньше. Сервер с экспортом отсекается автоматически, пока не освободится. Атакующий трафик растекается по свободным узлам, а не добивает уже нагруженный. При том же объёме атаки доля успешных легитимных запросов выше в 2-4 раза.
| Критерий | Round-robin | Least-connections |
|---|---|---|
| Медленные запросы (5-30 с) | Перекос до 3-5x на одном узле | Отклонение 10-20% |
| Разная мощность серверов | Не учитывает | Учитывает через счётчик соединений |
| Slowloris / L7-флуд | Забивает узлы по кругу | Обходит перегруженные узлы |
| Накладные расходы | Минимальные | Требует учёта состояния соединений |
| Предсказуемость | Высокая, простая отладка | Зависит от таймаутов и keep-alive |
Практический вывод: round-robin годится для статики и коротких API-запросов, где время ответа стабильно. Для динамики, лидогенерации, корзины интернет-магазина и всего, что ходит в базу, least-connections надёжнее. Ещё точнее работает связка: least-connections плюс ограничение по времени запроса и лимит соединений на клиентский IP. Без этих двух настроек медленный поток всё равно продавит любой алгоритм.
Отдельно стоит проверить, как балансировщик считает соединения при keep-alive. Если он видит одно долгоживущее соединение вместо десяти запросов внутри него, счётчик врёт, и least-connections начинает работать как round-robin. Таймаут простоя в 15-30 секунд и лимит запросов на соединение решают эту проблему.
Практическая настройка отказоустойчивости с TrafficVeil как заменой Cloudflare
Выбор алгоритма балансировки в TrafficVeil задаётся на уровне пула upstream-серверов. Для сайтов с однородными быстрыми ответами (статика, простой API) round-robin остаётся рабочим вариантом: он предсказуем и не требует дополнительной телеметрии. Но если бэкенд отдаёт динамику, работает с БД или внешними сервисами, ставьте least-connections. Именно этот режим учитывает число активных запросов на каждом узле и не забивает один сервер тяжёлыми соединениями, которые характерны для L7-атак.
Практический чек-лист настройки отказоустойчивости в TrafficVeil:
- Заведите минимум два upstream-сервера в пуле и включите health-check с интервалом 5-10 секунд. Порог отказа – 2-3 неудачные проверки подряд, иначе пул будет «дёргаться» на кратковременных таймаутах.
- Выберите least-connections как основной алгоритм для динамических сайтов, интернет-магазинов, WordPress и Bitrix. Round-robin оставьте для статики и внутренних сервисов.
- Настройте таймауты: connect 3-5 секунд, read 30-60 секунд. Слишком длинный read-таймаут под L7-атакой удерживает соединения и мешает балансировщику перераспределять нагрузку.
- Включите лимиты на соединения с одного IP и rate limiting на уровне L7. Это снижает эффект медленных запросов ещё до того, как они дойдут до бэкенда.
- Активируйте WAF и защиту от ботов. TrafficVeil не тарифицирует ботов, атаки и WAF-блокировки, поэтому фильтрация паразитного трафика не влияет на стоимость.
- Добавьте GeoIP-фильтрацию, если аудитория сосредоточена в РФ и СНГ. Отсечение нерелевантных регионов уменьшает шум и разгружает пул.
TrafficVeil объединяет DNS, SSL, reverse proxy, WAF, защиту от ботов, L7 DDoS, GeoIP-фильтрацию и аналитику в одной веб-платформе. Это российский аналог Cloudflare, который обеспечивает работу сайтов на территории РФ и по всему миру. Переход с Cloudflare занимает часы: достаточно перенести DNS-записи и указать upstream-серверы. Зависимость от зарубежной инфраструктуры создаёт риски для российского бизнеса, особенно когда Cloudflare ограничивает доступ к сайтам из России, а российские интернет-провайдеры в свою очередь ограничивают доступ к сайтам на Cloudflare. Замена Cloudflare на TrafficVeil снимает эти риски и даёт предсказуемую отказоустойчивость под L7-атакой без переплаты за трафик.
Практический шаг: вынесите тестовый стенд за балансировщик уровня L7 и прогоните оба алгоритма под синтетической медленной атакой. Сгенерируйте 200-300 параллельных запросов с задержкой ответа 5-10 секунд (медленное чтение тела запроса, длинные POST, запросы к тяжёлым эндпоинтам) и снимайте метрики каждые 10 секунд: активные соединения на бэкенд, время ответа p95 и p99, долю ошибок 502/504. На round-robin вы почти наверняка увидите перекос: один узел держит 60-80% активных сессий, потому что получает тяжёлые соединения по кругу, а не по фактической загрузке. Least-connections в том же сценарии держит разброс в пределах 10-15%. Зафиксируйте порог, при котором перекос становится критичным, и настройте health-check с интервалом 2-3 секунды и таймаутом 1 секунда, иначе мёртвый бэкенд продолжит получать трафик.
Дальше переносите конфигурацию в прод. Если сайт работает на WordPress или Bitrix, проверьте, что балансировщик корректно обрабатывает keep-alive и не копит зависшие сессии, а GeoIP-фильтрация и защита от ботов настроены до распределения трафика, чтобы атакующие запросы не доходили до пула вообще. TrafficVeil как российский аналог Cloudflare закрывает этот слой целиком: reverse proxy, WAF, L7 DDoS, GeoIP и аналитика в одном контуре, без тарификации ботов и WAF-блокировок. Для бизнеса, который ищет замену Cloudflare в 2026 году, это снимает зависимость от зарубежной инфраструктуры и ограничений доступа со стороны провайдеров. Запустите пилот на одном домене, сравните метрики с текущим балансировщиком за две недели и принимайте решение по цифрам.
{“@context”:”https://schema.org”,”@type”:”Article”,”headline”:”Балансировка под L7-атакой: round-robin или least-connections”,”description”:”Под L7-атакой least-connections распределяет медленные запросы ровнее, а round-robin забивает один сервер. Сравнение алгоритмов для отказоустойчивости.”,”inLanguage”:”ru”,”datePublished”:”2026-10-16T00:15:04Z”,”articleBody”:”Когда сайт на Cloudflare перестаёт открываться у российских пользователей, бизнес ищет чем заменить Cloudflare, и часто первым шагом становится перенос балансировщика на собственную или локальную инфраструктуру. Но L7-атака ломает привычную картину: сотни медленных запросов, каждый из которых держит соединение десятки секунд, превращают равномерный round-robin в лотерею, где один сервер получает лавину тяжёлых сессий, а остальные простаивают. Именно на этом этапе решается, выдержит ли веб-платфо”}