【问题标题】:Nginx server variablesNginx 服务器变量
【发布时间】:2018-04-21 06:50:49
【问题描述】:

我已尝试找到我所面临的问题的示例,但到目前为止失败了,如果已经得到解答,请致歉。

在 nginx 配置中(可能包括 lua,我都尝试过),我希望能够在同一服务器内的多个位置访问变量。也就是说,我希望能够修改它。例如,如果我这样做:

server {
  set $asleep = 0;

  location /go_to_sleep {
    set $asleep = 1;
    echo "sleepy";
  }

  location /status {
    echo "are we asleep? $asleep";
  }
}

基本上我不能使用参数,我想要一种方法来拥有一个我可以修改的局部变量。我遇到的问题是,无论我点击 /go_to_sleep 端点多少次,/status 总是将 $asleep 报告为 0。我认为这是因为 $asleep 仅在本地修改为 /go_to_sleep 的位置端点。我也尝试过使用 lua 块,但我得到了相同的输出。

只是想知道这是否根本不可能,或者是否有人可以帮助我弄清楚如何让这种事情发挥作用?

谢谢

【问题讨论】:

    标签: nginx lua openresty


    【解决方案1】:

    Data Sharing within an Nginx Worker 将在 nginx worker 中工作(如明确说明的那样)。如果这是您想要的 - 请查看 Paul Kulchenko 的回答。

    但如果您需要跨工作人员的全局标志,您可以使用 ngx.shared.DICT API

    http {
        lua_shared_dict my_global_flags 10m;
    
        server {
            listen 80;
    
            location = /go_to_sleep {
                content_by_lua_block {
                    local my_global_flags = ngx.shared.my_global_flags
                    my_gobal_flags:set("asleep" , true)
                    ngx.say("sleepy")
                }
            }
    
            location /status {
                content_by_lua_block {
                    local my_global_flags = ngx.shared.my_global_flags
                    ngx.say("are we asleep ", my_gobal_flags:get("asleep"))
                }
            }
        }
    }
    

    【讨论】:

    • 那是完美的,正是我所需要的。保罗,我确实尝试了你的建议,它确实有效,但这消除了我对任何 lua 文件的需要,所以这对我来说是一个胜利。谢谢你们俩
    • 使用共享字典和 per-module-state 有很大的不同:如果你有多个 nginx worker,最后一个方法将不起作用,因为每个 nginx worker 在所有加载时都有自己的副本模块。 /go_to_sleepy 请求可能由工人一处理,但 /status 请求可能由其他工人处理。对我来说,选择共享字典似乎是一个理由,而不是因为它不需要 lua 模块。
    【解决方案2】:

    鉴于Data Sharing within an Nginx Worker 中的建议,我认为您可能需要切换到使用模块来共享数据值,如该示例所示和解释。这个SO 问题/答案和其中的示例也可能是相关的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-01
      相关资源
      最近更新 更多