基于 access_by_lua_block 中设置的 ngx.var 的动态 Nginx 上游
Posted
技术标签:
【中文标题】基于 access_by_lua_block 中设置的 ngx.var 的动态 Nginx 上游【英文标题】:Dynamic Nginx upstream based on ngx.var set in access_by_lua_block 【发布时间】:2021-08-04 04:06:36 【问题描述】:简化的 nginx 示例配置 sn-p:
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
。
如何根据access_by_lua_block
中设置的ngx.var
的值动态切换上游?
【问题讨论】:
【参考方案1】:位置块中的 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"
,而是根据从接收到的响应的结果设置foo
在访问块内发出请求,因此它在本质上更具动态性。
【讨论】:
以上是关于基于 access_by_lua_block 中设置的 ngx.var 的动态 Nginx 上游的主要内容,如果未能解决你的问题,请参考以下文章
如何在现有的基于 Storyboard 的项目中设置 @EnvironmentObject?