Nginx http limit conn module
Модуль ngx_http_limit_conn_module позволяет ограничить число соединений по заданному ключу, в частности, число соединений с одного IP-адреса.
Учитываются не все соединения, а лишь те, в которых имеются запросы, обрабатываемые сервером, и заголовок запроса уже прочитан.
Пример конфигурации
http { limit_conn_zone $binary_remote_addr zone=addr:10m; ... server { ... location /download/ { limit_conn addr 1; }
Директивы
Синтаксис: limit_conn зона число; Умолчание: — Контекст: http, server, location Задаёт зону разделяемой памяти и максимально допустимое число соединений для одного значения ключа. При превышении этого числа в ответ на запрос сервер вернёт ошибку 503 (Service Temporarily Unavailable). Например, директивы
limit_conn_zone $binary_remote_addr zone=addr:10m;
server { location /download/ { limit_conn addr 1; }
разрешают одновременно обрабатывать не более одного соединения с одного IP-адреса.
Допустимо одновременное указание нескольких директив limit_conn, при этом будет срабатывать любое из ограничений. Например, следующая конфигурация ограничивает число соединений с сервером с одного клиентского IP-адреса и в то же время ограничивает общее число соединений с виртуальным хостом:
limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m;
server { ... limit_conn perip 10; limit_conn perserver 100; }
Директивы наследуются с предыдущего уровня при условии, что на данном уровне не описаны свои директивы limit_conn.
Синтаксис: limit_conn_log_level info | notice | warn | error; Умолчание:
limit_conn_log_level error;
Контекст: http, server, location Эта директива появилась в версии 0.8.18. Задаёт желаемый уровень записи в лог случаев ограничения числа соединений.
Синтаксис: limit_conn_status код; Умолчание:
limit_conn_status 503;
Контекст: http, server, location Эта директива появилась в версии 1.3.15. Позволяет переопределить код ответа, используемый при отклонении запросов.
Синтаксис: limit_conn_zone $переменная zone=название:размер; Умолчание: — Контекст: http Задаёт параметры зоны разделяемой памяти, которая хранит состояние для разных значений ключа. Состояние в частности содержит текущее число соединений. Ключом является любое непустое значение заданной переменной (пустые значения не учитываются). Пример использования:
limit_conn_zone $binary_remote_addr zone=addr:10m;
Здесь в качестве ключа используется IP-адрес клиента. Обратите внимание, что вместо переменной $remote_addr использована переменная $binary_remote_addr. Длина значения переменной $remote_addr может колебаться от 7 до 15 байт, при этом размер хранимого состояния составляет либо 32, либо 64 байта на 32-битных платформах и всегда 64 байта на 64-битных. Длина значения переменной $binary_remote_addr всегда равна 4 байтам, при этом размер состояния всегда равен 32 байтам на 32-битных платформах и 64 байтам на 64-битных. В зоне размером 1 мегабайт может разместиться около 32 тысяч состояний размером 32 байта или 16 тысяч состояний размером 64 байта. При переполнении зоны в ответ на последующие запросы сервер будет возвращать ошибку 503 (Service Temporarily Unavailable).
Синтаксис: limit_zone название $переменная размер; Умолчание: — Контекст: http
Эта директива устарела в версии 1.1.8, вместо неё следует использовать аналогичную директиву limit_conn_zone с изменённым синтаксисом:
limit_conn_zone $переменная zone=название:размер;