Web服务器(Nginx)控制用户访问频率的解决方案_如何访问nginx服务器
Web服务器(Nginx)控制用户访问频率的解决方案由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“如何访问nginx服务器”。
Web服务器(Nginx)控制用户访问频率的解决方案
Nginx来处理访问控制的方法有多种,实现的效果也有多种,访问IP段,访问内容限制,访问频率限制等。用Nginx+Lua+Redis来做访问限制主要是考虑到高并发环境下快速访问控制的需求。Nginx处理请求的过程一共划分为11个阶段,分别是:
post-read、server-rewrite、find-config、rewrite、post-rewrite、preacce、acce、post-acce、try-files、content、log.在openresty中,可以找到:
set_by_lua,acce_by_lua,content_by_lua,rewrite_by_lua等方法。那么访问控制应该是,acce阶段。
1.解决思路
按照正常的逻辑思维,我们会想到的访问控制方案如下: 1.检测是否被forbidden?
=》是,forbidden是否到期:是,清除记录,返回200,正常访问;否,返回403; =》否,返回200,正常访问
2.每次访问,访问用户的访问频率+1处理
3.检测访问频率是否超过限制,超过即添加forbidden记录,返回403 这是简单地方案,还可以添加点枝枝叶叶,访问禁止时间通过算法导入,每次凹曲线增加。
2.Config 首先为nginx添加vhost配置文件,vhost.conf部分内容如下:2 3 4 lua_package_path “/usr/local/openresty/lualib/?.lua;;”;#告诉openresty库地址 lua_package_cpath “/usr/local/openresty/lualib/?.so;;”;5 6 7 8 9 10 11 12 13 14 error_log /usr/local/openresty/nginx/logs/openresty.debug.log debug;
server { listen 8080 default;server_namelocalhost;root /www.daodoc.com的做法,redis存储方案只做简单地string存储就足够了。key分别是: 用户登录记录:user:127.0.0.1:time(unix时间戳)访问限制:block:127.0.0.1 先连接Redis吧:
local red = redis:new()1 2 3 4 5 6 7 8 functionM: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()1 2 3 4 5 6 7 8 9 10 11 12 13 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
iftonumber(res)>= tonumber(time)then--check if forbidden expired
ngx.exit(ngx.HTTP_FORBIDDEN)
--ngx.say(“forbidden”)
end end } 接下来会做检测,是否访问频率过高,如果过高,要拉到黑名单的,实现的方法是,检测user:127.0.0.1:time的值是否超标:2 3 4 5 6 7 8 9 10 11 12 13 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 14 15
if type(res)== “string” then
iftonumber(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:2 3 4 5 functionM:add()local time=os.time()--system time 6 7 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,搞定。
“ddddaddyy”为你分享6篇“服务器访问权限控制策略的重要性”,经本站小编整理后发布,但愿对你的工作、学习、生活带来方便。篇1:服务器访问权限控制策略的重要性 任何服务器,安......
服务器托管如何进行IIS访问控制服务器托管用户都希望服务器能够在一个安全的环境下运行。对于服务器中的数据安全,除了硬件上的房户外,在软件上不仅要做好系统的加固,还要做好I......
目标本章的目标是: • 获取 SSL 证书。 • 在 IIS 服务器上安装 SSL 证书。 • 配置虚拟目录以要求 SSL。 适用范围本章适用于以下产品和技术: • Microsoft Windows® XP 或......
要想通过外网访问内网,要具备的几个条件如下: 1.能够访问INTERNET广域网; 2.安装FTP服务器;3.提供一个供外网访问的端口 4.域名解析软件公司网络已经可以访问外网和FTP服务器已......
ACPCHE_+RESIN_+JDK_1.5_架设WEB服务器
ACPCHE +RESIN +JDK 1.5 架设WEB服务器一.准备软件如下(已有安装好REDHAT9.0 系统): 1.J2SDK(1.5.0): jdk1.5.0_08-linux-i586-rpm.bin 2.Apache(2.2.3): httpd-2.2.3.tar.gz 3.R......
