Ошибки

Ошибка 429 Too Many Requests: что значит и как настроить ограничение

429 Too Many Requests — клиент прислал слишком много запросов за короткое время, и сервер временно перестал их выполнять. Это обычная защита: от подбора паролей, от слишком частых обращений к API, от ботов. Посетителю обычно достаточно подождать.

Обновлено 07.10.2026≈ 5 мин чтения
Содержание 9

Что означает код 429

Код 429 описан в RFC 6585 — дополнении к стандарту HTTP. Он значит: пользователь отправил слишком много запросов за определённое время. В ответе стоит объяснить, что случилось, а заголовок Retry-After может подсказать, сколько ждать перед новым запросом. Сохранять ответ 429 в кэше нельзя.

Как сервер узнаёт пользователя и как считает его запросы, стандарт не определяет: это может быть учётная запись или cookie, а в примере из документации nginx запросы считаются по IP-адресу клиента.

Отвечать именно 429 сервер не обязан: ограничивая нагрузку, он может, например, просто обрывать соединения.

Если вы посетитель

  1. Подождите несколько минут и не обновляйте страницу много раз подряд: каждое обновление — новый запрос.
  2. Если вы выходите в интернет через общий адрес — в офисе, в общественном Wi-Fi, через мобильного оператора, — а сайт считает запросы по IP-адресу, лимит могли исчерпать другие люди. Попробуйте позже или переключитесь с Wi-Fi на мобильный интернет.
  3. Если 429 вернул API, посмотрите в ответе заголовок Retry-After, если сервер его прислал: там сказано, сколько ждать.
  4. Если ошибка не проходит, напишите владельцу сайта, что и когда вы делали.

Как ограничить частоту запросов в nginx

В nginx за это отвечает модуль limit_req. Сначала в блоке http (файл /etc/nginx/nginx.conf) описывают зону — где хранить счётчики и какой темп разрешён:

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

Здесь запросы считаются по IP-адресу клиента, под счётчики отведено 10 МБ памяти, а разрешён один запрос в секунду. Темп меньше одного запроса в секунду задают в минутах: 30r/m — это ползапроса в секунду.

Затем ограничение включают для нужного адреса:

location /api/ {
    limit_req zone=one burst=5;
    limit_req_status 429;
    proxy_pass http://127.0.0.1:8000;
}

Строку proxy_pass замените той, что передаёт запросы вашему приложению.

  • burst — сколько лишних запросов nginx готов придержать. Запросы сверх темпа он задерживает, пока их не станет больше burst, а дальше отклоняет. По умолчанию burst равен нулю.
  • limit_req_status — каким кодом отвечать на отклонённые запросы. По умолчанию nginx отвечает 503, а 429 точнее говорит клиенту, что случилось. Директива есть в nginx с версии 1.3.15.

Не включайте такое ограничение для всего сайта в location /: одна страница тянет за собой картинки, стили и скрипты, и обычный посетитель быстро упрётся в лимит.

Отклонённые запросы nginx записывает в журнал ошибок:

limiting requests, excess: 5.120 by zone "one"

Чтобы сначала проверить настройку, ничего не отклоняя, добавьте limit_req_dry_run on (есть с версии 1.17.1): nginx будет только писать в журнал такие же строки с пометкой dry run.

После любых правок: sudo nginx -t, затем sudo systemctl reload nginx.

Как защитить вход в WordPress

Вход в WordPress идёт через адрес /wp-login.php. Чтобы подбирать пароли было медленно, ограничьте частоту запросов к нему. В блоке http заведите отдельную зону с мягким темпом:

limit_req_zone $binary_remote_addr zone=login:10m rate=30r/m;

А в настройках сайта — отдельный блок для адреса входа:

location = /wp-login.php {
    limit_req zone=login burst=3;
    limit_req_status 429;
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
Строки include и fastcgi_pass обязательны: без них nginx отдаст wp-login.php как обычный файл, а не выполнит его.

Путь к сокету указан для PHP 8.3 из Ubuntu 24.04; в Ubuntu 26.04 это php8.5-fpm.sock.

Что ещё учесть

Сайт за CDN или прокси. Тогда все запросы приходят к nginx с адресов посредника, и посетители делят один лимит на всех. Настройте nginx так, чтобы он видел настоящий IP-адрес посетителя, или ограничивайте частоту запросов на стороне CDN.

API. Если ограничение делает само приложение, пусть оно присылает вместе с 429 заголовок Retry-After: так клиенты API смогут повторять запросы автоматически и вовремя.

429 и поиск Яндекса

По справке Яндекса, ответ 429 значит, что за короткое время отправлено слишком много запросов, — например, это может быть попытка DDoS-атаки. Заголовок Retry-After Яндекс не учитывает. Яндекс советует настроить ограничение количества запросов, задать квоты для разных типов пользователей и оптимизировать инфраструктуру. Настраивайте лимиты так, чтобы они не мешали поисковым роботам обходить сайт.

Чем 429 отличается от соседних кодов

КодКогда возникает
403Доступ запрещён — ожидание не поможет
429Слишком много запросов: подождите и повторите
503Сервер временно не может ответить; этот же код nginx по умолчанию отдаёт при срабатывании limit_req

Источники

Сверено 6 октября 2026 года.

Что почитать дальше

Проверено и обновлено: 07.10.2026