- 工信部备案号 滇ICP备05000110号-1
- 滇公网安备53011102001527号
- 增值电信业务经营许可证 B1.B2-20181647、滇B1.B2-20190004
- 云南互联网协会理事单位
- 安全联盟认证网站身份V标记
- 域名注册服务机构许可:滇D3-20230001
- 代理域名注册服务机构:新网数码
- CN域名投诉举报处理平台:电话:010-58813000、邮箱:service@cnnic.cn
欢迎来到蓝队云技术小课堂,每天分享一个技术小知识。
在公网服务中,恶意刷接口、突发流量洪峰是常态。单纯依赖后端限流往往代价高、延迟大,前置在 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 是关键参数,直接影响用户体验
· 限流不是为了“挡住所有请求”,而是保护系统稳定
在高并发系统中,限流的本质不是“限制用户”,而是为系统争取恢复空间。合理的限流策略,是系统稳定性的最后一道防线。
蓝队云官网上拥有完善的技术支持库可供参考,大家可自行查阅,更多技术问题,可以直接咨询。同时,蓝队云整理了运维必备的工具包免费分享给大家使用,需要的朋友可以直接咨询。
更多技术知识,蓝队云期待与你一起探索。
售前咨询
售后咨询
备案咨询
二维码

TOP