国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Nginx+Lua+Redis訪問頻率控制

沈儉 / 785人閱讀

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


0x01.About

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



0x02.How to do 1.Solution

按照正常的邏輯思維,我們會想到的訪問控制方案如下:

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,搞定。



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

-by小草

2015-08-10 01:20:10

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/39178.html

相關(guān)文章

  • Nginx流量攔截算法

    摘要:自身有的請求限制模塊流量限制模塊基于令牌桶算法,可以方便的控制令牌速率,自定義調(diào)節(jié)限流,就能很好的限制請求數(shù)量,然而,問題還是在于無法熱加載。漏桶算法可以很好地限制容量池的大小,從而防止流量暴增。這也是對流量攔截的算法,針對做流量監(jiān)測。 showImg(http://77l5jp.com1.z0.glb.clouddn.com/blog/logo-nginx-lua.png); 0x0...

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

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

    Mike617 評論0 收藏0
  • 高并發(fā)紅包整體設(shè)計方案

    摘要:記錄下整體的設(shè)計思路以及運營過程中的各種問題。如果錢是負(fù)數(shù)了,還得從已生成的小紅包中抽取回來將紅包放入隊列之中創(chuàng)建紅包失敗,請檢查參數(shù)生產(chǎn)和之間的隨機數(shù),但是概率不是平均的,從到方向概率逐漸加大。 公司前段時間根據(jù)業(yè)務(wù)方需求需要做一個搶紅包的活動,網(wǎng)上也搜索了很多資料。記錄下整體的設(shè)計思路以及運營過程中的各種問題。 產(chǎn)品需求: 1.紅包支持配置開始時間、結(jié)束時間、類型(隨機金額或固定金...

    shenhualong 評論0 收藏0
  • 高并發(fā)紅包整體設(shè)計方案

    摘要:記錄下整體的設(shè)計思路以及運營過程中的各種問題。如果錢是負(fù)數(shù)了,還得從已生成的小紅包中抽取回來將紅包放入隊列之中創(chuàng)建紅包失敗,請檢查參數(shù)生產(chǎn)和之間的隨機數(shù),但是概率不是平均的,從到方向概率逐漸加大。 公司前段時間根據(jù)業(yè)務(wù)方需求需要做一個搶紅包的活動,網(wǎng)上也搜索了很多資料。記錄下整體的設(shè)計思路以及運營過程中的各種問題。 產(chǎn)品需求: 1.紅包支持配置開始時間、結(jié)束時間、類型(隨機金額或固定金...

    cheukyin 評論0 收藏0
  • 高并發(fā)紅包整體設(shè)計方案

    摘要:記錄下整體的設(shè)計思路以及運營過程中的各種問題。如果錢是負(fù)數(shù)了,還得從已生成的小紅包中抽取回來將紅包放入隊列之中創(chuàng)建紅包失敗,請檢查參數(shù)生產(chǎn)和之間的隨機數(shù),但是概率不是平均的,從到方向概率逐漸加大。 公司前段時間根據(jù)業(yè)務(wù)方需求需要做一個搶紅包的活動,網(wǎng)上也搜索了很多資料。記錄下整體的設(shè)計思路以及運營過程中的各種問題。 產(chǎn)品需求: 1.紅包支持配置開始時間、結(jié)束時間、類型(隨機金額或固定金...

    Freeman 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<