Nginx 限流与防刷

2026-04-22 16:41:21 1691

Nginx 限流与防刷

欢迎来到蓝队云技术小课堂,每天分享一个技术小知识。

 

在公网服务中,恶意刷接口、突发流量洪峰是常态。单纯依赖后端限流往往代价高、延迟大,前置在 Nginx 做限流是更高效的方案。

核心模块:

· limit_req:基于请求速率(QPS)

· limit_conn:基于并发连接数




先看一个典型限流配置:

http {

    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;

 

    server {

        location /api/ {

            limit_req zone=req_limit burst=20 nodelay;

            proxy_pass http://www.landui.com;

        }

    }

}

关键点解析:

· 10m:共享内存区,大约可存 16 万个 IP 状态

· rate=10r/s:单 IP 每秒 10 个请求

· burst=20:允许瞬时突发 20 个请求

nodelay 表示不排队,超出速率直接放行 burst 内请求,否则立即拒绝。

如果去掉:

limit_req zone=req_limit burst=20;

则会进入“漏桶排队模式”,请求会被延迟处理,更适合对用户体验要求高的接口。




返回状态码默认是 503,可以自定义:

limit_req_status 429;

更符合语义(Too Many Requests)。




很多场景只按 IP 限流是不够的,例如:

· NAT 环境(多个用户共享 IP)

· CDN 回源(源站看到的是 CDN IP)

可以基于 Header 限流:

limit_req_zone $http_x_forwarded_for zone=req_limit:10m rate=20r/s;

或者更精细:

map $http_authorization $user_token {

    default $binary_remote_addr;

    "~.+": $http_authorization;

}

 

limit_req_zone $user_token zone=req_limit:10m rate=30r/s;

实现“按用户维度限流”。




再看连接数限制:

http {

    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

 

    server {

        location / {

            limit_conn conn_limit 20;

        }

    }

}

表示每个 IP 最大 20 个并发连接。

适用于:

· 防止爬虫占满连接

· 防止慢连接攻击(Slowloris)




限流组合策略(推荐生产使用):

limit_req_zone $binary_remote_addr zone=req_limit:10m rate=50r/s;

limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

 

server {

    location /api/ {

        limit_req zone=req_limit burst=100 nodelay;

        limit_conn conn_limit 50;

 

        proxy_pass http://www.landui.com;

    }

}

实现:

· 控制请求速率

· 控制连接占用

双重保护。




针对登录、验证码接口,需要更严格策略:

location /login {

    limit_req zone=req_limit burst=5 nodelay;

}

甚至可以单独定义 zone:

limit_req_zone $binary_remote_addr zone=login_limit:5m rate=2r/s;

防止暴力破解。




另一个进阶技巧:白名单放行

geo $whitelist {

    default 0;

    192.168.1.0/24 1;

}

 

map $whitelist $limit_key {

    1 "";

    0 $binary_remote_addr;

}

 

limit_req_zone $limit_key zone=req_limit:10m rate=20r/s;

key 为空时,不参与限流,实现内网或可信 IP 放行。




日志分析同样关键:

log_format limit '$remote_addr $status $request_time $upstream_response_time';

通过分析 429 请求比例,可以判断限流是否合理。




排查是否触发限流:

grep 429 access.log | wc -l

或者观察错误日志:

grep "limiting requests" error.log




核心经验:

· 限流策略必须分接口设计,而不是“一刀切”

· 登录、支付等敏感接口要更严格

· NAT/CDN 场景要避免误伤真实用户

· burst 是关键参数,直接影响用户体验

· 限流不是为了“挡住所有请求”,而是保护系统稳定

在高并发系统中,限流的本质不是“限制用户”,而是为系统争取恢复空间。合理的限流策略,是系统稳定性的最后一道防线。

蓝队云官网上拥有完善的技术支持库可供参考,大家可自行查阅,更多技术问题,可以直接咨询。同时,蓝队云整理了运维必备的工具包免费分享给大家使用,需要的朋友可以直接咨询。

更多技术知识,蓝队云期待与你一起探索。

 

 


提交成功!非常感谢您的反馈,我们会继续努力做到更好!

这条文档是否有帮助解决问题?

非常抱歉未能帮助到您。为了给您提供更好的服务,我们很需要您进一步的反馈信息:

在文档使用中是否遇到以下问题: