防刷的概念:
防刷的目的是為了防止有些ip來爬去我們的網頁,獲取我們的**等資訊。不像普通的搜尋引擎,這種爬去行為我們經過統計最高每秒300次訪問,平均每秒266次訪問。
由於我們的**的頁面都在cdn上,導致我們的cdn流量會定時冒尖。為了防止這種情況,打算將網頁頁面的訪問從cdn切回主站。同時開啟防刷功能,目前設定一秒200次訪問即視為非法,會阻止10分鐘的訪問。
限流的概念:
限流的目的是在大促或者流量突增期間,我們的後端服務假設某個介面能夠扛住的的qps為10000,這時候同時有20000個請求進來,經過限流模組,會先放10000個請求,其餘的請求會阻塞一段時間。不簡單粗暴的返回404,讓客戶端重試,同時又能起到流量銷峰的作用。
目前防刷模組已經經過ab的壓測。
限流模組經過測試後發現,請求幾乎很平均的按照限流的模式進行分布,不過會有接近1%的請求超時。因為極端情況下,乙個請求總是被阻塞。(目前想到的解決方案:乙個請求被阻塞多次後就放行,不再需要判斷當前總請求數。)
redis部署方式:
單docker例項,由marathon負責排程,無需開啟rdb和aof
風險:redis掛了。 處理方式:直接放行。 同時,我們的mesos能夠保證redis在秒級內重啟。
在限流模組的時候採用了redis的eval命令來進行原子的執行,而防刷模組沒有。
-- access_by_lua_file '/opt/ops/lua/access_flow_control.lua'
local function close_redis(red)
if not red then
return
end--釋放連線(連線池實現)
local pool_max_idle_time = 10000 --毫秒
local pool_size = 100 --連線池大小
local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)
if not ok then
ngx_log(ngx_err, "set redis keepalive error : ", err)
endend
local function wait()
ngx.sleep(1)
endlocal redis = require "resty.redis"
local red = redis:new()
red:set_timeout(1000)
local ip = "redis-ip"
local port = redis-port
local ok, err = red:connect(ip,port)
if not ok then
return close_redis(red)
endlocal uri = ngx.var.uri -- 獲取當前請求的uri
local urikey = "req:uri:"..uri
res, err = red:eval("local res, err = redis.call('incr',keys[1]) if res == 1 then local re***pire, err = redis.call('expire',keys[1],keys[2]) end return (res)",2,urikey,1)
while (res > 10)
do local twait, err = ngx.thread.spawn(wait)
ok, threadres = ngx.thread.wait(twait)
if not ok then
ngx_log(ngx_err, "wait sleep error: ", err)
break;
endres, err = red:eval("local res, err = redis.call('incr',keys[1]) if res == 1 then local re***pire, err = redis.call('expire',keys[1],keys[2]) end return (res)",2,urikey,1)
endclose_redis(red)
nginx lua redis 配置安裝
因為用openrsty也可以不用安裝所有模組都能用,但是為了更純淨些,就用nginx安裝自己需要的模組。需要的模組為 luajit 2.0.2.tar.gz?echo nginx module 0.46.tar.gz?lua redis parser 0.10.tar.gz?redis2 nginx...
ip防刷指令碼
bin sh 防刷指令碼 env access path home wwwlogs access log y.log iptables top log iptables top.log drop log droplist.log history log history.log ip白名單 noip ...
nginx lua redis 使用方法
2 編譯安裝 tar xzvf ngx openresty 1.7.10.1.tar.gz cd ngx openresty 1.7.10.1 configure with luajit make make install3 修改nginx config usr local openresty ng...