Lua 脚本限制访问频率过高的IP
20-09-29 16:11
字数 2097
阅读 1654
已编辑
规则
30s内请求次数超过40次的ip封禁120s
实现
nginx +redis + lua
vim rate-limit.lua
脚本内容如下
local function close_redis(red)
if not red then
return
end
local pool_max_idle_time = 10000
local pool_size = 100
local ok, err = red:set_keepalive(pool_max_idle_tme, pool_size)
if not ok then
ngx.say("set keepalive err : ", err)
end
end
local ip_block_time = 120 --封禁IP时间(秒)
local ip_time_out = 30 --指定ip访问频率时间段(秒)
local ip_max_count = 40 --指定ip访问频率计数最大值(秒)
local BUSINESS = "sqd-ratelimit" --nginx的location中定义的业务标识符,我这里写死了。
--连接redis
local redis = require "resty.redis"
local conn = redis:new()
ok, err = conn:connect("127.0.0.1", 6379)
conn:set_timeout(2000) --超时时间2秒
--如果连接失败,跳转到脚本结尾
if not ok then
--goto FLAG
close_redis(conn)
end
local count, err = conn:get_reused_times()
if 0 == count then
----新建连接,需要认证密码
ok, err = conn:auth("yourredispassword")
if not ok then
ngx.say("failed to auth: ", err)
return
end
elseif err then
----从连接池中获取连接,无需再次认证密码 ngx.say("failed to get reused times: ", err)
return
end
--查询ip是否被禁止访问,如果存在则返回403错误代码
is_block, err = conn:get(BUSINESS .. "-BLOCK-" .. ngx.var.remote_addr)
if is_block == '1' then
ngx.exit(429)
close_redis(conn)
end
--查询redis中保存的ip的计数器
ip_count, err = conn:get(BUSINESS .. "-COUNT-" .. ngx.var.remote_addr)
if ip_count == ngx.null then
--如果不存在,则将该IP存入redis,并将计数器设置为1、该KEY的超时时间为ip_time_out
res, err = conn:set(BUSINESS .. "-COUNT-" .. ngx.var.remote_addr, 1)
res, err = conn:expire(BUSINESS .. "-COUNT-" .. ngx.var.remote_addr, ip_time_out)
else
if tonumber(ip_count) >= ip_max_count then
--如果超过单位时间限制的访问次数,则添加限制访问标识,限制时间为ip_block_time
res, err = conn:set(BUSINESS .. "-BLOCK-" .. ngx.var.remote_addr, 1)
res, err = conn:expire(BUSINESS .. "-BLOCK-" .. ngx.var.remote_addr, ip_block_time)
else
res, err = conn:incr(BUSINESS .. "-COUNT-" .. ngx.var.remote_addr)
end
end
-- 结束标记
local ok, err = conn:close()
部署
在对应的location中添加下面的代码
access_by_lua_file "/usr/local/nginx/conf/lua-script/rate-limit.lua";
0人点赞>
请登录后发表评论
相关推荐
文章归档
2024-11
1 篇
2024-06
1 篇
2024-05
2 篇
2024-04
2 篇
2024-03
2 篇
展开剩余 68 条
2024-01
1 篇
2023-10
1 篇
2023-09
1 篇
2023-08
1 篇
2023-06
1 篇
2023-04
1 篇
2022-12
2 篇
2022-06
1 篇
2022-04
4 篇
2022-03
3 篇
2022-01
6 篇
2021-12
2 篇
2021-11
2 篇
2021-10
2 篇
2021-09
1 篇
2021-08
2 篇
2021-07
4 篇
2021-06
1 篇
2021-05
3 篇
2021-04
3 篇
2021-01
2 篇
2020-11
1 篇
2020-10
3 篇
2020-09
2 篇
2020-08
1 篇
2020-07
5 篇
2020-06
5 篇
2020-05
1 篇
2020-04
1 篇
2020-03
2 篇
2020-02
3 篇
2020-01
1 篇
2019-11
5 篇
2019-10
10 篇
2019-09
12 篇
2019-08
17 篇
2019-07
8 篇
2019-05
3 篇
2019-04
8 篇
2019-03
7 篇
2019-02
8 篇
2019-01
5 篇
2018-12
7 篇
2018-11
8 篇
2018-10
4 篇
2018-09
7 篇
2018-08
12 篇
2018-07
9 篇
2018-06
6 篇
2018-05
11 篇
2018-04
18 篇
2018-03
1 篇
2018-02
2 篇
2018-01
10 篇
2017-12
14 篇
2017-11
44 篇
2017-10
13 篇
2017-09
4 篇
2017-08
12 篇
2017-07
5 篇
2017-06
4 篇
2017-05
2 篇
2017-04
3 篇
2017-03
9 篇
2017-02
3 篇
2017-01
2 篇
2016-12
10 篇
2016-11
4 篇
最新文章
最受欢迎
11-07 19:00
06-26 11:51
05-17 17:08
05-17 10:59
04-11 17:05
13 评论
11 评论
10 评论
干啥工作的啊?你果然是天天搞it啊。