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

nginx做白名單和限流的完整過(guò)程

 更新時(shí)間:2024年02月19日 09:21:28   作者:SunArmy  
??我們都知道nginx里面是可以用lua腳本做一些稍微復(fù)雜些的邏輯處理的,要使用lua腳本需要編譯lua解釋器,時(shí)間有限我直接用了openresty,它集成了lua和nginx,這篇文章主要介紹了nginx做白名單和限流,需要的朋友可以參考下

在我們生產(chǎn)環(huán)境中使用到了地圖服務(wù),每個(gè)月有免費(fèi)請(qǐng)求次數(shù),近一個(gè)月請(qǐng)求次數(shù)突然暴漲,導(dǎo)致直接開(kāi)啟付費(fèi)模式,一個(gè)月上百刀的花銷著實(shí)難扛,根據(jù)實(shí)際我們的業(yè)務(wù)使用情況,遠(yuǎn)達(dá)不到付費(fèi)標(biāo)準(zhǔn),故考慮做白名單和限流措施,基于以上情況并遇到春節(jié)急需快速處理,所以選擇了最簡(jiǎn)單方便的方式,通過(guò)nginx做限流

? 我們都知道nginx里面是可以用lua腳本做一些稍微復(fù)雜些的邏輯處理的,要使用lua腳本需要編譯lua解釋器,時(shí)間有限我直接用了openresty,它集成了lua和nginx

一、openresty是什么?

OpenResty是一個(gè)基于Nginx的高性能Web平臺(tái),用于方便地搭建能夠處理超高并發(fā)、擴(kuò)展性極高的動(dòng)態(tài) Web 應(yīng)用、Web 服務(wù)和動(dòng)態(tài)網(wǎng)關(guān)。具備下列特點(diǎn):

具備Nginx的完整功能
基于Lua語(yǔ)言進(jìn)行擴(kuò)展,集成了大量精良的 Lua 庫(kù)、第三方模塊,允許使用Lua自定義業(yè)務(wù)邏輯、自定義庫(kù)

二、OpenResty的安裝

1、添加OpenResty倉(cāng)庫(kù)

# 由于公共庫(kù)中找不到openresty,所以需要添加openresty的源倉(cāng)庫(kù)
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo

# 注意,如果上面命令提示不存在,那就先安裝一下
yum install -y yum-utils

2. 安裝OpenResty

# 安裝openresty
yum install -y openresty
# 安裝OpenResty管理工具,幫助我們安裝第三方的Lua模塊
yum install -y openresty-opm

3、目錄結(jié)構(gòu)

? 默認(rèn)安裝在/usr/local/openresty

看到里面有一個(gè)nginx目錄,進(jìn)去可以看到跟我們平常用的nginx是一模一樣的,OpenResty就是在Nginx基礎(chǔ)上集成了一些Lua模塊

到這里我們就安裝好了

4. 啟動(dòng)和運(yùn)行

OpenResty底層是基于Nginx的,查看OpenResty目錄的nginx目錄,結(jié)構(gòu)與windows中安裝的nginx基本一致:

所以這個(gè)里面的nginx和平常的nginx是一樣的

1)nginx配置文件

worker_processes 1;
events {
    worker_connections 1024;
}
http {
    server{
        listen 999;
        server_name  localhost;
        location /mapbox/ {
            access_by_lua_file "/usr/local/openresty/nginx/lua_script/rule.lua";
            proxy_pass https://api.mapbox.com/;
            proxy_ssl_server_name on;
        }
    }
}

2)lua腳本文件(白名單加限流)

通過(guò)兩個(gè)redis的key,map_request_limitation:存放令牌數(shù)量,map_request_white_list:白名單列表;白名單的IP,無(wú)需限流,只有白名單之外的才需要限流

