如何解决基于在 access_by_lua_block 中设置的 ngx.var 的动态 Nginx 上游
简化的 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
似乎没有设置在位置块中。如果我添加在 http 下记录 $foo
的访问日志,则值将为 bar
。如果我将访问日志放在位置块中,则它是 default
。
如何根据 ngx.var
中的 access_by_lua_block
集的值动态切换上游?
解决方法
location 块中的 if 语句似乎在发生在 access_by_lua_block
之前的 NGINX 阶段执行。我想出的解决方法是将支票移至 access_by_lua_block
。 proxy_pass
在内容阶段执行,可以读取访问阶段设置的变量。
http {
set $proxy one;
access_by_lua_block {
ngx.var.foo = "bar"
if ngx.var.foo == "bar" then
ngx.var.proxy = "two"
end
}
server {
listen 8080 default_server;
server_name localhost;
location / {
proxy_pass http://$proxy;
}
}
}
这是一个非常人为的例子,并没有多大意义,但在真正的问题中,我不是简单地设置 ngx.var.foo = "bar"
,而是根据 a 的结果设置 foo
从访问块内发出的请求收到的响应,因此本质上更具动态性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。