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

简化的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。 如果我将访问日志放在位置块内,则为“default”。

如何基于在access_by_lua_block中设置的ngx.var的值动态切换上游?

点赞
用户1214427
用户1214427

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,因此在本质上更具有动态性。

2021-05-14 00:20:40