HttpLimitReqModule模块可以限制请求速度,openresty的shared dic能否做到?
关键是如何获得那个请求速度的变量,至少要给nginx打个补丁,加个变量。On Sunday, December 16, 2012 3:29:35 PM UTC+8, 朱茂海 wrote: HttpLimitReqModule模块可以限制请求速度,openresty的shared dic能否做到?
速度可以用 shared.DICT 来计算一下,比如一秒内多少请求算超过的。--smallfish http://chenxiaoyu.org 2012/12/16 Bill Zhu <bill...@gmail.com> 关键是如何获得那个请求速度的变量,至少要给nginx打个补丁,加个变量。On Sunday, December 16, 2012 3:29:35 PM UTC+8, 朱茂海 wrote: HttpLimitReqModule模块可以限制请求速度,openresty的shared dic能否做到?
请问下具体该如何实现,能否写个简单的实例。On Sunday, December 16, 2012 4:10:00 PM UTC+8, smallfish wrote: 速度可以用 shared.DICT 来计算一下,比如一秒内多少请求算超过的。--smallfish http://chenxiaoyu.org 2012/12/16 Bill Zhu <bill...@gmail.com> 关键是如何获得那个请求速度的变量,至少要给nginx打个补丁,加个变量。On Sunday, December 16, 2012 3:29:35 PM UTC+8, 朱茂海 wrote: HttpLimitReqModule模块可以限制请求速度,openresty的shared dic能否做到?
key可以设置为当前时间戳,以秒为单位(注意过期时间),这里是以content_by_lua为示例,可以改成access_by_lua。片段如下:lua_shared_dict dogs 10m; location /c { content_by_lua ' local dogs = ngx.shared.dogs local count = dogs:get("count") if not count then dogs:set("count", 1) else dogs:incr("count", 1) end count = dogs:get("count") if count > 10 then ngx.say("max > 10") else ngx.say("count:", count) end '; }--smallfish http://chenxiaoyu.org 2012/12/16 Bill Zhu <bill...@gmail.com> 请问下具体该如何实现,能否写个简单的实例。On Sunday, December 16, 2012 4:10:00 PM UTC+8, smallfish wrote: 速度可以用 shared.DICT 来计算一下,比如一秒内多少请求算超过的。--smallfish http://chenxiaoyu.org 2012/12/16 Bill Zhu <bill...@gmail.com> 关键是如何获得那个请求速度的变量,至少要给nginx打个补丁,加个变量。On Sunday, December 16, 2012 3:29:35 PM UTC+8, 朱茂海 wrote: HttpLimitReqModule模块可以限制请求速度,openresty的shared dic能否做到?
谢谢,这个思路不错,key也可以由多个参数整合,如timestamp+uri,等等,基本就实现了limitreq和limitcon。如果要实现限制网速,是不是可以通过计算响应体的大小来实现,是否还有其他方法?On Sunday, December 16, 2012 5:22:30 PM UTC+8, smallfish wrote: key可以设置为当前时间戳,以秒为单位(注意过期时间),这里是以content_by_lua为示例,可以改成access_by_lua。片段如下:lua_shared_dict dogs 10m; location /c { content_by_lua ' local dogs = ngx.shared.dogs local count = dogs:get("count") if not count then dogs:set("count", 1) else dogs:incr("count", 1) end count = dogs:get("count") if count > 10 then ngx.say("max > 10") else ngx.say("count:", count) end '; }--smallfish http://chenxiaoyu.org 2012/12/16 Bill Zhu <bill...@gmail.com> 请问下具体该如何实现,能否写个简单的实例。On Sunday, December 16, 2012 4:10:00 PM UTC+8, smallfish wrote: 速度可以用 shared.DICT 来计算一下,比如一秒内多少请求算超过的。--smallfish http://chenxiaoyu.org 2012/12/16 Bill Zhu <bill...@gmail.com> 关键是如何获得那个请求速度的变量,至少要给nginx打个补丁,加个变量。On Sunday, December 16, 2012 3:29:35 PM UTC+8, 朱茂海 wrote: HttpLimitReqModule模块可以限制请求速度,openresty的shared dic能否做到?
key的定义可以很灵活,定制起来比limitreq/zone的更灵活一点。下午我还琢磨来着是否可以把这个封装成一个独立的库。限制网速?是否可以考虑通过tcp包来限制?不太明白。:) --smallfish http://chenxiaoyu.org 2012/12/16 Bill Zhu <bil...@gmail.com> 谢谢,这个思路不错,key也可以由多个参数整合,如timestamp+uri,等等,基本就实现了limitreq和limitcon。如果要实现限制网速,是不是可以通过计算响应体的大小来实现,是否还有其他方法?On Sunday, December 16, 2012 5:22:30 PM UTC+8, smallfish wrote: key可以设置为当前时间戳,以秒为单位(注意过期时间),这里是以content_by_lua为示例,可以改成access_by_lua。片段如下:lua_shared_dict dogs 10m; location /c { content_by_lua ' local dogs = ngx.shared.dogs local count = dogs:get("count") if not count then dogs:set("count", 1) else dogs:incr("count", 1) end count = dogs:get("count") if count > 10 then ngx.say("max > 10") else ngx.say("count:", count) end '; }--smallfish http://chenxiaoyu.org 2012/12/16 Bill Zhu <bill...@gmail.com> 请问下具体该如何实现,能否写个简单的实例。On Sunday, December 16, 2012 4:10:00 PM UTC+8, smallfish wrote: 速度可以用 shared.DICT 来计算一下,比如一秒内多少请求算超过的。--smallfish http://chenxiaoyu.org 2012/12/16 Bill Zhu <bill...@gmail.com> 关键是如何获得那个请求速度的变量,至少要给nginx打个补丁,加个变量。On Sunday, December 16, 2012 3:29:35 PM UTC+8, 朱茂海 wrote: HttpLimitReqModule模块可以限制请求速度,openresty的shared dic能否做到?
Hello! 2012/12/16 Bill Zhu <bil...@gmail.com>: > 谢谢,这个思路不错,key也可以由多个参数整合,如timestamp+uri,等等,基本就实现了limitreq和limitcon。 > 标准的 ngx_limit_req 和 ngx_limit_conn 内部就是这么实现的。有兴趣的话,可以参考它们的 C 实现,然后在 Lua 里摸仿之,扩展之。 > 如果要实现限制网速,是不是可以通过计算响应体的大小来实现,是否还有其他方法? > Nginx 内置有每请求动态限制*响应体*的发送速率的功能,即通过 $limit_rate 变量来实现: http://wiki.nginx.org/HttpCoreModule#limit_rate 你可以在 Lua 中直接对这个 Nginx 变量进行赋值。 请求体的接收速率的限制可以通过 ngx.req.socket API 在 Lua 中自行实现: http://wiki.nginx.org/HttpLuaModule#ngx.req.socket Best regards, -agentzh
请求体的接收速率的限制可以通过 ngx.req.socket API 在 Lua 中自行实现: http://wiki.nginx.org/HttpLuaModule#ngx.req.socket
也关注如何限制速度?
在 2012年12月16日下午7:22,smallfish <small...@gmail.com>写道: key的定义可以很灵活,定制起来比limitreq/zone的更灵活一点。下午我还琢磨来着是否可以把这个封装成一个独立的库。限制网速?是否可以考虑通过tcp包来限制?不太明白。:) --smallfish http://chenxiaoyu.org 2012/12/16 Bill Zhu <bil...@gmail.com> 谢谢,这个思路不错,key也可以由多个参数整合,如timestamp+uri,等等,基本就实现了limitreq和limitcon。如果要实现限制网速,是不是可以通过计算响应体的大小来实现,是否还有其他方法?On Sunday, December 16, 2012 5:22:30 PM UTC+8, smallfish wrote: key可以设置为当前时间戳,以秒为单位(注意过期时间),这里是以content_by_lua为示例,可以改成access_by_lua。片段如下:lua_shared_dict dogs 10m; location /c { content_by_lua ' local dogs = ngx.shared.dogs local count = dogs:get("count") if not count then dogs:set("count", 1) else dogs:incr("count", 1) end count = dogs:get("count") if count > 10 then ngx.say("max > 10") else ngx.say("count:", count) end '; }--smallfish http://chenxiaoyu.org 2012/12/16 Bill Zhu <bill...@gmail.com> 请问下具体该如何实现,能否写个简单的实例。On Sunday, December 16, 2012 4:10:00 PM UTC+8, smallfish wrote: 速度可以用 shared.DICT 来计算一下,比如一秒内多少请求算超过的。--smallfish http://chenxiaoyu.org 2012/12/16 Bill Zhu <bill...@gmail.com> 关键是如何获得那个请求速度的变量,至少要给nginx打个补丁,加个变量。On Sunday, December 16, 2012 3:29:35 PM UTC+8, 朱茂海 wrote: HttpLimitReqModule模块可以限制请求速度,openresty的shared dic能否做到?