基于 ngx.var 在 access_by_lua_block 中设置的动态 Nginx 上游
Dynamic Nginx upstream based on ngx.var set in access_by_lua_block
简化的 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
.
如何根据 access_by_lua_block
中设置的 ngx.var
的值动态切换上游?
location 块中的 if 语句似乎在 access_by_lua_block
之前发生的 NGINX 阶段执行。我想出的解决办法是将支票移至 access_by_lua_block
。 proxy_pass
在content阶段执行,可以读取access阶段设置的变量。
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
从访问块内发出的请求收到的响应,因此它本质上更加动态。
简化的 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
.
如何根据 access_by_lua_block
中设置的 ngx.var
的值动态切换上游?
location 块中的 if 语句似乎在 access_by_lua_block
之前发生的 NGINX 阶段执行。我想出的解决办法是将支票移至 access_by_lua_block
。 proxy_pass
在content阶段执行,可以读取access阶段设置的变量。
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
从访问块内发出的请求收到的响应,因此它本质上更加动态。