【问题标题】:Dynamic Nginx upstream based on ngx.var set in access_by_lua_block基于 access_by_lua_block 中设置的 ngx.var 的动态 Nginx 上游
【发布时间】: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 的值动态切换上游?

【问题讨论】:

    标签: nginx lua nginx-reverse-proxy openresty


    【解决方案1】:

    位置块中的 if 语句似乎在 access_by_lua_block 之前发生的 NGINX 阶段执行。我想出的解决方法是将支票移至access_by_lua_blockproxy_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在访问块内发出请求,因此它在本质上更具动态性。

    【讨论】:

      猜你喜欢
      • 2016-08-11
      • 2018-10-11
      • 2019-03-04
      • 2021-05-15
      • 2019-02-04
      • 1970-01-01
      • 2016-12-10
      • 2017-07-12
      • 2013-10-07
      相关资源
      最近更新 更多