Назад | Перейти на главную страницу

Попытка ограничить запросы в Nginx по URI

Мне нужно ограничить количество запросов, которые конкретный IP-адрес может отправлять для определенного URI (например, www.foo.com/somewhere/special), оставляя остальную часть сайта нерегулируемой.

Как мне настроить это с помощью HttpLimitReqModule встроен в Nginx?

Вам нужно добавить

location /somewhere/special {
...
}

где вы настраиваете свои лимиты с помощью HttpLimitReqModule или HttpLimitZoneModule модули.

Вот как это делается на одном из моих сайтов. Сначала мы используем geo модуль для определения переменной, которая будет использоваться для определения ограниченных адресов:

geo $slow {
    default 0;
    include /etc/nginx/conf.d/slowlist;
}

Файл медленного списка выглядит так:

192.168.0.0/24  1;
192.168.10.0/24  1;

и так далее (IP-адреса, конечно, только примеры). Затем мы определяем ограничения скорости:

limit_req_zone $binary_remote_addr zone=fast:1m rate=1000r/s;
limit_req_zone $binary_remote_addr zone=slow:10m rate=20r/m;

Теперь нам нужно назначить req_zones каждому IP-адресу. Внутри нужной локации мы проверяем переменную $ slow, и если она равна 1, перенаправляем в локацию @slow (используя фиктивную ошибку 555):

recursive_error_pages on;
error_page 555 = @slow;
if ($slow = 1) {
    return 555;
}
limit_req zone=fast burst=10000 nodelay;

Затем следуют обычные правила, включая root, index, fastcgi *, что угодно. Здесь будет использоваться зона ограничения «быстрая». И, наконец, определяем локацию @slow, в которой будет использоваться зона ограничения 'slow':

location @slow {
    limit_req zone=slow burst=5 nodelay;

Затем следуют обычные правила, включая root, index, fastcgi *, что угодно.

Итак, обычные запросы обрабатываются в обычном месте, а все остальные перенаправляются в локацию @slow.