跳到主要内容

限流与访问控制

请求限流

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_reqlimit_conn
限制对象请求速率(r/s)并发连接数
典型场景防止 API 刷接口限制下载并发
突发处理burst 队列超限直接拒绝

两者可以组合使用,limit_req 控制频率,limit_conn 控制并发。

相关链接