Ограничение количества запросов (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;
}