-- 其實(shí)這兩個(gè)值可以從redis取  甚至可以給每個(gè)qrcode設(shè)置單獨(dú)的速率和容積
-- 但如果想監(jiān)聽(tīng)桶的狀態(tài)  需要持續(xù)的請(qǐng)求, 只有每次請(qǐng)求后才重新計(jì)算并更新桶狀態(tài) 否則桶狀態(tài)不變
local tokens_per_second = 0.2  -- 生成速率 /s
local max_tokens = 10  -- 最大溶劑
local current_time = ngx.now()
local path = ngx.var.uri
local redis_key = "map_request_limitation"
local redis_key_white_list = "map_request_white_list"
local client_ip = ngx.var.remote_addr
-- local redis_key = "path:" .. path
-- 連接Redis
local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(1000)
local ok, err = red:connect("127.0.0.1", 6379)
if not ok then
    ngx.log(ngx.ERR, "Redis連接失敗: ", err)
    return ngx.exit(500)
end
-- 權(quán)限校驗(yàn)
local res, err = red:auth("123456")
if not res then
    ngx.say("failed to authenticate: ", err)
    return
end
-- 發(fā)送 Lua 腳本(保證redis原子性操作)
local script = [[
    local redis_key = KEYS[1]
    local redis_white_list_key = KEYS[2]
    local tokens_per_second = tonumber(ARGV[1])
    local max_tokens = tonumber(ARGV[2])
    local current_time = tonumber(ARGV[3])
    local client_ip = ARGV[4]
    -- ip是否存在列表中
    local is_in_whitelist, err = redis.call('sismember', redis_white_list_key, client_ip)
    if is_in_whitelist == 1 then
        return 1
    end
    -- 獲取上次訪問(wèn)時(shí)間和令牌數(shù)量
    local res = redis.call('HMGET', redis_key, 'last_access_time', 'tokens')
    local last_access_time
    local last_tokens
    if res[1] and res[2] then
	last_tokens = res[2]
	last_access_time =  res[1]
    end
    -- 計(jì)算時(shí)間間隔
    local time_passed = current_time - (tonumber(last_access_time) or 0)
    -- 計(jì)算新的令牌數(shù)量
    last_tokens = last_tokens and tonumber(last_tokens) or max_tokens
    local new_tokens = math.min(max_tokens, last_tokens + time_passed * tokens_per_second)
    -- 判斷令牌數(shù)量是否足夠
    if new_tokens >= 1 then
        -- 消耗令牌
        redis.call('HMSET', redis_key, 'last_access_time', current_time, 'tokens', new_tokens - 1)
        return 1
    else
        return 0
    end
]]
-- 執(zhí)行腳本
local result = red:eval(script, 2, redis_key, redis_key_white_list,tokens_per_second, max_tokens,current_time,client_ip)
if result == 1 then
    -- 成功
    ngx.log(ngx.INFO, "成功")
else
    -- 令牌不足
    ngx.status = ngx.HTTP_TOO_MANY_REQUESTS
    ngx.say("OVERLOAD?。。?!",result)
    return ngx.exit(ngx.HTTP_TOO_MANY_REQUESTS)
end
-- 返還redis連接到連接池
local ok, err = red:set_keepalive(10000, 100)
if not ok then
    ngx.log(ngx.ERR, err)
end

啟動(dòng)之后當(dāng)通過(guò)這個(gè)999端口訪問(wèn)之后,我們?cè)趓edis里面可以看到以下兩個(gè)key,白名單可以自行添加,即時(shí)生效

