hello:
module level级别的变量是worker内部的协程共享的,而不是整个nginx 实例,如果要让所有worker共享,可以通过shdict来做,具体参见:https://github.com/openresty/lua-nginx-module#data-sharing-within-an-nginx-worker
对于你的问题: 可以通过某一个worker从外界(比如redis)定时拉取配置到shdict里面,然后每个worker定时从shdict里面拉取配置到worker内部放入module level级别的变量中。这种做法可以参考又拍的slard项目: https://github.com/upyun/slardar/blob/master/nginx/conf/slardar/service.conf
由于OR里面的协程是非抢占式的,在操作module level级别的变量,只要不进行yeild的操作(比如ngx.sleep,cosocket操作等),是不用担心原子问题的。
在 2017年12月17日星期日 UTC+8下午11:38:22,朱宇写道:
Hi,各位大神:
我想在 init_worker阶段开启ngx.timer,每隔10sec,读取配置文件内容到模块变量 local config = {} 中,然后每次请求则直接访问该config变量,不知是否有原子操作问题? 配置文件可能被其他程序更新。
多谢!