成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Nginx+Lua+Redis訪問頻率控制

沈儉 / 791人閱讀

摘要:來處理訪問控制的方法有多種,實(shí)現(xiàn)的效果也有多種,訪問段,訪問內(nèi)容限制,訪問頻率限制等。用來做訪問限制主要是考慮到高并發(fā)環(huán)境下快速訪問控制的需求。處理請(qǐng)求的過程一共劃分為個(gè)階段,分別是在中,可以找到,,,等方法。那么訪問控制應(yīng)該是,階段。


0x01.About

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階段。



0x02.How to do 1.Solution

按照正常的邏輯思維,我們會(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,搞定。



本文出自 夏日小草,轉(zhuǎn)載請(qǐng)注明出處:http://homeway.me/2015/08/11/nginx-lua-redis-access-control/

-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

相關(guān)文章

  • Nginx流量攔截算法

    摘要:自身有的請(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...

    fuchenxuan 評(píng)論0 收藏0
  • LuaNginx的應(yīng)用

    摘要:例如響應(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 庫...

    Mike617 評(píng)論0 收藏0
  • 高并發(fā)紅包整體設(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ī)金額或固定金...

    shenhualong 評(píng)論0 收藏0
  • 高并發(fā)紅包整體設(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ī)金額或固定金...

    cheukyin 評(píng)論0 收藏0
  • 高并發(fā)紅包整體設(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ī)金額或固定金...

    Freeman 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<