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_module
map
Директивная документация, в которой только сказано:
Создает новую переменную, значение которой зависит от значений одной или нескольких исходных переменных, указанных в первом параметре.
Я полагаю, что как 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;
}