Модуль ngx_mail_limit_conn_module

Пример конфигурации
Директивы
     limit_conn
     limit_conn_dry_run
     limit_conn_log_level
     limit_conn_zone

Модуль ngx_mail_limit_conn_module (1.29.0) позволяет ограничить число соединений по заданному ключу, в частности, число соединений от одного аутентифицированного пользователя.

Соединения ограничиваются после аутентификации, так что в качестве ключа может использоваться имя пользователя, возвращённое сервером аутентификации, а также произвольные поля заголовка ответа сервера аутентификации.

Пример конфигурации

mail {
    limit_conn_zone $remote_user zone=user:10m;

    ...

    server {

        ...

        limit_conn user 10;
    }
}

Директивы

Синтаксис: limit_conn зона число;
Умолчание:
Контекст: mail, server

Задаёт зону разделяемой памяти и максимально допустимое число соединений для одного значения ключа. При превышении этого числа сервер вернёт ошибку и закроет соединение. Например, директивы

limit_conn_zone $remote_user zone=user:10m;

server {
    limit_conn user 5;

разрешают одновременно обрабатывать не более пяти соединений от одного аутентифицированного пользователя.

Следует иметь в виду, что не все почтовые клиенты поддерживают используемые коды ответов, и могут предложить пользователю повторно ввести пароль. Поэтому не рекомендуется устанавливать слишком низкие ограничения, легко достижимые корректно ведущими себя почтовыми клиентами.

Директив limit_conn может быть несколько. Например, следующая конфигурация ограничивает число соединений от одного пользователя и в то же время ограничивает число соединений для всех пользователей в домене, возвращённом сервером аутентификации:

limit_conn_zone $remote_user zone=user:10m;
limit_conn_zone $auth_http_domain zone=domain:10m;

server {
    ...
    limit_conn user 5;
    limit_conn domain 100;
}

Директивы наследуются с предыдущего уровня конфигурации при условии, что на данном уровне не описаны свои директивы limit_conn.

Синтаксис: limit_conn_dry_run on | off;
Умолчание:
limit_conn_dry_run off;
Контекст: mail, server

Включает режим пробного запуска. В данном режиме число соединений не ограничивается, однако в зоне разделяемой памяти текущее число избыточных соединений учитывается как обычно.

Синтаксис: limit_conn_log_level info | notice | warn | error;
Умолчание:
limit_conn_log_level error;
Контекст: mail, server

Задаёт желаемый уровень записи в лог случаев ограничения числа соединений.

Синтаксис: limit_conn_zone ключ zone=название:размер;
Умолчание:
Контекст: mail

Задаёт параметры зоны разделяемой памяти, которая хранит состояние для разных значений ключа. Состояние в частности содержит текущее число соединений.

В качестве ключа можно использовать:

$remote_addr
адрес клиента
$remote_user
имя пользователя, использованное для аутентификации
$auth_http_имя
произвольное поле заголовка ответа сервера аутентификации; последняя часть имени переменной соответствует имени поля, приведённому к нижнему регистру, с заменой символов тире на символы подчёркивания

Запросы с пустым значением ключа не учитываются.

Пример использования:

limit_conn_zone $remote_user zone=user:10m;

Здесь в качестве ключа используется имя пользователя.

Размер состояния на 32-битных платформах равен 32 байтам для ключей длиной до 12 байт включительно, и 64 байтам для ключей от 13 до 44 байт. Размер состояния на 64-битных платформах равен 64 байтам для ключей длиной до 28 байт включительно. В зоне размером 1 мегабайт может разместиться около 32 тысяч состояний размером 32 байта или 16 тысяч состояний размером 64 байта. При переполнении зоны сервер вернёт ошибку и закроет соединение.