Все статьиТехническоеПрокси-инфраструктура7 мин

403, 429 и 503 через прокси: реальный тест backoff

Тест на открытом HTTP endpoint: прокси доставил 200/403/429/503, а три ограниченных повтора после 429 показали, почему нужен лимит.

Команда InfraProxy

18 августа 2026 г.

#HTTP 403#HTTP 429#HTTP 503#backoff#тест прокси

В контролируемом тесте прокси корректно доставил ответы 200, 403, 429 и 503. Значит, HTTP-ошибка сама по себе не доказывает, что прокси не работает: он мог успешно передать отказ тестового сервера.

Методика

Тест выполнен 18 августа 2026 года через один DC HTTPS-прокси. Цель — открытый сервис httpbingo.org, который возвращает заданный HTTP-статус.

Перед матрицей проверили базовое подключение:

  • внешний IP получен;
  • запрос завершился за 887 мс;
  • в отдельной проверке 10 из 10 узлов ответили;
  • все 10 успешных запросов вернули разные выходные IP.

Credentials и IP-адреса в публикацию не включены.

Матрица статусов

Запрошенный статус Полученный статус Время, мс
200 200 818
403 403 860
429 429 857
503 503 853

Все четыре ответа совпали с ожидаемыми. На сетевом уровне прокси установил соединение и передал HTTP-ответ.

Почему 403 не равен «мёртвый IP»

403 Forbidden означает, что HTTP-сервер отказал запросу. Причиной могут быть права, URL, заголовки или правила источника. В нашем тесте 403 был ожидаемым ответом специального endpoint.

Сетевой сбой выглядел бы иначе: ProxyError, connect timeout, TLS error или разрыв соединения до получения HTTP-статуса.

Что показал тест backoff

Затем тот же прокси три раза запросил endpoint, который всегда возвращает 429. Между попытками использовались паузы 1 и 2 секунды.

Попытка Статус Время, мс Пауза после
1 429 851 1 с
2 429 814 2 с
3 429 930 остановка

Backoff не «исправил» 429, потому что тестовый endpoint специально всегда возвращает этот статус. Зато лимит в три попытки остановил бесконечный цикл.

Производственный алгоритм

import random
import time

def retry_delay(attempt: int, retry_after: str | None) -> float:
    if retry_after and retry_after.isdigit():
        return float(retry_after)
    return (2 ** attempt) + random.uniform(0, 0.5)

for attempt in range(3):
    response = make_request()
    if response.status_code != 429:
        break
    if attempt == 2:
        raise RuntimeError("429: бюджет повторов исчерпан")
    time.sleep(retry_delay(attempt, response.headers.get("Retry-After")))

Если сервер прислал Retry-After, используйте его. После исчерпания бюджета отправьте задачу в очередь ошибок и снизьте частоту для всего домена.

Ограничения теста

Тестовый endpoint не моделирует реальную антибот-систему, динамическую квоту или CAPTCHA. Один прокси и короткий прогон не показывают uptime пула. Полученные миллисекунды относятся только к указанному маршруту и времени.

Тест доказывает более узкое: HTTP-статус и сетевой сбой нужно учитывать раздельно, а backoff должен иметь предел.

Этичность

Матрица использовала открытый сервис для тестирования HTTP-статусов. На рабочих источниках соблюдайте robots.txt, Crawl-delay, условия использования и Retry-After. Не ротируйте IP ради обхода опубликованной квоты и не создавайте повторными запросами лишнюю нагрузку.

Методика диагностики и порядок сравнения режимов описаны в разборе 403, 429 и timeout. Для проверки своей конфигурации используйте страницу прокси.

Ключевые выводы

  • Прокси корректно доставил все четыре ожидаемых статуса.
  • 403, 429 и 503 не равны сетевой ошибке прокси.
  • Три попытки с backoff снова получили 429, после чего тест остановился.
  • Backoff снижает частоту, но не гарантирует успех и должен иметь предел.

Краткий ответ: HTTP-ошибка показывает ответ сервера, а не поломку прокси; ограниченный backoff нужен, чтобы не превратить отказ в бесконечную нагрузку.

Нужна прокси-инфраструктура под вашу нагрузку?

Сравните Datacenter и ISP прокси, протоколы и условия теста перед договором.

Перейти к прокси