基于 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_blockproxy_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从访问块内发出的请求收到的响应,因此它本质上更加动态。