百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

通过 lua 进行 nginx redis 访问控制

off999 2025-03-05 20:03 26 浏览 0 评论

Nginx来处理访问控制的方法有多种,实现的效果也有多种,访问IP段,访问内容限制,访问频率限制等。

1. 需求分析

1. Nginx来处理访问控制的方法有多种,实现的效果也有多种,访问IP段,访问内容限制,访问频率限制等。

2. 用Nginx+Lua+Redis来做访问限制主要是考虑到高并发环境下快速访问控制的需求。

3. Nginx处理请求的过程一共划分为11个阶段,分别是:

post-read、server-rewrite、find-config、rewrite、post-rewrite、 preaccess、access、post-access、try-files、content、log.

在openresty中,可以找到:

set_by_lua,access_by_lua,content_by_lua,rewrite_by_lua等方法。

那么访问控制应该是,access阶段。

解决方案

按照正常的逻辑思维,我们会想到的访问控制方案如下:

1.检测是否被forbidden?
=》是,forbidden是否到期:是,清除记录,返回200,正常访问;否,返回403;
=》否,返回200,正常访问

2.每次访问,访问用户的访问频率+1处理

3.检测访问频率是否超过限制,超过即添加forbidden记录,返回403

这是简单地方案,还可以添加点枝枝叶叶,访问禁止时间通过算法导入,每次凹曲线增加。

实现方法

首先为nginx添加vhost配置文件,vhost.conf部分内容如下:

lua_package_path "/usr/local/openresty/lualib/?.lua;;";#告诉openresty库地址
lua_package_cpath "/usr/local/openresty/lualib/?.so;;";
error_log /usr/local/openresty/nginx/logs/openresty.debug.log debug;

server {
    listen 8080 default;
    server_name www.ttlsa.com;    
    root  /www/openresty;

    location /login {
        default_type 'text/html';
        access_by_lua_file "/usr/local/openresty/nginx/lua/access_by_redis.lua";#通过lua来处理访问控制
    }
}

Access_by_redis.lua

参考了下v2ex.com的做法,redis存储方案只做简单地string存储就足够了。key分别是:

用户登录记录:user:127.0.0.1:time(unix时间戳)

访问限制:block:127.0.0.1

先连接Redis吧:

local red = redis:new()
function M:redis()
	red:set_timeout(1000)
	local ok, err = red:connect("127.0.0.1", 6379)
	if not ok then
		ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
	end
end

按照我们的逻辑方案,第二步是,检测是否forbidden,下面我们就检测block:127.0.0.1,如果搜索到数据,检测时间是否过期,未过期返回403,否则直接返回200:

function M:check1()
	local time=os.time()	--system time
	local res, err = red:get("block:"..ngx.var.remote_addr)
	if not res then	-- redis error
		ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) --redis get data error 	end
	
	if type(res) == "string" then --if red not null then type(red)==string
		if tonumber(res) >= tonumber(time) then  --check if forbidden expired
			ngx.exit(ngx.HTTP_FORBIDDEN)
			--ngx.say("forbidden")
		end
	end
}

接下来会做检测,是否访问频率过高,如果过高,要拉到黑名单的,

实现的方法是,检测user:127.0.0.1:time的值是否超标:

function M:check2()
	local time=os.time()	--system time
	local res, err = red:get("user:"..ngx.var.remote_addr..":"..time)
	if not res then	-- redis error
		ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) --redis get data error
	end

	if type(res) == "string" then
		if tonumber(res) >= 10 then -- attack, 10 times request/s
			red:del("block:"..self.ip)	
			red:set("block:"..self.ip, tonumber(time)+5*60 ) --set block time
			ngx.exit(ngx.HTTP_FORBIDDEN)
		end
	end
end

最后呢,还要记得,把每次访问时间做一个自增长,user:127.0.0.1:time

function M:add()
	local time=os.time()	--system time
	ok, err = red:incr("user:"..ngx.var.remote_addr..":"..time)
	if not ok then
		ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) --redis get data error
	end
end

那么,测试,强刷几次浏览器,发现过一会,返回了403,ok,搞定。

https://www.linuxprobe.com/lua-access-control-redis.html

相关推荐

系统之家u盘装系统工具(系统之家u盘安装系统步骤win7)

系统之家下的系统用U盘安装的方法:1、首先,关闭所有的杀毒软件。?2、进入工具后,在最上方选择U盘启动,进入U盘启动盘制作界面。?3、保留默认格式和分区格式,无需手动更改。点击开始制作。?4、工具会自...

