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