Практическое задание

Эта задача — шаг 19 курса «Основы nginx»

Ограничь частоту запросов

сложно~20 мин

Сайт на nginx (/etc/nginx/sites-enabled/app) сейчас отвечает на любой поток запросов. Настрой ограничение частоты: примерно один запрос в секунду с адреса, с небольшим запасом на всплеск — 2–3 запроса. При превышении nginx должен отвечать ошибкой (503), а после паузы снова обслуживать нормально. Сайт при этом обязан продолжать отдавать страницу.

Что потренируешь:
  • nginx
  • limit_req_zone
  • limit_req
  • burst
  • rate limiting

Разбор темы

Ограничитель частоты в nginx реализует алгоритм «дырявого ведра»: limit_req_zone заводит разделяемую память, где по ключу (обычно адресу клиента) хранится состояние счётчика, а limit_req включает проверку в нужном месте. Директива объявления зоны допустима только в контексте http, поэтому её выносят в отдельный файл conf.d, а применение — в server/location. Параметр burst задаёт размер очереди для всплесков: без nodelay такие запросы обслуживаются с задержкой, выравнивая поток, с nodelay — сразу, но сверх лимита всё равно отклоняются. Превышение возвращает 503, код настраивается через limit_req_status.

Что проверяется

  1. поток одновременных запросов упирается в лимит
  2. после паузы сайт снова отвечает 200
  3. небольшой всплеск проходит
  4. зона ограничения объявлена

Как это выглядит