nginx+lua+redis 限制ip的访问次数_打杂人的博客-CSDN博客


本站和网页 https://blog.csdn.net/aerchi/article/details/82874893 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

nginx+lua+redis 限制ip的访问次数_打杂人的博客-CSDN博客
nginx+lua+redis 限制ip的访问次数
打杂人
于 2018-09-27 23:06:58 发布
2721
收藏
Web 服务器
专栏收录该内容
68 篇文章
1 订阅
订阅专栏
原文 地址:https://www.superman2014.com/2015/08/30/nginxluaredis-%E9%99%90%E5%88%B6ip%E7%9A%84%E8%AE%BF%E9%97%AE%E6%AC%A1%E6%95%B0/ 一、安装环境:
阿里云centos 6.5Nginx-1.4.4Redis 3.0.3LuaJIT-2.0.2
二、安装步骤:
1、安装LuaJIT-2.0.2
1 2 3 4 wget http://luajit.org/download/LuaJIT-2.0.2.tar.gz tar -xzvf LuaJIT-2.0.2.tar.gz cd LuaJIT-2.0.2 make && make install
注:64位系统安装完成后或许还需要将/usr/local/lib/libluajit-5.1.so.2建立软连接到/usr/lib64/libluajit-5.1.so.2,否则在后面nginx启动时会提示找不到依赖库。
2.redis安装过程
1 2 3 4 $ wget http://download.redis.io/releases/redis-3.0.3.tar.gz $ tar xzf redis-3.0.3.tar.gz $ cd redis-3.0.3 $ make
3. nginx1.4.4的安装
1 2 3 4 5 6 7 8 9 10 11 wget https://codeload.github.com/chaoslawful/lua-nginx-module/tar.gz/v0.8.3   wget https://codeload.github.com/agentzh/redis2-nginx-module/tar.gz/v0.10   tar -xzvf lua-nginx-module-0.8.3.tar.gz tar -xzvf redis2-nginx-module-0.10.tar.gz   wget http://nginx.org/download/nginx-1.4.4.tar.gz     ./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_sub_module --with-http_gzip_static_module --with-http_stub_status_module --with-pcre --with-http_realip_module   --with-http_gzip_static_module  --add-module=redis2-nginx-module-0.10   --add-module=lua-nginx-module-0.8.3 && make && make install
4. 下载nginx中lua使用redis需要的依赖包redis.lua到nginx安装目录
https://codeload.github.com/agentzh/lua-resty-redis/tar.gz/v0.15
5. 修改nginx.conf文件
test.lua内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 $ cat /usr/local/nginx/test.lua   local redis = require "resty.redis" local red = redis:new()   red:set_timeout(1000) -- 1 sec   -- or connect to a unix domain socket file listened -- by a redis server: --     local ok, err = red:connect("unix:/path/to/redis.sock")   local ok, err = red:connect("127.0.0.1", 6379) if not ok then     ngx.say("failed to connect: ", err)     return end   ok, err = red:set("dog", "an aniaml") if not ok then     ngx.say("failed to set dog: ", err)     return end   ngx.say("set result: ", ok)   local res, err = red:get("dog") if not res then     ngx.say("failed to get dog: ", err)     return end   if res == ngx.null then     ngx.say("dog not found.")     return end   ngx.say("dog: ", res)   red:init_pipeline() red:set("cat", "Marry") red:set("horse", "Bob") red:get("cat") red:get("horse") local results, err = red:commit_pipeline() if not results then     ngx.say("failed to commit the pipelined requests: ", err)     return end   for i, res in ipairs(results) do     if type(res) == "table" then     if not res[1] then         ngx.say("failed to run command ", i, ": ", res[2])     else         -- process the table value     end     else     -- process the scalar value     end end   -- put it into the connection pool of size 100, -- with 0 idle timeout local ok, err = red:set_keepalive(0, 100) if not ok then     ngx.say("failed to set keepalive: ", err)     return end   -- or just close the connection right away: -- local ok, err = red:close() -- if not ok then --     ngx.say("failed to close: ", err) --     return -- end
6. ip限制access.lua
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 $ cat /usr/local/nginx/access.lua ip_bind_time = 600  --封禁IP时间 ip_time_out = 30    --指定ip访问频率时间段 connect_count = 50 --指定ip访问频率计数最大值   --连接redis local redis = require "resty.redis" local red = redis:new() local ok, err = red:connect("127.0.0.1", 6379) red:set_timeout(1000) -- 1 sec   --如果连接失败,跳转到脚本结尾 if not ok then     goto A end   -- --查询ip是否在封禁段内,若在则返回403错误代码 --因封禁时间会大于ip记录时间,故此处不对ip时间key和计数key做处理 is_bind, err = red:get("bind:"..ngx.var.remote_addr) if is_bind == '1' then     ngx.exit(403)     goto A end   --如果ip记录时间大于指定时间间隔或者记录时间或者不存在ip时间key则重置时间key和计数key --如果ip时间key小于时间间隔,则ip计数+1,且如果ip计数大于ip频率计数,则设置ip的封禁key为1 --同时设置封禁key的过期时间为封禁ip的时间 start_time, err = red:get("time:"..ngx.var.remote_addr) ip_count, err = red:get("count:"..ngx.var.remote_addr)   if start_time == ngx.null or os.time() - start_time > ip_time_out then     res, err = red:set("time:"..ngx.var.remote_addr , os.time())     res, err = red:set("count:"..ngx.var.remote_addr , 1) else     ip_count = ip_count + 1     res, err = red:incr("count:"..ngx.var.remote_addr)     if ip_count >= connect_count then         res, err = red:set("bind:"..ngx.var.remote_addr, 1)         res, err = red:expire("bind:"..ngx.var.remote_addr, ip_bind_time)     end end   -- 结束标记 ::A:: local ok, err = red:close()
7.新的nginx.conf配置如下:
1 2 3 4 5 6 location ~ \.php$ {         access_by_lua_file /usr/local/nginx/access.lua;           include fastcgi.conf;         fastcgi_pass 127.0.0.1:9000; }
8.访问记录,在redis内的截图:
9.访问次数过多,返回结果:
原文 地址:https://www.superman2014.com/2015/08/30/nginxluaredis-%E9%99%90%E5%88%B6ip%E7%9A%84%E8%AE%BF%E9%97%AE%E6%AC%A1%E6%95%B0/
打杂人
关注
关注
点赞
收藏
评论
nginx+lua+redis 限制ip的访问次数
原文 地址:https://www.superman2014.com/2015/08/30/nginxluaredis-%E9%99%90%E5%88%B6ip%E7%9A%84%E8%AE%BF%E9%97%AE%E6%AC%A1%E6%95%B0/一、安装环境:阿里云centos 6.5Nginx-1.4.4Redis 3.0.3LuaJIT-2.0.2二、安装步骤:1...
复制链接
扫一扫
专栏目录
nginx+lua+redis自动识别封解禁IP频繁访问
zengbin3013的专栏
07-12
5401
在站点遇到攻击且无明显攻击特征,造成站点访问慢,nginx不断返回502等错误时,可利用nginx+lua+redis实现在指定的时间段内,若单IP的请求量达到指定的数量后对该IP进行封禁,nginx返回403禁止访问。利用redis的expire命令设置封禁IP的过期时间达到在指定的封禁时间后实行自动解封的目的。
一、安装环境:
CentOS x64 release 6.4(Fina
Redis-IP限流、请求次数限制、唯一登陆
Ang-l
06-09
4106
Redis-IP限流、请求次数限制、唯一登陆
我司有一个线上购物平台,为了防止网页爬虫、恶意用户高频访问与秒杀环节产生的高并发使服务器宕机。并且根据用户反馈有两个人同时登录账号导致数据不一致,数据被更改,用户体验不佳。现我司要求使用redis实现如下功能
1.使用redis保持用户状态,同一时间只能有一位用户在线
2.用户在60秒时间戳内只能访问15次服务器
3.用户使用中间件校验请求次数
4.用户账号如果在别处登录提示用户账号已在别处登录,并且更改用户当前登录状态
使用redis保持用户状态,用户每次登录
评论 1
您还未登录,请先
登录
后发表或查看评论
Redis+Lua脚本实现分布式限流(Nginx+Lua IP限流)
最新发布
MayMatrix 的博客
11-08
180
在互联网应用中,高并发系统会面临一个重大的挑战,那就是大量流高并发访问,比如:天猫的双十一、京东618、秒杀、抢购促销等,这些都是典型的大流量高并发场景。关注【冰河技术】微信公众号,解锁更多【高并发】专题文章。注意:由于原文篇幅比较长,所以被拆分为:理论、算法、实战(HTTP接口实战+分布式限流实战)三大部分。理论篇:《》算法篇:《》本文是在《》一文的基础上进行实现,有关项目的搭建可参见《》一文的内容。小伙伴们可以关注【冰河技术】微信公众号来阅读上述文章。
Nginx结合Lua——Nginx通过Lua+Redis实现自动封禁访问频率高的IP
CapejasmineY的博客
10-12
687
文章目录实验背景实验一、安装使用 OpenResty二、安装Redis三、在Nginx中使用Lua脚本访问Redis四、Nginx+Lua+Redis
实验背景
为了防止某恶意用户多次对服务器端口进行攻击,我们需要建立一个动态的 IP 黑名单。对于黑名单之内的 IP ,拒绝提供服务。
实现 IP 黑名单的功能有很多途径:
在操作系统层面,配置 iptables,拒绝指定 IP 的网络请求;
在 Web Server 层面,通过 Nginx 自身的 deny 选项 或者 lua 插件 配置 IP 黑名单;
Nginx-1.18.0+LuaJIT-2.0.5+Redis-6.0.5自动拦截访问频率过高IP
weixin_43268590的博客
07-08
128
Nginx+Lua+Redis安装在公网IP为x.x.x.x的服务器上下载安装的软件版本:nginx-1.18.0+LuaJIT-2.0.5+redis-6.0.5命令:yum groupinstall -y "Development Tools"yum install -y libxml2-devel curl-devel pcre-devel siege traceroute vim gcc zlib zlib-devel pcre-devel openssl openssl-devel lua-dev
基于redis实现IP访问频次控制(超简单)
笑不语的博客
09-22
1027
一、背景描述
最近做了一个项目,通过调用短信网关实现手机号和验证码登录。但是如果有人恶意调用,会发出很多无谓的短信,而且会增加短信服务的费用。于是对接口做了请求频率限制 Rate limiting。例如限制一个用户1分钟内最多可以范围100次。这里简要的复现一下实现思路。
思路:以类名+调用方法名+ip作为key
当用户调用接口的时候,先查询redis中是否有存在该key,获取该key所对应的value,比较value和frequency,如果小于frequency,则在原来的基础上value++;如果大
nginx + lua + redis 防刷和限流
热门推荐
fenglvming的专栏
07-22
3万+
防刷和限流的概念是:
防刷的目的是为了防止有些IP来爬去我们的网页,获取我们的价格等信息。不像普通的搜索引擎,这种爬去行为我们经过统计最高每秒300次访问,平均每秒266次访问。
由于我们的网站的页面都在CDN上,导致我们的CDN流量会定时冒尖。为了防止这种情况,打算将网页页面的访问从CDN切回主站。同时开启防刷功能,目前设置一秒200次访问即视为非法,
会阻止10分钟的访问。
限流的目的
nginx限制ip访问次数
lyf0327的博客
04-07
4503
lit_req_zone的功能是通过 令牌桶原理来限制 用户的连接频率,(这个模块允许你去限制单个地址 指定会话或特殊需要的请求数 )
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
#触发条件,限制每个地址每秒只能请求10次
server {
...
location ~ \.php$ {
nginx限制ip访问频率
csdncjh的博客
06-23
3150
Nginx通过limit_conn_zone 和 limit_req_zone对同一个IP地址进行限速限流,可防止DDOS/CC和flood攻击 。
limit_conn_zone是限制同一个IP的连接数。而一旦连接建立之后 。客户端就会通过这次的连接发送多次请求,那么在此期间的请求频率和速度进行限制就需要limit_req_zone连接数限制,相当于限制了nginx与客户端之间的管道个数http区块的配置:
server区块配置如下;请求频率 限制,相当于限制了nginx与客户端管道之间水的流速http区
phpredis 长连接实现原理
climbs的专栏
01-08
1264
1.长连接的概念理解
长连接其实就是建立了一次连接 然后中间redis的命令都能一直使用,每次使用都不需要重新建立一个连接,这样可以减少建redis连接时间。redis的长连接的生命周期是一个php-fpm进程的时间。再php-fpm这个进程没有关闭之前,这个长连接都是有效的。直观的查看方式就是连续调用两次$redis->connect();和 $redis->pconnect(); ...
lua 链接redis
05-24
449
一、安装luarocks包管理工具
对于centos7,直接可以通过yum 安装luarocks
如果yum里搜索不到,按照官方文档自己编译安装吧
二、依赖安装
luarocks安装lua软件时一般都需要编译(这也是lua性能高的原因吧)
yum install gcc* lua-devel -y
三、安装
luarocks install redis-lua
会使用gcc进行编译安装
-----------------------------------
Lua配置连接redis
htt.
Nginx(OpenResty)+Lua+Redis IP限流 10s内
ole_triangle_java的博客
12-30
294
使用 OpenResty 可以不用再次编译nginx 就能集成对应lua环境 可以扩展的模块比较丰富
1.使用redis 控制限流 ip 访问频度
创建对应lua脚本 access_by_limit_frequency.lua
local function close_redis(red)
if not red then
return
end
--释放连接(连接池实现)
local pool_max_idle_time = 10000 --毫
lua 令牌桶 源码_Nginx + Lua + Redis 实现基础的令牌桶算法限流
weixin_39902184的博客
12-24
248
关于令牌桶( token bucket )令牌桶限流的原理是系统以一个恒定的速度往固定容量的桶里放入令牌,当有请求进来时,需要先从桶里获取并消耗一个令牌,当桶里没有令牌可取时,则拒绝服务或让请求等待。如图:每隔 1/r 秒向 bucket 中填充一个 token ;bucket 最多只能存放 b 个 token ,如果填充 token 时 bucket 已经满了,这丢弃这个 token ;当请求到...
宝塔环境基本使用nginx+lua,简单的限流
嗨皮螃的博客
05-11
1253
宝塔环境基本使用nginx+lua,简单的限流
lua操作redis (zset有序集合为例)
huojiahui22的博客
04-18
1466
1. 使用场景
用有序集合做消息队列。 所以,读出来符合条件数据的同时需要删除此记录。 此时,就要求做到原子性。
2. php中展示
//此脚本满足,取出当前时间之前的N条数据,并删除
$script = <<<LUA
local list = redis.call('ZRANGEBYSCORE', KEYS[1], 0, ARGV[1], 'limit', 0, 1)
if list ~= nil and #list > 0 then
local v = unpack(li
nginx配置限制同一个ip的访问频率
秋天的博客
05-14
1万+
nginx可以通过ngx_http_limit_conn_module和ngx_http_limit_req_module配置来限制ip在同一时间段的访问次数.
ngx_http_limit_conn_module:该模块用于限制每个定义的密钥的连接数,特别是单个IP​​地址的连接数.使用limit_conn_zone和limit_conn指令.
ngx_http_limit_req_m...
nginx 限制单IP访问频率
04-12
866
一、限制所有单个ip的访问频率
1、http中的配置
http {
#$limit_conn_zone:限制并发连接数
limit_conn_zone $binary_remote_addr zone=one1:10m;
#limit_req_zone:请求频率
#$binary_remote_addr:以客户端IP进行限制
#zone=one:10m:创建IP存储区大小为10M,用来存储访问频率
#rate=10r/s:表示客户端的访问评率为每秒10...
nginx单个ip访问频率限制
xue08161981的专栏
12-09
808
一、限制所有单个ip的访问频率
1、http中的配置
http {
#$limit_conn_zone:限制并发连接数
limit_conn_zone $binary_remote_addr zone=one1:10m;
#limit_req_zone:请求频率
#$binary_remote_addr:以客户端IP进行限制
#zone=one:10m:创建IP存储区大小为10M,用来存储访问频率
#rate=10r/s:表示客户端的访问评率为.
分布式限流方案(gateway限流,redis+lua实现限流,nginx限流)
qq_41979344的博客
01-25
919
实现多维度限流限流算法计数器漏桶算法令牌桶算法限流方案具体实现网关限流redis+luaNginx限流
限流算法
计数器
计数器比较简单粗暴,比如我们限制的是1s能够通过的请求数,实现的思路就是从第一个请求进来开始计时,在接下来的1s内,每个请求进来请求数就+1,超过最大请求数的请求会被拒绝,等到1s结束后计数清零,重新开始计数。
这种方式有个很大的弊端:比如前10ms已经通过了最大的请求数,那么后面的990ms的请求只能拒绝,这种现象叫做“突刺现象”。
漏桶算法
就是桶底出水的速度恒定,进水的速度可能快慢
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:编程工作室
设计师:CSDN官方博客
返回首页
打杂人
CSDN认证博客专家
CSDN认证企业博客
码龄16年
暂无认证
442
原创
4932
周排名
43万+
总排名
1364万+
访问
等级
9万+
积分
1万+
粉丝
1185
获赞
459
评论
3140
收藏
私信
关注
热门文章
1寸2寸3寸5寸6寸8寸10寸照片的具体尺寸(附常用照片尺寸对照表)
1718840
ip段/数字,如192.168.0.1/24是什么意思?
312595
Flash Helper Service 这个流氓,动不动弹出广告!!
208673
[乐意黎原创]向上取整⌈⌉和向下取整⌊⌋符号含义及应用
161748
JAVA构造函数(方法)
152920
分类专栏
网页自动化测试
21篇
服务器及编程语言配置
117篇
Git+SVN
2篇
最新评论
[乐意黎原创]Sublime text3里 修改TAB键为缩进为四个空格
m0_75228701:
很好的创意,很实用!
无线供电技术
搬砖打工人:
今天注册,明天明天科技就被吊销
软考学习之关于McCabe环路复杂度的计算
冬天来了么:
环路复杂度V(G)=边数 - 节点数 +2 = 条件节点数 +1 = 封闭区域数+1
!= 封闭区域数
Solaris 10 下 Samba 的详细配置步骤和常见问题解决
摘星_goddess:
我没有/etc/sfw 这个目录是为啥
[乐意黎原创]向上取整⌈⌉和向下取整⌊⌋符号含义及应用
Hello_Spring.:
⌈⌉
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
VSCode 正则替换节点增加属性
How to change Google chrome windows order in the Windows task panel
2021-06-24 box-sizing/vue路由/跨域
2021年5篇
2020年22篇
2019年96篇
2018年177篇
2017年341篇
2016年181篇
2015年143篇
2014年240篇
2013年56篇
2012年777篇
2011年122篇
2010年36篇
2009年4篇
目录
目录
分类专栏
网页自动化测试
21篇
服务器及编程语言配置
117篇
Git+SVN
2篇
目录
评论 1
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值