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

Nginx 限流防刷完全指南從原理到生產實戰(zhàn)指南

 更新時間:2026年05月06日 10:11:09   作者:0xDevNull  
本文給大家介紹Nginx限流防刷完全指南從原理到生產實戰(zhàn)指南,本文結合實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧

一、核心原理

Nginx 提供兩個核心模塊實現(xiàn)限流,各司其職:

模塊功能算法/機制適用場景
ngx_http_limit_req_module限制單個 IP 在單位時間內的請求數(shù)量漏桶算法防刷接口、控制 QPS
ngx_http_limit_conn_module限制單個 IP 同時建立的連接數(shù)量連接計數(shù)防 CC 攻擊、防連接耗盡

漏桶算法:以固定速率處理請求,超出速率的請求排隊或被拒絕。burst 定義桶容量,nodelay 決定是否延遲處理。

二、環(huán)境準備

系統(tǒng)要求:Ubuntu 20.04 / CentOS 7+,Nginx ≥ 1.1.8(當前穩(wěn)定版均支持)。

# Ubuntu
sudo apt update && sudo apt install nginx -y
# CentOS
sudo yum install epel-release -y && sudo yum install nginx -y

確認模塊已編譯

nginx -V 2>&1 | grep -o with-http_limit_req_module
nginx -V 2>&1 | grep -o with-http_limit_conn_module

三、基礎配置:限制單 IP 請求速率

3.1 定義限流區(qū)域(http 塊)

http {
    # 按客戶端IP限流,10MB共享內存(約存16萬IP),每秒10個請求
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
    # 登錄接口專用:更嚴格的限制
    limit_req_zone $binary_remote_addr zone=login_limit:5m rate=2r/s;
    # 并發(fā)連接限制
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
}

為什么用 $binary_remote_addr 而非 $remote_addr? 二進制格式更省內存,推薦生產環(huán)境使用。

3.2 應用限流規(guī)則(server/location 塊)

server {
    listen 80;
    server_name api.example.com;
    location /api/ {
        # 應用限流:允許突發(fā)20個請求,nodelay立即處理突發(fā),超出部分直接拒絕
        limit_req zone=api_limit burst=20 nodelay;
        # 自定義限流返回狀態(tài)碼(429比默認503更符合語義)
        limit_req_status 429;
        proxy_pass http://backend_server;
    }
    location /api/login {
        # 登錄接口使用更嚴格的限流
        limit_req zone=login_limit burst=5 nodelay;
        limit_req_status 429;
        proxy_pass http://auth_service;
    }
}

參數(shù)深度解析

  • rate=10r/s:這是長期的平均速率,也可寫 30r/m(每分鐘30次)
  • burst=20:當請求瞬間超過 10r/s 時,多出來的請求會先進入“突發(fā)桶”排隊。
  • nodelay:加上這個參數(shù),突發(fā)桶里的 20 個請求會立即被處理,而不是按每秒 10 個的速度排隊。如果不加 nodelay,請求會被延遲處理,適合對實時性要求不高的場景。

四、組合防護:速率 + 連接雙限制

生產環(huán)境推薦同時啟用雙重保護:

http {
    # 速率限制區(qū)
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=50r/s;
    # 連接數(shù)限制區(qū)
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
    server {
        location /api/ {
            proxy_pass http://backend_server;
            # 速率限制:每秒50個,允許突發(fā)100個
            limit_req zone=api_limit burst=100 nodelay;
            # 連接數(shù)限制:單個IP最多同時保持50個連接
            limit_conn conn_limit 50;
            limit_conn_status 429;
        }
    }
}

五、精細化限流策略

5.1 按接口路徑限流(防掃描)

防止掃描器遍歷 API,對每個 URI 單獨計數(shù):

http {
    # $uri 不包含查詢參數(shù),如需區(qū)分參數(shù)用 $request_uri
    limit_req_zone $uri zone=per_uri:10m rate=10r/s;
}
server {
    location / {
        limit_req zone=per_uri burst=20 nodelay;
        limit_req_status 429;
        proxy_pass http://backend;
    }
}

5.2 動態(tài)分級限流(VIP用戶)

通過 map 實現(xiàn)不同用戶等級的差異化限流:

