NGINX 没有评估变量?

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;
}

相关内容