Назад | Перейти на главную страницу

Что может привести к исчерпанию памяти зоны и как на это реагирует Nginx?

Каков возможный сценарий исчерпания памяти, выделенной для зоны подключения с limit_conn_zone директива и каковы последствия в этом случае?

Предположим, у меня есть это в моей конфигурации:

http {
  limit_conn_zone $binary_remote_addr zone=connzone:1m;
  ...
  server {
    limit_conn connzone 5;

который, согласно документации, выделяет 16000 состояний для connzone на 64-битном сервере. Также говорится, что

Если хранилище для зоны исчерпано, сервер будет возвращать ошибку 503 (служба временно недоступна) на все последующие запросы.

Ладно, хорошо. Но что это значит на практике? Когда это происходит? Кто получает эти 503? Означает ли это, что если количество IP-адресов как-то связаны с connzone хиты 16000 каждый получает 503 и все кончено? Как решает Nginx? Документация по этому поводу странно расплывчата.

Итак, учитывая пример конфигурации, кто на самом деле получит 503, при каких обстоятельствах и как все будет дальше? То же самое с зоны запроса?

Цитата из http://forum.nginx.org/read.php?2,233709,233722#msg-233722

Сервер сможет отслеживать количество подключений для ~ 16 тысяч различных клиентских IP-адресов. Если у вас так много активных клиентов, то следующая попытка подключения от клиента, IP-адрес которого еще не известен, будет пытаться создать новое состояние, которое не удастся, потому что зона исчерпана, и клиенту будет возвращено 503.

Таким образом, если количество подключений уменьшится до 16000 (или любого другого ограничения), в будущем подключении не будет 503.

Практика? Вы можете контролировать общее количество IP-адресов, подключенных к серверу.

Когда? Хорошо, если зона заполнена.

ВОЗ? Да, всех, кто еще не в зоне и пока зона заполнена.

Если вы используете 64-битную систему и устанавливаете зону на 1M, nginx может хранить до 16000 IP-адресов. Это означает, что если необходимо сохранить 16 001 IP-адрес, +1 пользователь получит первую ошибку 503. Решение довольно простое, если B-дерево заполнено, отклонить.

Узнать точную реализацию можно, прочитав исходный код модуля: https://github.com/git-mirror/nginx/blob/master/src/http/modules/ngx_http_limit_conn_module.c

Зоны запросов работают примерно так же.