http {
    # 從請求頭獲取用戶等級(需后端傳遞)
    map $http_x_user_level $rate_limit {
        "vip"     "100r/s";
        "normal"  "10r/s";
        default   "2r/s";
    }
    limit_req_zone $binary_remote_addr zone=dynamic:10m rate=$rate_limit;
    server {
        location /api/ {
            limit_req zone=dynamic burst=5 nodelay;
            proxy_pass http://backend;
        }
    }
}

注:rate 使用變量需 Nginx 1.15.10+。

5.3 下載限速 + 并發(fā)限制

location /download/ {
    limit_conn conn_limit 2;      # 單IP最多2個并發(fā)下載
    limit_rate 500k;              # 單連接限速500KB/s
    alias /data/files/;
}

5.4針對敏感接口

登錄和驗證碼接口是暴力破解的重災區(qū),需要設置更嚴格的規(guī)則:

http {
    # 專門為登錄接口定義一個更嚴格的限流區(qū):每秒僅允許 2 次請求
    limit_req_zone $binary_remote_addr zone=login_limit:5m rate=2r/s;
    server {
        # 普通接口
        location /api/ {
            limit_req zone=api_limit burst=50 nodelay;
            proxy_pass http://backend_server;
        }
        # 登錄接口(單獨配置)
        location /api/login {
            limit_req zone=login_limit burst=5 nodelay;
            limit_req_status 429;
            proxy_pass http://backend_server;
        }
    }
}

六、白名單與動態(tài)控制

6.1 白名單配置(geo + map 技巧)

Nginx 的 limit_req 不能直接通過 if 開關,需用 zone 切換實現(xiàn)"跳過限制":

http {
    # 定義白名單
    geo $whitelist {
        default 0;
        203.0.113.0/24 1;    # 公司出口IP段
        192.168.1.100 1;
    }
    # 正常限流區(qū)
    limit_req_zone $binary_remote_addr zone=global:10m rate=20r/s;
    # 虛擬高速區(qū)(白名單IP使用,實際不限流)
    limit_req_zone $binary_remote_addr zone=dummy:1m rate=10000r/s;
    # 根據(jù)白名單動態(tài)選擇zone
    map $whitelist $limit_zone {
        1 "dummy";
        0 "global";
    }
    # 登錄專用區(qū)
    limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
    map $whitelist $login_zone {
        1 "dummy";
        0 "login";
    }
    # 并發(fā)限制
    limit_conn_zone $binary_remote_addr zone=connip:10m;
    # 日志格式增加限流信息
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" limit_req_status=$limit_req_status';
    server {
        listen 80;
        server_name api.example.com;
        access_log /var/log/nginx/api_access.log main;
        limit_req_status 429;
        limit_conn_status 429;
        # 全局接口
        location / {
            limit_req zone=$limit_zone burst=30 nodelay;
            limit_conn connip 20;
            proxy_pass http://backend;
        }
        # 登錄接口
        location /api/login {
            limit_req zone=$login_zone burst=3 nodelay;
            proxy_pass http://auth;
        }
        # 下載接口
        location /download/ {
            limit_conn connip 2;
            limit_rate 500k;
            alias /data/downloads/;
        }
    }
}

七、CDN / 反向代理場景

如果 Nginx 前有 CDN 或 NAT,需獲取真實客戶端 IP:

# 配置真實IP來源
set_real_ip_from 10.0.0.0/8;      # CDN節(jié)點網(wǎng)段
set_real_ip_from 172.16.0.0/12;
real_ip_header X-Forwarded-For;
# 使用真實IP限流
limit_req_zone $http_x_forwarded_for zone=cdn_limit:10m rate=20r/s;

八、友好的限流提示

自定義 429 錯誤頁面,返回 JSON:

server {
    # 自定義限流錯誤
    error_page 429 = @rate_limited;
    location @rate_limited {
        default_type application/json;
        return 429 '{"code": 429, "msg": "請求過于頻繁,請稍后再試"}';
    }
    location /api/ {
        limit_req zone=api_limit burst=20 nodelay;
        limit_req_status 429;
        proxy_pass http://backend;
    }
}

九、測試與驗證

9.1 ApacheBench (ab)

# 安裝
sudo apt install apache2-utils   # Ubuntu
sudo yum install httpd-tools      # CentOS
# 發(fā)送100個請求,并發(fā)10個
ab -n 100 -c 10 http://api.example.com/api/test

9.2 curl 循環(huán)測試

