基于access_by_lua_block中设置的ngx.var的动态Nginx上游

jhdbpxl9  于 2022-12-03  发布在  Nginx
关注(0)|答案(1)|浏览(275)

简化的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似乎没有在location块中设置。如果我在http下添加一个记录$foo的访问日志,其值将是bar。如果我将访问日志放在location块中,则其值将是default
如何根据access_by_lua_block中设置的ngx.var的值动态切换上游?

mmvthczy

mmvthczy1#

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",而是基于从访问块中发出的请求接收到的响应结果来设置foo,因此它本质上更具动态性。

相关问题