Мне нужно ограничить количество запросов, которые конкретный 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.