for i in {1..100}; do
    http_code=$(curl -s -o /dev/null -w "%{http_code}" http://api.example.com/api/test)
    echo "Request $i: $http_code"
done

9.3 日志排查

# 實時查看限流日志
tail -f /var/log/nginx/error.log | grep "limiting requests"
# 統(tǒng)計429狀態(tài)碼數(shù)量
grep " 429 " /var/log/nginx/access.log | wc -l
# 查看限流狀態(tài)(若配置了日志格式)
tail -f /var/log/nginx/api_access.log

十、進階優(yōu)化

10.1 調整日志級別

limit_req_log_level error;    # 默認warn,可選info/notice/warn/error
limit_conn_log_level error;

10.2 結合 Fail2ban 自動封禁

配置 Fail2ban 監(jiān)控 429 日志,超限直接 iptables 封禁:

# /etc/fail2ban/jail.local
[nginx-req-limit]
enabled  = true
filter   = nginx-req-limit
action   = iptables-multiport[name=ReqLimit, port="http,https"]
logpath  = /var/log/nginx/api_access.log
maxretry = 10
findtime = 60
bantime  = 600
# /etc/fail2ban/filter.d/nginx-req-limit.conf
[Definition]
failregex = ^<HOST> -.* 429
ignoreregex =

10.3 平滑重載配置

sudo nginx -t && sudo systemctl reload nginx

十一、完整生產配置示例

http {
    # ========== Zone 定義 ==========
    limit_req_zone $binary_remote_addr zone=global:20m rate=20r/s;
    limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
    limit_req_zone $binary_remote_addr zone=dummy:1m rate=10000r/s;
    limit_conn_zone $binary_remote_addr zone=connip:10m;
    # ========== 白名單 ==========
    geo $whitelist {
        default 0;
        203.0.113.0/24 1;
    }
    map $whitelist $limit_zone {
        1 "dummy";
        0 "global";
    }
    map $whitelist $login_zone {
        1 "dummy";
        0 "login";
    }
    # ========== 日志 ==========
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" limit_req_status=$limit_req_status';
    server {
        listen 80;
        server_name api.example.com;
        access_log /var/log/nginx/api_access.log main;
        limit_req_status 429;
        limit_conn_status 429;
        # 全局API
        location /api/ {
            limit_req zone=$limit_zone burst=30 nodelay;
            limit_conn connip 20;
            proxy_pass http://backend;
        }
        # 登錄(更嚴格)
        location /api/login {
            limit_req zone=$login_zone burst=3 nodelay;
            proxy_pass http://auth;
        }
        # 下載
        location /download/ {
            limit_conn connip 2;
            limit_rate 500k;
            alias /data/downloads/;
        }
        # 限流提示
        error_page 429 = @rate_limited;
        location @rate_limited {
            default_type application/json;
            return 429 '{"code":429,"msg":"請求過于頻繁,請稍后再試"}';
        }
    }
}

十二、關鍵注意事項

要點說明
共享內存大小10MB 約存16萬IP,日活大需調大
burst + nodelay不加 nodelay 會延遲排隊,加則直接丟棄超限請求
CDN/代理必須配置 real_ip_header 獲取真實IP,否則誤傷
閾值調優(yōu)根據(jù)后端實際抗壓能力和正常用戶習慣動態(tài)調整
限流非目的本質是為后端爭取恢復空間,需配合監(jiān)控和自動封禁

通過合理組合 limit_reqlimit_conn,配合白名單、分級限流、友好提示和 Fail2ban 聯(lián)動,可以為 API 構建一道低成本、高效率的防護墻。

到此這篇關于Nginx 限流防刷完全指南從原理到生產實戰(zhàn)指南的文章就介紹到這了,更多相關nginx 限流防刷內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

南开区| 凤庆县| 永登县| 云安县| 驻马店市| 万安县| 十堰市| 乌兰浩特市| 淳化县| 古丈县| 东丰县| 民丰县| 科技| 綦江县| 蓬安县| 奈曼旗| 四川省| 顺义区| 普兰店市| 眉山市| 平凉市| 德化县| 威远县| 思南县| 长阳| 寿光市| 林西县| 太湖县| 襄城县| 阿图什市| 永川市| 永靖县| 冀州市| 时尚| 山东| 筠连县| 三门峡市| 郎溪县| 望都县| 贡觉县| 柳州市|