Nginx server variables

我已经尝试寻找一个解决我目前面临的问题的示例,但是到目前为止都没有找到,所以如果这个问题已经被解决了,我很抱歉。

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

server {
  set $asleep = 0;

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

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

基本上我不能使用 params,我想要一个可以修改的本地变量。我的问题是,无论我多少次访问 /go_to_sleep 端点,/status 总是报告 $asleep 为 0。我想这是因为 $asleep 只在 /go_to_sleep 的位置结束时本地修改。我也尝试过使用 lua 块,但结果相同。

只是想知道这是否完全不可能或者是否有人可以帮助我找出如何使这种情况工作的方法?

谢谢

点赞
用户1442917
用户1442917

根据在Nginx工作进程中共享数据的建议,在那个示例中显示和解释的方式使用模块来共享数据值,我认为你可能需要进行切换。SO的问答和其中的示例也可能相关。

2017-11-08 17:50:09
用户2060502
用户2060502

如果你需要在 workers 之间共享全局标志,你可以使用 ngx.shared.DICT APIData Sharing within an Nginx Worker 在 nginx worker 内部工作(如明确说明的)。如果这正是你所需要的,请看看 Paul Kulchenko 的回答。

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"))
            }
        }
    }
}
2017-11-10 08:49:39