到此這篇關(guān)于nginx做白名單和限流的文章就介紹到這了,更多相關(guān)nginx白名單和限流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Linux中安裝Nginx的正確步驟

    Linux中安裝Nginx的正確步驟

    這篇文章主要給大家介紹了關(guān)于在Linux中安裝Nginx的正確步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Nginx具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Nginx跨域訪問(wèn)場(chǎng)景配置和防盜鏈詳解

    Nginx跨域訪問(wèn)場(chǎng)景配置和防盜鏈詳解

    這篇文章主要介紹了Nginx跨域訪問(wèn)場(chǎng)景配置和防盜鏈詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • nginx平滑重啟和平滑升級(jí)的圖文教程

    nginx平滑重啟和平滑升級(jí)的圖文教程

    如果改變了Nginx的配置文件(nginx.conf),想重啟Nginx,可以發(fā)送系統(tǒng)信號(hào)給Nginx主進(jìn)程的方式來(lái)進(jìn)行,下面這篇文章主要給大家介紹了關(guān)于nginx平滑重啟和平滑升級(jí)的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • Nginx性能調(diào)優(yōu)與深度監(jiān)控的全攻略

    Nginx性能調(diào)優(yōu)與深度監(jiān)控的全攻略

    本文介紹了Nginx的高性能編譯安裝、核心參數(shù)調(diào)優(yōu)、靜態(tài)資源緩存、日志切割、Gzip壓縮等調(diào)優(yōu)方案,并介紹了GoAccess實(shí)時(shí)日志分析和NginxVTS流量監(jiān)控兩大可視化監(jiān)控工具,幫助大家在高并發(fā)場(chǎng)景下穩(wěn)定、高效地運(yùn)行Nginx服務(wù),需要的朋友可以參考下
    2026-04-04
  • nginx.pid打開(kāi)失敗以及失效的解決方案

    nginx.pid打開(kāi)失敗以及失效的解決方案

    在我們平常使用nginx的時(shí)候,經(jīng)常有可能會(huì)發(fā)現(xiàn)我們的pid找不到了,本文就介紹了nginx.pid打開(kāi)失敗以及失效的解決方案,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-12-12
  • 在Debian上安裝最新版Nginx實(shí)踐

    在Debian上安裝最新版Nginx實(shí)踐

    文章介紹了Nginx安裝的官方文檔流程,涵蓋先決條件、密鑰驗(yàn)證、存儲(chǔ)庫(kù)設(shè)置、安裝步驟及常用命令,如啟動(dòng)/停止/重啟服務(wù)、檢查配置、查看版本與日志等,幫助用戶完成Nginx部署與管理
    2025-09-09
  • 使用Nginx、Nginx Plus抵御DDOS攻擊的方法

    使用Nginx、Nginx Plus抵御DDOS攻擊的方法

    DDOS 是一種通過(guò)大流量的請(qǐng)求對(duì)目標(biāo)進(jìn)行轟炸式訪問(wèn),導(dǎo)致提供服務(wù)的服務(wù)器資源耗盡進(jìn)而無(wú)法繼續(xù)提供服務(wù)的攻擊手段。這篇文章主要介紹了使用Nginx、Nginx Plus抵御DDOS攻擊的方法,感興趣的小伙伴們可以參考一下
    2018-06-06
  • nginx界面管理工具之nginxWebUI?搭建與使用方法

    nginx界面管理工具之nginxWebUI?搭建與使用方法

    本文主要介紹了nginx界面管理工具之nginxWebUI?搭建與使用方法
    2024-08-08
  • nginx http響應(yīng)限速的具體實(shí)現(xiàn)

    nginx http響應(yīng)限速的具體實(shí)現(xiàn)

    本文主要介紹了nginx http響應(yīng)限速的具體實(shí)現(xiàn),可以使用limite_rate和limit_rate_after來(lái)限制HTTP響應(yīng)的速度,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • Nginx服務(wù)器的location指令匹配規(guī)則詳解

    Nginx服務(wù)器的location指令匹配規(guī)則詳解

    這篇文章主要介紹了Nginx服務(wù)器的location指令匹配規(guī)則,文中介紹了一種動(dòng)靜態(tài)地址分離的方法示例,需要的朋友可以參考下
    2015-12-12

最新評(píng)論

信丰县| 黄大仙区| 梅州市| 胶州市| 通山县| 三亚市| 桦南县| 镇沅| 梁河县| 临洮县| 防城港市| 西乌珠穆沁旗| 屏东市| 新田县| 徐汇区| 都江堰市| 石景山区| 祁东县| 台中县| 肥西县| 新平| 嘉鱼县| 承德县| 临颍县| 富民县| 山西省| 平度市| 东台市| 璧山县| 饶河县| 阳信县| 双牌县| 鹤峰县| 临江市| 丘北县| 林周县| 伊川县| 铁岭市| 关岭| 开原市| 凤山县|