大家好:
用lua 如何实现 ngx.timer.at这种定时器的功能啊?
andex.li(李尊敬)
Email: and...@zhaopin.com.cn
Tel: (8610) 58635888 ext. 68504
大家好: 用lua 如何实现 ngx.timer.at这种定时器的功能啊? andex.li(李尊敬) Email: and...@zhaopin.com.cn Tel: (8610) 58635888 ext. 68504 --
是这样的,最近想在 openresty 之上做 redis proxy,实现 HA和负载均衡
但是这些业务代码只能写在 ngx.timer.at函数中,由于init_by_lua中不能使用ngx.timer.at
ngx.timer.at放在 content_by_lua中 后,必须每次主动调用一下才会执行,而且在nginx ?Cs reload后就会失效
必须再次调用。
所有现在想用lua脚本单独实现功能,但是原生的lua中没有 定时器功能,想知道有没有办法实现?
发件人: openresty@googlegroups.com [mailto:openresty@googlegroups.com] 代表 Lance 发送时间: 2013年12月9日 13:53 收件人: openresty@googlegroups.com 主题: Re: [openresty] openresty做redis代理 实现高可用和负载均衡
文题不符
Lance
On Mon, Dec 9, 2013 at 1:51 PM, andex.li <and...@zhaopin.com.cn> wrote:
-- --
是这样的,最近想在 openresty 之上做 redis proxy,实现 HA和负载均衡 但是这些业务代码只能写在 ngx.timer.at函数中,由于init_by_lua中不能使用ngx.timer.at ngx.timer.at放在 content_by_lua中 后,必须每次主动调用一下才会执行,而且在nginx –s reload后就会失效 必须再次调用。 所有现在想用lua脚本单独实现功能,但是原生的lua中没有 定时器功能,想知道有没有办法实现? andex.li(李尊敬) Email: and...@zhaopin.com.cn Tel: (8610) 58635888 ext. 68504 发件人: openresty@googlegroups.com [mailto:openresty@googlegroups.com] 代表 Lance 发送时间: 2013年12月9日 13:53 收件人: openresty@googlegroups.com 主题: Re: [openresty] openresty做redis代理 实现高可用和负载均衡 文题不符 Lance On Mon, Dec 9, 2013 at 1:51 PM, andex.li <and...@zhaopin.com.cn> wrote: 大家好: 用lua 如何实现 ngx.timer.at这种定时器的功能啊? andex.li(李尊敬) Email: and...@zhaopin.com.cn Tel: (8610) 58635888 ext. 68504 -- -- -- -- --
ngx.timer.at放在 content_by_lua中 后,必须每次主动调用一下才会执行,而且在nginx –s reload后就会失效
问题是 ngx.timer.at在 nginx ?Cs reload 后,需要手动触发,lua 发送http请求的代码没有合适的位置去写。
发件人: openresty@googlegroups.com [mailto:openresty@googlegroups.com] 代表 Lance 发送时间: 2013年12月9日 14:10 收件人: openresty@googlegroups.com 主题: Re: 答复: [openresty] openresty做redis代理 实现高可用和负载均衡
如果只是需要调用一下 nginx 的话,用 lua 去发送一个 http 请求不是很简单吗?
2013/12/9 andex.li <and...@zhaopin.com.cn>
问题是 ngx.timer.at在 nginx –s reload 后,需要手动触发,lua 发送http请求的代码没有合适的位置去写。 andex.li(李尊敬) Email: and...@zhaopin.com.cn Tel: (8610) 58635888 ext. 68504 发件人: openresty@googlegroups.com [mailto:openresty@googlegroups.com] 代表 Lance 发送时间: 2013年12月9日 14:10 收件人: openresty@googlegroups.com 主题: Re: 答复: [openresty] openresty做redis代理 实现高可用和负载均衡 如果只是需要调用一下 nginx 的话,用 lua 去发送一个 http 请求不是很简单吗? Lance 2013/12/9 andex.li <and...@zhaopin.com.cn> 是这样的,最近想在 openresty 之上做 redis proxy,实现 HA和负载均衡 但是这些业务代码只能写在 ngx.timer.at函数中,由于init_by_lua中不能使用ngx.timer.at ngx.timer.at放在 content_by_lua中 后,必须每次主动调用一下才会执行,而且在nginx –s reload后就会失效 必须再次调用。 所有现在想用lua脚本单独实现功能,但是原生的lua中没有 定时器功能,想知道有没有办法实现? andex.li(李尊敬) Email: and...@zhaopin.com.cn Tel: (8610) 58635888 ext. 68504 发件人: openresty@googlegroups.com [mailto:openresty@googlegroups.com] 代表 Lance 发送时间: 2013年12月9日 13:53 收件人: openresty@googlegroups.com 主题: Re: [openresty] openresty做redis代理 实现高可用和负载均衡 文题不符 Lance On Mon, Dec 9, 2013 at 1:51 PM, andex.li <and...@zhaopin.com.cn> wrote: 大家好: 用lua 如何实现 ngx.timer.at这种定时器的功能啊? andex.li(李尊敬) Email: and...@zhaopin.com.cn Tel: (8610) 58635888 ext. 68504 -- -- -- -- -- -- -- -- --
问题是 ngx.timer.at在 nginx –s reload 后,需要手动触发,lua 发送http请求的代码没有合适的位置去写。
春哥:
在openresty以后的版本中能否在 slave进程启动后,lua环境准备好后这个时间节点提供一个入口啊
这样的话的自己就可以写外挂啦,比如利用redis 的订阅功能 就可以统一管理 openresty服务器的配置文件
实现类似于 zookeeper的配置管理功能。
发件人: andex.li [mailto:and...@zhaopin.com.cn] 发送时间: 2013年12月9日 14:16 收件人: 'openresty@googlegroups.com' 主题: 答复: 答复: [openresty] openresty做redis代理 实现高可用和负载均衡
春哥: 在openresty以后的版本中能否在 slave进程启动后,lua环境准备好后这个时间节点提供一个入口啊 这样的话的自己就可以写外挂啦,比如利用redis 的订阅功能 就可以统一管理 openresty服务器的配置文件 实现类似于 zookeeper的配置管理功能。 andex.li(李尊敬) Email: and...@zhaopin.com.cn Tel: (8610) 58635888 ext. 68504 发件人: andex.li [mailto:and...@zhaopin.com.cn] 发送时间: 2013年12月9日 14:16 收件人: 'openresty@googlegroups.com' 主题: 答复: 答复: [openresty] openresty做redis代理 实现高可用和负载均衡 问题是 ngx.timer.at在 nginx –s reload 后,需要手动触发,lua 发送http请求的代码没有合适的位置去写。 andex.li(李尊敬) Email: and...@zhaopin.com.cn Tel: (8610) 58635888 ext. 68504 发件人: openresty@googlegroups.com [mailto:openresty@googlegroups.com] 代表 Lance 发送时间: 2013年12月9日 14:10 收件人: openresty@googlegroups.com 主题: Re: 答复: [openresty] openresty做redis代理 实现高可用和负载均衡 如果只是需要调用一下 nginx 的话,用 lua 去发送一个 http 请求不是很简单吗? Lance 2013/12/9 andex.li <and...@zhaopin.com.cn> 是这样的,最近想在 openresty 之上做 redis proxy,实现 HA和负载均衡 但是这些业务代码只能写在 ngx.timer.at函数中,由于init_by_lua中不能使用ngx.timer.at ngx.timer.at放在 content_by_lua中 后,必须每次主动调用一下才会执行,而且在nginx –s reload后就会失效 必须再次调用。 所有现在想用lua脚本单独实现功能,但是原生的lua中没有 定时器功能,想知道有没有办法实现? andex.li(李尊敬) Email: and...@zhaopin.com.cn Tel: (8610) 58635888 ext. 68504 发件人: openresty@googlegroups.com [mailto:openresty@googlegroups.com] 代表 Lance 发送时间: 2013年12月9日 13:53 收件人: openresty@googlegroups.com 主题: Re: [openresty] openresty做redis代理 实现高可用和负载均衡 文题不符 Lance On Mon, Dec 9, 2013 at 1:51 PM, andex.li <and...@zhaopin.com.cn> wrote: 大家好: 用lua 如何实现 ngx.timer.at这种定时器的功能啊? andex.li(李尊敬) Email: and...@zhaopin.com.cn Tel: (8610) 58635888 ext. 68504 -- -- -- -- -- -- -- -- --
坐等 init_worker_by_lua 指令啦
刚刚实验了一下 @Lance 在init_by_lua 中用dofile(“test.lua”) 执行
一般的lua脚本是没有问题的,只是不能使用nginx.lua 模块中定义的api而已。
发件人: openresty@googlegroups.com [mailto:openresty@googlegroups.com] 代表 Lance 发送时间: 2013年12月9日 14:50 收件人: openresty@googlegroups.com 主题: Re: 答复: 答复: [openresty] openresty做redis代理 实现高可用和负载均衡
引用个旧贴
Yichun Zhang (agentzh) <age...@gmail.com>
Nov 30 (9 days ago)
to openresty
Hello! 2013/11/29 Fei Liang: > > 这个代码老是报错,不知道为啥,是不是ngx.timer.at
不能用在init_by_lua上面呀? init_by_lua 运行在 nginx master 进程加载配置的时候,发生在 nginx fork 出实际干活的各个 worker 进程的时间点之前。 我觉得未来即将实现的 init_worker_by_lua 配置指令最符合你这里的需求。 眼下有一种折衷的实现办法,即在每个 nginx worker 进程服务第一个请求时创建你的无限重复的定时器。你可以把是否已经创建定时器的状态放在你自己的某一个 Lua 模块里面,因为 Lua 模块级别的变量是当前 worker 进程共享的,见 https://github.com/chaoslawful/lua-nginx-module#data-sharing-within-an-nginx-worker 进一步地,如果你希望你所有的 worker 进程只有一个定时器实际向后端保持心跳,可以考虑使用 lua-resty-lock 这个可以跨越 worker 进程的非阻塞的同步锁: https://github.com/agentzh/lua-resty-lock#readme 一般地,当你需要跨域多个 worker 进程传递和共享数据或状态时,应当使用 ngx_lua 的共享内存字典: https://github.com/chaoslawful/lua-nginx-module#lua_shared_dict 比如上面的 lua-resty-lock 库在底层就是基于这个共享内存字典服务。 Regards, -agentzh
On Mon, Dec 9, 2013 at 2:36 PM, andex.li <and...@zhaopin.com.cn> wrote:
发件人: openresty@googlegroups.com [mailto:openresty@googlegroups.com] 代表 Lance
发送时间: 2013年12月9日 14:10 收件人: openresty@googlegroups.com 主题: Re: 答复: [openresty] openresty做redis代理 实现高可用和负载均衡
坐等 init_worker_by_lua 指令啦 刚刚实验了一下 @Lance 在init_by_lua 中用dofile(“test.lua”) 执行 一般的lua脚本是没有问题的,只是不能使用nginx.lua 模块中定义的api而已。 andex.li(李尊敬) Email: and...@zhaopin.com.cn Tel: (8610) 58635888 ext. 68504 发件人: openresty@googlegroups.com [mailto:openresty@googlegroups.com] 代表 Lance 发送时间: 2013年12月9日 14:50 收件人: openresty@googlegroups.com 主题: Re: 答复: 答复: [openresty] openresty做redis代理 实现高可用和负载均衡 引用个旧贴 Yichun Zhang (agentzh) <age...@gmail.com> Nov 30 (9 days ago) to openresty Hello! 2013/11/29 Fei Liang: > > 这个代码老是报错,不知道为啥,是不是ngx.timer.at 不能用在init_by_lua上面呀? init_by_lua 运行在 nginx master 进程加载配置的时候,发生在 nginx fork 出实际干活的各个 worker 进程的时间点之前。 我觉得未来即将实现的 init_worker_by_lua 配置指令最符合你这里的需求。 眼下有一种折衷的实现办法,即在每个 nginx worker 进程服务第一个请求时创建你的无限重复的定时器。你可以把是否已经创建定时器的状态放在你自己的某一个 Lua 模块里面,因为 Lua 模块级别的变量是当前 worker 进程共享的,见 https://github.com/chaoslawful/lua-nginx-module#data-sharing-within-an-nginx-worker 进一步地,如果你希望你所有的 worker 进程只有一个定时器实际向后端保持心跳,可以考虑使用 lua-resty-lock 这个可以跨越 worker 进程的非阻塞的同步锁: https://github.com/agentzh/lua-resty-lock#readme 一般地,当你需要跨域多个 worker 进程传递和共享数据或状态时,应当使用 ngx_lua 的共享内存字典: https://github.com/chaoslawful/lua-nginx-module#lua_shared_dict 比如上面的 lua-resty-lock 库在底层就是基于这个共享内存字典服务。 Regards, -agentzh Lance On Mon, Dec 9, 2013 at 2:36 PM, andex.li <and...@zhaopin.com.cn> wrote: 春哥: 在openresty以后的版本中能否在 slave进程启动后,lua环境准备好后这个时间节点提供一个入口啊 这样的话的自己就可以写外挂啦,比如利用redis 的订阅功能 就可以统一管理 openresty服务器的配置文件 实现类似于 zookeeper的配置管理功能。 andex.li(李尊敬) Email: and...@zhaopin.com.cn Tel: (8610) 58635888 ext. 68504 发件人: andex.li [mailto:and...@zhaopin.com.cn] 发送时间: 2013年12月9日 14:16 收件人: 'openresty@googlegroups.com' 主题: 答复: 答复: [openresty] openresty做redis代理 实现高可用和负载均衡 问题是 ngx.timer.at在 nginx –s reload 后,需要手动触发,lua 发送http请求的代码没有合适的位置去写。 andex.li(李尊敬) Email: and...@zhaopin.com.cn Tel: (8610) 58635888 ext. 68504 发件人: openresty@googlegroups.com [mailto:openresty@googlegroups.com] 代表 Lance 发送时间: 2013年12月9日 14:10 收件人: openresty@googlegroups.com 主题: Re: 答复: [openresty] openresty做redis代理 实现高可用和负载均衡 如果只是需要调用一下 nginx 的话,用 lua 去发送一个 http 请求不是很简单吗? Lance 2013/12/9 andex.li <and...@zhaopin.com.cn> 是这样的,最近想在 openresty 之上做 redis proxy,实现 HA和负载均衡 但是这些业务代码只能写在 ngx.timer.at函数中,由于init_by_lua中不能使用ngx.timer.at ngx.timer.at放在 content_by_lua中 后,必须每次主动调用一下才会执行,而且在nginx –s reload后就会失效 必须再次调用。 所有现在想用lua脚本单独实现功能,但是原生的lua中没有 定时器功能,想知道有没有办法实现? andex.li(李尊敬) Email: and...@zhaopin.com.cn Tel: (8610) 58635888 ext. 68504 发件人: openresty@googlegroups.com [mailto:openresty@googlegroups.com] 代表 Lance 发送时间: 2013年12月9日 13:53 收件人: openresty@googlegroups.com 主题: Re: [openresty] openresty做redis代理 实现高可用和负载均衡 文题不符 Lance On Mon, Dec 9, 2013 at 1:51 PM, andex.li <and...@zhaopin.com.cn> wrote: 大家好: 用lua 如何实现 ngx.timer.at这种定时器的功能啊? andex.li(李尊敬) Email: and...@zhaopin.com.cn Tel: (8610) 58635888 ext. 68504 -- -- -- -- -- -- -- -- -- -- -- -- --
你说的对,刚刚用dofile 直接把nginx启动过程堵塞了。
发件人: openresty@googlegroups.com [mailto:openresty@googlegroups.com] 代表 Lance 发送时间: 2013年12月9日 15:15 收件人: openresty@googlegroups.com 主题: Re: 答复: 答复: 答复: [openresty] openresty做redis代理 实现高可用和负载均衡
我说了,用 io.poopen 注意把命令放后台,比如用 nohup 之类的
发送时间: 2013年12月9日 14:50 收件人: openresty@googlegroups.com 主题: Re: 答复: 答复: [openresty] openresty做redis代理 实现高可用和负载均衡
错误!未指定文件名。
刚验证了一下,init_by_lua 中使用 io.open并不会触发lua脚本的执行
用coroutine后,还是会堵塞nginx,如何实现非堵塞的coroutine?