欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

nginx+lua+redis防刷和限流的實(shí)現(xiàn)

 更新時(shí)間:2023年09月05日 10:03:36   作者:laolu0837  
本文將介紹如何使用nginx lua redis實(shí)現(xiàn)防刷和限流,首先,我們將了解防刷和限流的基本概念和必要性,然后,我們將詳細(xì)介紹如何使用nginx lua redis實(shí)現(xiàn)防刷和限流,感興趣的可以了解一下

防刷的概念:

防刷的目的是為了防止有些IP來爬去我們的網(wǎng)頁,獲取我們的價(jià)格等信息。不像普通的搜索引擎,這種爬去行為我們經(jīng)過統(tǒng)計(jì)最高每秒300次訪問,平均每秒266次訪問。

由于我們的網(wǎng)站的頁面都在CDN上,導(dǎo)致我們的CDN流量會(huì)定時(shí)冒尖。為了防止這種情況,打算將網(wǎng)頁頁面的訪問從CDN切回主站。同時(shí)開啟防刷功能,目前設(shè)置一秒200次訪問即視為非法,會(huì)阻止10分鐘的訪問。

限流的概念:

限流的目的是在大促或者流量突增期間,我們的后端服務(wù)假設(shè)某個(gè)接口能夠扛住的的QPS為10000,這時(shí)候同時(shí)有20000個(gè)請(qǐng)求進(jìn)來,經(jīng)過限流模塊,會(huì)先放10000個(gè)請(qǐng)求,其余的請(qǐng)求會(huì)阻塞一段時(shí)間。不簡單粗暴的返回404,讓客戶端重試,同時(shí)又能起到流量銷峰的作用。

目前防刷模塊已經(jīng)經(jīng)過ab的壓測(cè)。

限流模塊經(jīng)過測(cè)試后發(fā)現(xiàn),請(qǐng)求幾乎很平均的按照限流的模式進(jìn)行分布,不過會(huì)有接近1%的請(qǐng)求超時(shí)。因?yàn)闃O端情況下,一個(gè)請(qǐng)求總是被阻塞。(目前想到的解決方案:一個(gè)請(qǐng)求被阻塞多次后就放行,不再需要判斷當(dāng)前總請(qǐng)求數(shù)。)

redis部署方式:
單docker實(shí)例,由marathon負(fù)責(zé)調(diào)度,無需開啟rdb和aof

風(fēng)險(xiǎn):
 redis掛了。 處理方式:直接放行。 同時(shí),我們的mesos能夠保證redis在秒級(jí)內(nèi)重啟。
在限流模塊的時(shí)候采用了redis的eval命令來進(jìn)行原子的執(zhí)行,而防刷模塊沒有。

下面放出代碼,請(qǐng)各位大拿指正。close_redis的代碼抄自開濤的博客中相關(guān)內(nèi)容。

防刷代碼

-- access_by_lua_file '/opt/ops/lua/access_limit.lua'
local function close_redis(red)
    if not red then
        return
    end
    --釋放連接(連接池實(shí)現(xiàn))
    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)
    end
end
local 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)
end
local clientIP = ngx.req.get_headers()["X-Real-IP"]
if clientIP == nil then
   clientIP = ngx.req.get_headers()["x_forwarded_for"]
end
if clientIP == nil then
   clientIP = ngx.var.remote_addr
end
local incrKey = "user:"..clientIP..":freq"
local blockKey = "user:"..clientIP..":block"
local is_block,err = red:get(blockKey) -- check if ip is blocked
if tonumber(is_block) == 1 then
   ngx.exit(ngx.HTTP_FORBIDDEN)
   return close_redis(red)
end
res, err = red:incr(incrKey)
if res == 1 then
   res, err = red:expire(incrKey,1)
end
if res > 200 then
    res, err = red:set(blockKey,1)
    res, err = red:expire(blockKey,600)
end
close_redis(red)

限流代碼

-- access_by_lua_file '/opt/ops/lua/access_flow_control.lua'
local function close_redis(red)
    if not red then
        return
    end
    --釋放連接(連接池實(shí)現(xiàn))
    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)
    end
end
local function wait()
   ngx.sleep(1)
