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

Nginx實(shí)現(xiàn)動(dòng)態(tài)攔截非法訪問ip的方法

 更新時(shí)間:2025年02月27日 11:00:28   作者:風(fēng)雨_83  
最近在訪問時(shí)不時(shí)會(huì)被暴力刷量,爬蟲和惡意攻擊導(dǎo)致數(shù)據(jù)庫,服務(wù)等癱瘓,所以本文介紹了在Nginx上實(shí)現(xiàn)一個(gè)動(dòng)態(tài)攔截IP的方法,具體是當(dāng)某個(gè)IP在1分鐘內(nèi)訪問超過60次時(shí),將其加入Redis并攔截,攔截時(shí)間默認(rèn)1天,需要的朋友可以參考下

 背景:訪問時(shí)不時(shí)會(huì)被暴力刷量,爬蟲和惡意攻擊導(dǎo)致數(shù)據(jù)庫,服務(wù)等癱瘓

需求:在Nginx上實(shí)現(xiàn)一個(gè)動(dòng)態(tài)攔截IP的方法,具體是當(dāng)某個(gè)IP在1分鐘內(nèi)訪問超過60次時(shí),將其加入Redis并攔截,攔截時(shí)間默認(rèn)1天。

技術(shù)選型:使用Nginx+Lua+Redis的方法。這種方案通過Lua腳本在Nginx處理請求時(shí)檢查Redis中的黑名單,同時(shí)統(tǒng)計(jì)訪問頻率,超過閾值就封禁。這應(yīng)該符合用戶的需求。

需要結(jié)合Lua腳本和Redis的計(jì)數(shù)功能。安裝OpenResty,配置Nginx的Lua模塊,編寫Lua腳本統(tǒng)計(jì)訪問次數(shù),使用Redis存儲(chǔ)和過期鍵,以及設(shè)置攔截邏輯。連接池的使用,避免頻繁連接Redis影響性能。

一、環(huán)境準(zhǔn)備

  • 安裝OpenResty

OpenResty集成了Nginx和Lua模塊,支持直接運(yùn)行Lua腳本:

# Ubuntu/Debian
sudo apt-get install openresty
# CentOS
yum install openresty
  • 安裝Redis服務(wù)
sudo apt-get install redis-server  # Debian系
sudo yum install redis             # RedHat系

二、Nginx配置

  • 主配置文件(nginx.conf)http塊中添加共享內(nèi)存和Lua腳本路徑:

http {
    lua_package_path "/usr/local/openresty/lualib/?.lua;;";
    lua_shared_dict ip_limit 10m;  # 共享內(nèi)存區(qū)

    server {
        listen 80;
        server_name _;

        location / {
            access_by_lua_file /usr/local/lua/ip_block.lua;  # 核心攔截腳本
            root /var/www/html;
        }
    }
}

三、Lua腳本實(shí)現(xiàn)動(dòng)態(tài)攔截

  • 腳本路徑創(chuàng)建Lua腳本:/usr/local/lua/ip_block.lua

  • 腳本內(nèi)容

local redis = require "resty.redis"
local red = redis:new()

-- Redis連接參數(shù)
local redis_host = "127.0.0.1"
local redis_port = 6379
local redis_timeout = 1000  -- 毫秒
local redis_auth = nil       -- 無密碼留空

-- 攔截參數(shù)
local block_time = 86400     -- 封禁時(shí)間(1天)
local time_window = 60       -- 統(tǒng)計(jì)窗口(1分鐘)
local max_requests = 60     -- 最大請求數(shù)

-- 獲取客戶端IP
local function get_client_ip()
    local headers = ngx.req.get_headers()
    return headers["X-Real-IP"] or headers["x_forwarded_for"] or ngx.var.remote_addr
end

