У меня есть следующая конфигурация 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;
конфиг правильный.
Это не указано четко в 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;
}