end
local 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)
end
local uri = ngx.var.uri -- 獲取當(dāng)前請(qǐng)求的uri
local uriKey = "req:uri:"..uri
res, err = red:eval("local res, err = redis.call('incr',KEYS[1]) if res == 1 then local resexpire, 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;
   end
   res, err = red:eval("local res, err = redis.call('incr',KEYS[1]) if res == 1 then local resexpire, err = redis.call('expire',KEYS[1],KEYS[2]) end return (res)",2,uriKey,1)
end
close_redis(red)

到此這篇關(guān)于nginx+lua+redis防刷和限流的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)nginx lua redis防刷和限流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 實(shí)例詳解SpringBoot+nginx實(shí)現(xiàn)資源上傳功能

    實(shí)例詳解SpringBoot+nginx實(shí)現(xiàn)資源上傳功能

    這篇文章主要介紹了SpringBoot+nginx實(shí)現(xiàn)資源上傳功能,由于小編最近在使用nginx放置靜態(tài)資源問題,遇到很多干貨,特此分享到腳本之家平臺(tái),供大家參考,需要的朋友可以參考下
    2019-10-10
  • 高并發(fā)nginx服務(wù)器的linux內(nèi)核優(yōu)化配置講解

    高并發(fā)nginx服務(wù)器的linux內(nèi)核優(yōu)化配置講解

    今天小編就為大家分享一篇關(guān)于高并發(fā)nginx服務(wù)器的linux內(nèi)核優(yōu)化配置講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Nginx中server_name指令的參數(shù)詳解

    Nginx中server_name指令的參數(shù)詳解

    這篇文章主要介紹了Nginx中server_name指令的參數(shù)詳解,Nginx中的server_name指令主要用于配置基于名稱的虛擬主機(jī),server_name指令一項(xiàng)很實(shí)用的功能便是可以在使用正則表達(dá)式的捕獲功能,這樣可以盡量精簡配置文件,需要的朋友可以參考下
    2023-08-08
  • Nginx 只允許 www 域名訪問并禁止裸域名訪問的實(shí)現(xiàn)步驟

    Nginx 只允許 www 域名訪問并禁止裸域名訪問的實(shí)現(xiàn)步驟

    通過Nginx配置,可以設(shè)定僅允許www域名訪問,禁止或重定向裸域名,提升網(wǎng)站品牌統(tǒng)一性及用戶體驗(yàn),設(shè)置包括創(chuàng)建針對(duì)www的虛擬主機(jī),禁止裸域名訪問,并可選進(jìn)行裸域名到www的301重定向,完成后,重啟Nginx服務(wù)器使配置生效
    2024-10-10
  • Nginx 遇到502 Bad Gateway 自動(dòng)重啟的腳本代碼

    Nginx 遇到502 Bad Gateway 自動(dòng)重啟的腳本代碼

    放到crontab里一分鐘執(zhí)行一次。url和cmd根據(jù)自己的改。
    2010-12-12
  • Nginx學(xué)習(xí)之靜態(tài)文件服務(wù)器配置方法

    Nginx學(xué)習(xí)之靜態(tài)文件服務(wù)器配置方法

    本篇文章主要介紹了Nginx學(xué)習(xí)之靜態(tài)文件服務(wù)器配置方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • nginx反向代理如何替換URL

    nginx反向代理如何替換URL

    這篇文章主要介紹了nginx反向代理如何替換URL問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Nginx代理同域名前后端分離項(xiàng)目的完整步驟

    Nginx代理同域名前后端分離項(xiàng)目的完整步驟

    這篇文章主要給大家介紹了關(guān)于Nginx代理同域名前后端分離項(xiàng)目的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 淺談nginx讀寫鎖的實(shí)現(xiàn)邏輯

    淺談nginx讀寫鎖的實(shí)現(xiàn)邏輯

    本文主要介紹了淺談nginx讀寫鎖的實(shí)現(xiàn)邏輯,是通過自旋鎖來實(shí)現(xiàn)的,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • Nginx同時(shí)支持Http和Https的配置詳解

    Nginx同時(shí)支持Http和Https的配置詳解

    這篇文章主要介紹了Nginx同時(shí)支持Http和Https的配置詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評(píng)論