lua-limit 是一个 OpenRestry Lua 限流工具,支持令牌桶限流、cookie 限流、日期范围限流、概率限流。
限流脚本的设计思路源于规则链,用户请求进入 nginx 后,请求会进入限流脚本配置的限流链,在链中的规则中逐个匹配处理,如果某条限流规则匹配此请求,那么将跳出规则链执行循环,返回被限流信息,除非此规则明确说明需要参考链中下一条规则。
需要编写限流脚本,脚本可以参考如下(some_business_limit.lua):
some_business_limit.lua
local conf = { redis = {...} some_limit_rule_1 = {...} some_limit_rule_2 = {...} } -- 如果不传 conf 那么会在 package.path 中寻找 -- limit_conf.lua 文件 local limit = require "limit":new(conf) funciton some_who_1(limit) return true, "some_limit_rule_1" end function some_who_2(limit) local redis = limit:get_redis() -- some_redis_operation -- target find if is_target then return true, "some_limit_rule_2" else return false end end function some_message(limit, data) -- 返回页面 limit.send_redirect("limit.html") -- 返回json limit.send_redirect("xxx.html", data) end limit:who({some_who_1, some_who_2}):execute()
在 nginx 的 http 块中配置 package.path 是的 lua 解释器可以找到脚本文件,在需要限流的 location 部分增加 access_by_lua_file指定 lua 脚本(当然也可以使用content_by_lua),如:
package.path
access_by_lua_file
content_by_lua
http { lua_package_path "/some_place/limit/limit-common/?.lua;;"; server { location /some_url { access_by_lua_file /some_place/some_business_limit.lua; } } }