-- 連接Redis
local function connect_redis()
    red:set_timeout(redis_timeout)
    local ok, err = red:connect(redis_host, redis_port)
    if not ok then
        ngx.log(ngx.ERR, "Redis連接失敗: ", err)
        return nil
    end
    if redis_auth then
        local ok, err = red:auth(redis_auth)
        if not ok then ngx.log(ngx.ERR, "Redis認(rèn)證失敗: ", err) end
    end
    return ok
end

-- 主邏輯
local client_ip = get_client_ip()
local counter_key = "limit:count:" .. client_ip
local block_key = "limit:block:" .. client_ip

-- 檢查是否已封禁
local is_blocked, err = red:get(block_key)
if tonumber(is_blocked) == 1 then
    ngx.exit(ngx.HTTP_FORBIDDEN)  -- 直接返回403
end

-- 統(tǒng)計(jì)請求次數(shù)
connect_redis()
local current_count = red:incr(counter_key)
if current_count == 1 then
    red:expire(counter_key, time_window)  -- 首次設(shè)置過期時(shí)間
end

-- 觸發(fā)封禁條件
if current_count > max_requests then
    red:setex(block_key, block_time, 1)   -- 封禁并設(shè)置1天過期
    red:del(counter_key)                  -- 刪除計(jì)數(shù)器
    ngx.exit(ngx.HTTP_FORBIDDEN)
end

-- 釋放Redis連接
red:set_keepalive(10000, 100)

四、性能優(yōu)化

  • Redis連接池通過set_keepalive復(fù)用連接,避免頻繁建立TCP連接
  • 共享內(nèi)存緩存使用lua_shared_dict緩存高頻訪問IP,減少Redis查詢壓力
  • 異步日志記錄封禁操作異步寫入日志文件,避免阻塞請求處理:

ngx.timer.at(0, function()
    local log_msg = string.format("%s - IP %s blocked at %s", 
        ngx.var.host, client_ip, ngx.localtime())
    local log_file = io.open("/var/log/nginx/blocked_ips.log", "a")
    log_file:write(log_msg, "\n")
    log_file:close()
end)

五、驗(yàn)證與測試

  • 手動(dòng)觸發(fā)封禁
# 模擬高頻請求
ab -n 100 -c 10 http://your-domain.com/
# 檢查Redis
redis-cli keys "limit:block:*"
  • 自動(dòng)解封驗(yàn)證

等待24小時(shí)后檢查封禁IP是否自動(dòng)刪除:

redis-cli ttl "limit:block:1.2.3.4"  # 返回剩余秒數(shù)

六、擴(kuò)展方案

  • 分布式封禁
    在多臺(tái)Nginx服務(wù)器間共享Redis黑名單,實(shí)現(xiàn)集群級(jí)攔截
  • 可視化監(jiān)控
    通過Grafana+Prometheus展示實(shí)時(shí)攔截?cái)?shù)據(jù):

# 采集Redis指標(biāo)
prometheus-redis-exporter --redis.address=localhost:6379
  • 動(dòng)態(tài)調(diào)整閾值
    通過Redis Hash存儲(chǔ)不同路徑的攔截規(guī)則:
local rule_key = "limit:rule:" .. ngx.var.uri
local custom_rule = red:hget(rule_key, "max_requests")

引用說明

  • 核心攔截邏輯參考了Nginx+Lua+Redis的經(jīng)典架構(gòu)設(shè)計(jì)
  • Redis鍵過期機(jī)制確保自動(dòng)解封
  • 性能優(yōu)化方案借鑒了OpenResty最佳實(shí)踐

