我有以下 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;
}