Nginx 限流
在高并发场景下,Nginx 限流是一种常见的 流量控制手段。 它可以有效防止 突发流量冲击 或 恶意攻击,保护后端服务的稳定性。
Nginx 提供了 两种限流机制:
- 连接数限流:限制单个 IP 的并发连接数
- 请求速率限流:限制请求的速率(QPS)
✨ 限流方式
1. 请求速率限流(limit_req)
基于 令牌桶算法,限制单位时间的请求数。
配置示例
nginx
http {
# 定义一个限流区域 (10MB 内存,可存储约16万个IP状态)
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=5r/s;
server {
location /api/ {
# 应用限流规则
limit_req zone=req_limit burst=10 nodelay;
}
}
}参数说明
limit_req_zone key zone=name:size rate=ratekey:作为限流依据的变量(如$binary_remote_addr代表客户端 IP)zone=name:size:定义共享内存区域,用于存储状态rate=rate:请求速率,例如5r/s表示每秒 5 个请求
limit_req zone=name [burst=n] [nodelay]burst:允许的突发请求数nodelay:突发请求立即执行(不进入排队)
示例效果
- 单个 IP 每秒最多 5 个请求
- 突发请求最多允许 10 个
2. 并发连接数限流(limit_conn)
限制单个 IP 的并发连接数,避免恶意用户长时间占用连接。
配置示例
nginx
http {
# 定义一个限流区域
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
location /download/ {
# 单个 IP 最多保持 2 个并发连接
limit_conn conn_limit 2;
}
}
}参数说明
limit_conn_zone key zone=name:size定义共享内存区域,按 key(如 IP)统计连接数limit_conn zone_name number限制某个 key 的最大并发连接数
3. 配合使用示例
综合使用请求限流和连接数限流:
nginx
http {
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
location / {
limit_req zone=req_limit burst=20 nodelay;
limit_conn conn_limit 5;
}
}
}- 单个 IP 每秒请求数限制为 10(突发最多 20)
- 单个 IP 并发连接数限制为 5
🚦 应用场景
防止接口被刷
- 限制 API 请求速率,防止恶意爬虫或攻击
防止下载资源滥用
- 限制并发连接数,避免单个用户占用过多带宽
保护后端服务
- Nginx 在前端限流,避免数据库、应用服务器被压垮
⚠️ 注意事项
限流配置需合理,过严可能影响正常用户体验
对静态资源(如图片、CSS、JS)一般不需要限流
结合 防火墙 / WAF / CDN,效果更佳
监控日志(
error.log)中会出现:limiting requests, excess: 1.000(请求被限流)
