Ограничение количества запросов (limit_req) по условию
Содержание |
Обзор
Модуль limit_req в SEnginx основан на модуле limit_req из версии nginx от tengine. Модуль limit_req в SEnginx расширяет оригинальный модуль limit_req nginx функциями: действие при превышении лимита, условие применения ограничения и белый список IP-адресов.
SEnginx добавляет новый параметр, который запускает limit_req только, если имеет значение "истина". Расширенный limit_req module может использоваться вместе с модулями HTTP Robot Mitigation и IP Access Behavior Module для того, чтобы иметь больше стратегий ограничения количества запросов и защиты от ddos-атак.
Эта функциональность доступна начиная с версии 1.5.10.
Директивы
limit_req
| Синтаксис | limit_req zone=zone_name [burst=burst] [forbid_action=action] [nodelay] [condition=$cond]; |
| Контекст | http, server, location |
Новый параметр "forbid_action" указывает URL для редиректа если количество запросов превышает лимит зоны. forbid_action может быть именованным location.
Правило limit_req активно, если новый параметр "condition" имеет значение "истина". В противном случае правило limit_req не применяется.
limit_req_whitelist
| Синтаксис | limit_req_whitelist geo_var_name=var_name geo_var_value=var_value; |
| Контекст | http, server, location |
Определяет белый список IP-адресов для обхода ограничения limit_req.
'geo_var_name' это имя переменной, определенной с помощью директивы geo, а 'geo_var_value' ее значение. Например:
geo $local_ip {
ranges;
default 0;
127.0.0.1-127.0.0.255 1;
}
limit_req_whitelist geo_var_name=local_ip geo_var_value=1;
Пример конфигурации
Применить ограничение количества запросов к чувствительному ресурсу.
Смотрите также: IP Access Behavior Module
limit_req_zone $binary_remote_addr $request_uri zone=cc:10m rate=3r/s;
...
location ~ /bbs/.*\.php {
ip_behavior_sensitive;
set $cond 0;
ifall ($insensitive_percent >= 0) ($insensitive_percent <= 30) {
set $cond 1;
}
limit_req zone=cc burst=3 forbid_action=@process condition=$cond;
proxy_pass http://backend;
}
location @process {
ns_layer_force_run;
robot_mitigation on;
robot_mitigation_blacklist 5;
proxy_pass http://backend;
}