简化的NGINX示例配置片段:
http {
set $foo default;
access_by_lua_block {
ngx.var.foo = "bar"
}
server {
listen 8080 default_server;
server_name localhost;
location / {
set $proxy one;
if ($foo = "bar") {
set $proxy two;
}
proxy_pass http://$proxy;
}
}
}
我发现的问题是$foo
似乎没有在location块中设置。如果我在http下添加一个记录$foo
的访问日志,其值将是bar
。如果我将访问日志放在location块中,则其值将是default
。
如何根据access_by_lua_block
中设置的ngx.var
的值动态切换上游?
1条答案
按热度按时间mmvthczy1#
location块中的if语句似乎在
access_by_lua_block
之前的NGINX阶段执行。我提出的修复方法是将检查移到access_by_lua_block
中。proxy_pass
在内容阶段执行,并且可以读取在访问阶段设置的变量。这是一个人为的例子,实际上没有多大意义,但在实际问题中,我并不是简单地设置
ngx.var.foo = "bar"
,而是基于从访问块中发出的请求接收到的响应结果来设置foo
,因此它本质上更具动态性。