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

Posted

技术标签:

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

【问题讨论】:

【参考方案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在访问块内发出请求,因此它在本质上更具动态性。

【讨论】:

以上是关于基于 access_by_lua_block 中设置的 ngx.var 的动态 Nginx 上游的主要内容,如果未能解决你的问题,请参考以下文章

sh 在基于Debian的发行版中设置Locale

如何在现有的基于 Storyboard 的项目中设置 @EnvironmentObject?

基于时区在 C# 中设置日期时间,例如 +08:00 [重复]

如何从代码在 SceneKit 中设置基于物理的渲染?

如何在 Spring Boot 中设置基于预认证头的认证?

在 Swift 2 Xcode 7 Beta 4 中设置基于位置的提醒时出错