服务器系统有哪几种(服务器系统叫什么名字)
服务器系统有哪几种(服务器系统叫什么名字)

服务器系统主要分为四大流派:LINUX、WINDOWS、NETWARE、UNIX。服务器系统通常来讲是指安装在服务器上的操作系统。比如安装在Web服务器、应用服务器和数据库服务器等上的操作系统,是企业IT系统的基础架构平台,也是按应用领域划...

2025-12-22 04:03 off999

msdn重装系统(msdn重装win10)

笔记本一般都是家庭版正版,就下载第二个消费者版本然后选择《家庭版》,如果不对应安装就会提示需要激活!如果使用工具激活了,以后你机器自带的正版系统也就没有了。1.建议先安装驱动。2.因为安装驱动可以...

修复磁盘能不能中途取消(修复磁盘能不能中途取消掉)

修复磁盘可以原则上建议等待,一般情况下10分钟左右磁盘就会检测完毕。但如果超过10分钟,就不建议等待了,这种情况基本都是硬盘有逻辑坏道或者物理坏道,基本都是非正常关机造成的。所以,可以使用PE系统进行...

数据库系统工程师(数据库系统)

1相对来说比较难考2因为数据库系统工程师需要掌握大量的数据库理论知识、数据库设计和管理技能、数据分析和优化能力等多方面的技能,考试难度较大。3但是只要有足够的学习时间和精力,通过系统学习和练习,...

u盘安装win7系统到固态(u盘安装系统到固态硬盘)

1.进入bios设置,查看你的本本是否可以直接设置硬盘顺序。可以的话设置下,然后固态硬盘安装win7即可。2.接硬盘数据线注意顺序,固态硬盘接前面,数值小的端口。根据你的情况如果接口一样,可以交换2条...

优盘启动盘重装系统进入bios

原因分析:开机时直接进入BIOS的主要原因是主办BIOS的设置出现了问题。有些电脑的主板在设置的时候为了能够更加人性化所以加入了许多其他的功能。当BIOS的设置不正确时重启电脑就会自动进入BIOS。解...

台式电脑怎么调节亮度快捷键
  • 台式电脑怎么调节亮度快捷键
  • 台式电脑怎么调节亮度快捷键
  • 台式电脑怎么调节亮度快捷键
  • 台式电脑怎么调节亮度快捷键
usb系统盘下载(系统u盘之家)

手机不可以下载电脑系统到U盘里,这是跟系统文件的格式有直接关系。电脑的系统文件,它在下载安装的时候必须使用电脑版本的U盘才可以正确安装。手机的版本它和电脑的版本差别比较大,即使下载后也不可能正确安装。...

windows8模拟器(国内版)(win8模拟器安卓版下载)

雷电模拟器能在win8系统运行,1、官网下载雷电模拟器,双击安装包进入安装界面。2、点击“自定义安装”修改安装路径,点击“浏览”选择好要安装的路径,默认勾选“已同意”,最后点击“立即安装”。...

win10安装专业版还是家庭版(win10安装专业版还是家庭版好)

从Win10家庭版和专业版对比来看,Win10专业版要比家庭版功能更强大一些,不过价格更贵。另外Win10专业版的一系列Win10增强技术对于普通用户也基本用不到,多了也显得系统不那么精简,因此普通个...

win10系统保护不见了(win10系统保护打不开怎么办)

1、启动计算机,启动到Windows10开机LOGO时就按住电源键强制关机,重复强制关机3次!2、重复步骤3次左右启动后出现“自动修复”界面,我们点击高级选项进入;3、接下来会到选择一个选项界面...

新手如何重装win8(怎么重新装系统win8)

要想重装回win8.1系统,首先你需要一个win8.1的系统安装盘,然后把你电脑的系统盘格式化一下,或者把你的win10系统删除了,再把win8.1系统安装盘插到电脑上,进行系统安装,等电脑安装系统完...

磁盘分区工具软件(硬盘分区工具软件)

如果说最安全的那就用电脑自带的吧,右键我的电脑,找到管理,然后进去磁盘管理,然后找到目前的一个磁盘,右键压缩卷,输入压缩空间就是你想要的一个盘的大小(1G=1024MB),然后压缩,然后找到你压缩出来...

ftp手机客户端(ftp手机客户端存文件)

要想实现FTP文件传输,必须在相连的两端都装有支持FTP协议的软件,装在您的电脑上的叫FTP客户端软件,装在另一端服务器上的叫做FTP服务器端软件。  客户端FTP软件使用方法很简单,启动后首先要与...

取消回复欢迎 发表评论: