NGINX не оценивает переменные?

У меня есть следующий конфиг nginx:

http {
(...)

limit_conn_zone $binary_remote_addr zone=limitapinoauth:16m;
limit_conn_zone $remote_user zone=limitapi:32m;

map $remote_user $zone {
    default   'limitapi';
    ''        'limitapinoauth';
}

map $zone $num {
    'limitapi'   100;
    default    200;
}

server {
    listen 80 default;

    root /var/www/example.com/public_html;

    limit_conn $zone $num;
}
(...)
}

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

Я получаю следующую ошибку:

nginx: [emerg] invalid number of connections "$num"

Когда я меняю $ num на целое число, то есть 200, ошибка:

nginx: [emerg] zero size shared memory zone "$zone"

Если я изменю последнюю строку на:

limit_conn limitapi 100;

Конфиг правильный.

1 ответ

Это не указано четко в ngx_http_map_modulemap Директивная документация, в которой только сказано:

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

Я полагаю, что как ngx_http_map_module .c работает в контексте модуля ngx_http_map_create_conf (при создании основной конфигурации), и все индексированные переменные добавляются во время предварительной конфигурации, в качестве исходных переменных для map директивы. (Nginx гуру, пожалуйста, подтвердите.)

Кроме того, я не смог найти ни одного примера, который использует переменную, определенную map директива как переменная источника на другом map директива, которая предполагает то же самое. Поэтому я бы посоветовал создать обе переменные, $zone а также $numнепосредственно на основе $remote_user переменная.

map $remote_user $zone {
    default   'limitapi';
    ''        'limitapinoauth';
}

map $remote_user $num {
    default   100;
    ''        200;
}
Другие вопросы по тегам