以上就是Nginx實(shí)現(xiàn)動(dòng)態(tài)攔截非法訪問ip的方法的詳細(xì)內(nèi)容,更多關(guān)于Nginx動(dòng)態(tài)攔截IP的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Nginx如何配置加密證書訪問實(shí)現(xiàn)

    Nginx如何配置加密證書訪問實(shí)現(xiàn)

    本文主要介紹了Nginx如何配置加密證書訪問實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 詳解如何通過nginx進(jìn)行服務(wù)的負(fù)載均衡

    詳解如何通過nginx進(jìn)行服務(wù)的負(fù)載均衡

    負(fù)載均衡器可以將用戶請求根據(jù)對應(yīng)的負(fù)載均衡算法分發(fā)到應(yīng)用集群中的一臺(tái)服務(wù)器進(jìn)行處理,本文主要為大家詳細(xì)介紹了如何通過nginx進(jìn)行服務(wù)的負(fù)載均衡,需要的可以參考下
    2023-11-11
  • nginx中url地址重寫的實(shí)現(xiàn)

    nginx中url地址重寫的實(shí)現(xiàn)

    本文主要介紹了nginx中url地址重寫的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • nginx配置域名(ssl和非ssl形式)的實(shí)現(xiàn)示例

    nginx配置域名(ssl和非ssl形式)的實(shí)現(xiàn)示例

    本文主要介紹了nginx配置域名(ssl和非ssl形式)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-07-07
  • Nginx 反向代理并緩存及緩存清除的方法

    Nginx 反向代理并緩存及緩存清除的方法

    本篇文章主要介紹了Nginx 反向代理并緩存及緩存清除的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • 在Linux中查看Apache或Nginx服務(wù)狀態(tài)的詳細(xì)步驟

    在Linux中查看Apache或Nginx服務(wù)狀態(tài)的詳細(xì)步驟

    在Linux中,查看Apache或Nginx服務(wù)的狀態(tài)通常涉及到使用系統(tǒng)管理工具或特定于這些Web服務(wù)器的命令,以下是如何查看Apache和Nginx服務(wù)狀態(tài)的詳細(xì)步驟,需要的朋友可以參考下
    2024-03-03
  • Apache和Nginx的優(yōu)缺點(diǎn)詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Apache和Nginx的優(yōu)缺點(diǎn)詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Nginx和Apache一樣,都是HTTP服務(wù)器軟件,在功能實(shí)現(xiàn)上都采用模塊化結(jié)構(gòu)設(shè)計(jì),都支持通用的語言接口。下面通過本文給大家分享Apache和Nginx比較 功能對比,感興趣的朋友參考下吧
    2017-08-08
  • nginx如何配置x-forwarded-for頭部

    nginx如何配置x-forwarded-for頭部

    這篇文章主要介紹了nginx如何配置x-forwarded-for頭部,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Nginx?error_page自定義錯(cuò)誤頁面設(shè)置過程

    Nginx?error_page自定義錯(cuò)誤頁面設(shè)置過程

    這篇文章主要介紹了Nginx?error_page自定義錯(cuò)誤頁面設(shè)置過程,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Nginx 搭建域名訪問環(huán)境的詳細(xì)過程

    Nginx 搭建域名訪問環(huán)境的詳細(xì)過程

    這篇文章主要介紹了Nginx 搭建域名訪問環(huán)境的詳細(xì)過程,通過示例代碼講解了Nginx 搭建轉(zhuǎn)發(fā)網(wǎng)關(guān)進(jìn)行負(fù)載均衡的相關(guān)操作,感興趣的朋友跟隨小編一起看看吧
    2024-06-06

最新評(píng)論

成都市| 壤塘县| 红桥区| 百色市| 新河县| 高淳县| 濉溪县| 黄冈市| 静宁县| 抚松县| 寿光市| 宁化县| 齐河县| 林周县| 剑阁县| 榆中县| 桐梓县| 寿光市| 宁蒗| 兖州市| 枝江市| 乐清市| 特克斯县| 伊宁市| 道孚县| 七台河市| 陵川县| 班戈县| 方正县| 德格县| 象山县| 上林县| 鄂尔多斯市| 当雄县| 鸡东县| 禄丰县| 建德市| 麻栗坡县| 饶阳县| 五指山市| 兴隆县|