最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

防刷的概念:

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

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

限流的概念:

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

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

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

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

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

下面放出代碼,請各位大拿指正。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
    --釋放連接(連接池實現(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
    --釋放連接(連接池實現(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)前請求的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防刷和限流的實現(xiàn)的文章就介紹到這了,更多相關(guān)nginx lua redis防刷和限流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Nginx會話保持的具體實現(xiàn)

    Nginx會話保持的具體實現(xiàn)

    會話保持是指在會話持續(xù)或會話完成一個任務(wù)或一個事務(wù)的時間段內(nèi),將客戶端請求引導(dǎo)至同一個后端Web服務(wù)器或應(yīng)用服務(wù)器,本文主要介紹了Nginx會話保持的具體實現(xiàn),感興趣的可以了解一下
    2024-07-07
  • Nginx反向代理轉(zhuǎn)發(fā)tomcat的實現(xiàn)

    Nginx反向代理轉(zhuǎn)發(fā)tomcat的實現(xiàn)

    本文主要介紹了Nginx反向代理轉(zhuǎn)發(fā)tomcat的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Nginx內(nèi)網(wǎng)環(huán)境開啟https雙協(xié)議的實現(xiàn)

    Nginx內(nèi)網(wǎng)環(huán)境開啟https雙協(xié)議的實現(xiàn)

    本文主要介紹了Nginx內(nèi)網(wǎng)環(huán)境開啟https雙協(xié)議,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • 詳解Nginx服務(wù)器的nginx-http-footer-filter模塊配置

    詳解Nginx服務(wù)器的nginx-http-footer-filter模塊配置

    這篇文章主要介紹了Nginx服務(wù)器的nginx-http-footer-filter模塊配置,nginx-http-footer-filter用作在請求的頁面底部插入代碼,需要的朋友可以參考下
    2016-01-01
  • 基于Nginx 反向代理獲取真實IP的問題詳解

    基于Nginx 反向代理獲取真實IP的問題詳解

    下面小編就為大家分享一篇基于Nginx 反向代理獲取真實IP的問題詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • 分享最新版 nginx內(nèi)置變量 大全

    分享最新版 nginx內(nèi)置變量 大全

    在配置基于nginx服務(wù)器的網(wǎng)站時,必然會用到 nginx內(nèi)置變量 ,下面筆者將它整理成列表,把最新版本的變量列出來,以方便做配置時查詢
    2016-04-04
  • Linux下安裝配置nginx詳解

    Linux下安裝配置nginx詳解

    本篇文章主要介紹了Linux下安裝配置nginx,介紹了在Linux系統(tǒng)下安裝配置Nginx的詳細(xì)過程,具有一定的參考價值,有興趣的可以了解一下。
    2017-01-01
  • 深入探究Nginx體系化之虛擬主機(jī)分類及配置實現(xiàn)

    深入探究Nginx體系化之虛擬主機(jī)分類及配置實現(xiàn)

    Nginx,這款備受推崇的高性能 Web 服務(wù)器,以其強(qiáng)大的性能和靈活的配置而廣受歡迎,在實際應(yīng)用中,虛擬主機(jī)是一項重要的功能,允許我們在單個服務(wù)器上托管多個網(wǎng)站,本文將深入探討 Nginx 虛擬主機(jī)的分類和配置實現(xiàn),幫助您構(gòu)建一個高效多站點托管平臺
    2023-08-08
  • 修改配置解決Nginx服務(wù)器中常見的上傳與連接錯誤

    修改配置解決Nginx服務(wù)器中常見的上傳與連接錯誤

    這篇文章主要介紹了修改配置解決Nginx服務(wù)器中常見的上傳與連接錯誤的方法,分別針對Nginx的413錯誤與111錯誤,需要的朋友可以參考下
    2016-01-01
  • 利用nginx + fastcgi實現(xiàn)圖片識別服務(wù)器

    利用nginx + fastcgi實現(xiàn)圖片識別服務(wù)器

    這篇文章主要給大家介紹了關(guān)于如何利用nginx + fastcgi實現(xiàn)圖片識別服務(wù)器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評論

封丘县| 天水市| 疏附县| 墨竹工卡县| 晋江市| 团风县| 磐安县| 博爱县| 东台市| 博野县| 正安县| 九江市| 全椒县| 洛川县| 吴旗县| 江都市| 苗栗县| 嵊州市| 南华县| 武鸣县| 齐河县| 若羌县| 辽宁省| 炎陵县| 广西| 利津县| 维西| 桑植县| 荔波县| 体育| 乌兰浩特市| 会宁县| 泽州县| 丰县| 石门县| 威远县| 平泉县| 历史| 安泽县| 土默特右旗| 剑阁县|