限流与访问控制
请求限流
limit_req 限制请求速率
http {
# 定义限流区域:按客户端 IP 限制,每秒 10 个请求
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
server {
location /api/ {
# burst=20: 突发允许 20 个排队请求
# nodelay: 排队请求立即处理而非延迟
limit_req zone=api_limit burst=20 nodelay;
limit_req_status 429;
proxy_pass http://backend;
}
}
}
警告
rate=10r/s 表示平均每 100ms 处理 1 个请求。若 100ms 内来了 2 个请求,第 2 个会被放入 burst 队列或拒绝。
连接数限制
http {
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
location /download/ {
limit_conn conn_limit 5; # 每个 IP 最多 5 个并发连接
limit_rate 500k; # 每个连接限速 500KB/s
}
}
}
IP 访问控制
# 白名单/黑名单
location /admin/ {
allow 10.0.0.0/8;
allow 192.168.1.0/24;
deny all;
}
# geo 模块实现 IP 分组
geo $blocked {
default 0;
10.0.0.0/8 0; # 内网放行
1.2.3.4/32 1; # 封禁特定 IP
}
server {
if ($blocked) {
return 403;
}
}
常见面试问题
Q1: limit_req 和 limit_conn 的区别?
答案:
| 维度 | limit_req | limit_conn |
|---|---|---|
| 限制对象 | 请求速率(r/s) | 并发连接数 |
| 典型场景 | 防止 API 刷接口 | 限制下载并发 |
| 突发处理 | burst 队列 | 超限直接拒绝 |
两者可以组合使用,limit_req 控制频率,limit_conn 控制并发。