摘要:來處理訪問控制的方法有多種,實(shí)現(xiàn)的效果也有多種,訪問段,訪問內(nèi)容限制,訪問頻率限制等。用來做訪問限制主要是考慮到高并發(fā)環(huán)境下快速訪問控制的需求。處理請(qǐng)求的過程一共劃分為個(gè)階段,分別是在中,可以找到,,,等方法。那么訪問控制應(yīng)該是,階段。
Nginx來處理訪問控制的方法有多種,實(shí)現(xiàn)的效果也有多種,訪問IP段,訪問內(nèi)容限制,訪問頻率限制等。
用Nginx+Lua+Redis來做訪問限制主要是考慮到高并發(fā)環(huán)境下快速訪問控制的需求。
Nginx處理請(qǐng)求的過程一共劃分為11個(gè)階段,分別是:
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等方法。
那么訪問控制應(yīng)該是,access階段。
按照正常的邏輯思維,我們會(huì)想到的訪問控制方案如下:
1.檢測(cè)是否被forbidden?
=》是,forbidden是否到期:是,清除記錄,返回200,正常訪問;否,返回403;
=》否,返回200,正常訪問
2.每次訪問,訪問用戶的訪問頻率+1處理
3.檢測(cè)訪問頻率是否超過限制,超過即添加forbidden記錄,返回403
這是簡(jiǎn)單地方案,還可以添加點(diǎn)枝枝葉葉,訪問禁止時(shí)間通過算法導(dǎo)入,每次凹曲線增加。
2.Config首先為nginx添加vhost配置文件,vhost.conf部分內(nèi)容如下:
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 localhost; root /www/openresty; location /login { default_type "text/html"; access_by_lua_file "/usr/local/openresty/nginx/lua/access_by_redis.lua";#通過lua來處理訪問控制 } }3.Access_by_redis.lua
參考了下v2ex.com的做法,redis存儲(chǔ)方案只做簡(jiǎn)單地string存儲(chǔ)就足夠了。key分別是:
用戶登錄記錄:user:127.0.0.1:time(unix時(shí)間戳)
訪問限制: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
按照我們的邏輯方案,第二步是,檢測(cè)是否forbidden,下面我們就檢測(cè)block:127.0.0.1,如果搜索到數(shù)據(jù),檢測(cè)時(shí)間是否過期,未過期返回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 }
接下來會(huì)做檢測(cè),是否訪問頻率過高,如果過高,要拉到黑名單的,
實(shí)現(xiàn)的方法是,檢測(cè)user:127.0.0.1:time的值是否超標(biāo):
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
最后呢,還要記得,把每次訪問時(shí)間做一個(gè)自增長(zhǎng),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
那么,測(cè)試,強(qiáng)刷幾次瀏覽器,發(fā)現(xiàn)過一會(huì),返回了403,ok,搞定。
-by小草
2015-08-10 01:20:10
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/39178.html
摘要:自身有的請(qǐng)求限制模塊流量限制模塊基于令牌桶算法,可以方便的控制令牌速率,自定義調(diào)節(jié)限流,就能很好的限制請(qǐng)求數(shù)量,然而,問題還是在于無法熱加載。漏桶算法可以很好地限制容量池的大小,從而防止流量暴增。這也是對(duì)流量攔截的算法,針對(duì)做流量監(jiān)測(cè)。 showImg(http://77l5jp.com1.z0.glb.clouddn.com/blog/logo-nginx-lua.png); 0x0...
摘要:例如響應(yīng)部分通過的形式獲取或設(shè)置響應(yīng)頭信息。以某個(gè)狀態(tài)碼返回響應(yīng)內(nèi)容,狀態(tài)碼常量對(duì)應(yīng)關(guān)系見部分,也支持?jǐn)?shù)字形式的狀態(tài)碼。重定向當(dāng)前請(qǐng)求到新的,響應(yīng)狀態(tài)碼可選列表為默認(rèn)。具體內(nèi)容如下相關(guān)文章進(jìn)入的世界在的應(yīng)用 首發(fā)于 樊浩柏科學(xué)院 當(dāng) Nginx 標(biāo)準(zhǔn)模塊和配置不能靈活地適應(yīng)系統(tǒng)要求時(shí),就可以考慮使用 Lua 擴(kuò)展和定制 Nginx 服務(wù)。OpenResty 集成了大量精良的 Lua 庫...
摘要:記錄下整體的設(shè)計(jì)思路以及運(yùn)營(yíng)過程中的各種問題。如果錢是負(fù)數(shù)了,還得從已生成的小紅包中抽取回來將紅包放入隊(duì)列之中創(chuàng)建紅包失敗,請(qǐng)檢查參數(shù)生產(chǎn)和之間的隨機(jī)數(shù),但是概率不是平均的,從到方向概率逐漸加大。 公司前段時(shí)間根據(jù)業(yè)務(wù)方需求需要做一個(gè)搶紅包的活動(dòng),網(wǎng)上也搜索了很多資料。記錄下整體的設(shè)計(jì)思路以及運(yùn)營(yíng)過程中的各種問題。 產(chǎn)品需求: 1.紅包支持配置開始時(shí)間、結(jié)束時(shí)間、類型(隨機(jī)金額或固定金...
摘要:記錄下整體的設(shè)計(jì)思路以及運(yùn)營(yíng)過程中的各種問題。如果錢是負(fù)數(shù)了,還得從已生成的小紅包中抽取回來將紅包放入隊(duì)列之中創(chuàng)建紅包失敗,請(qǐng)檢查參數(shù)生產(chǎn)和之間的隨機(jī)數(shù),但是概率不是平均的,從到方向概率逐漸加大。 公司前段時(shí)間根據(jù)業(yè)務(wù)方需求需要做一個(gè)搶紅包的活動(dòng),網(wǎng)上也搜索了很多資料。記錄下整體的設(shè)計(jì)思路以及運(yùn)營(yíng)過程中的各種問題。 產(chǎn)品需求: 1.紅包支持配置開始時(shí)間、結(jié)束時(shí)間、類型(隨機(jī)金額或固定金...
摘要:記錄下整體的設(shè)計(jì)思路以及運(yùn)營(yíng)過程中的各種問題。如果錢是負(fù)數(shù)了,還得從已生成的小紅包中抽取回來將紅包放入隊(duì)列之中創(chuàng)建紅包失敗,請(qǐng)檢查參數(shù)生產(chǎn)和之間的隨機(jī)數(shù),但是概率不是平均的,從到方向概率逐漸加大。 公司前段時(shí)間根據(jù)業(yè)務(wù)方需求需要做一個(gè)搶紅包的活動(dòng),網(wǎng)上也搜索了很多資料。記錄下整體的設(shè)計(jì)思路以及運(yùn)營(yíng)過程中的各種問題。 產(chǎn)品需求: 1.紅包支持配置開始時(shí)間、結(jié)束時(shí)間、類型(隨機(jī)金額或固定金...
閱讀 2164·2021-11-15 11:36
閱讀 1504·2021-09-23 11:55
閱讀 2497·2021-09-22 15:16
閱讀 2035·2019-08-30 15:45
閱讀 1871·2019-08-29 11:10
閱讀 1035·2019-08-26 13:40
閱讀 924·2019-08-26 10:44
閱讀 3178·2019-08-23 14:55