nginx的限流配置的几种方法实现
Nginx 的限流功能主要依赖两个核心模块:
- ngx_http_limit_req_module:限制请求速率(基于漏桶算法)
- ngx_http_limit_conn_module:限制并发连接数
Nginx 主要使用 漏桶算法 (Leaky Bucket),通过 burst 参数模拟突发能力
漏桶模型 (Leaky Bucket)
原理:水流(请求)任意速度注入,桶底以固定速度漏水(处理)。水满则溢出(拒绝)。
[ 请求流入 ]
⬇️⬇️⬇️
┌─────────────┐
│ 桶 (Burst) │ <--- 容量上限 (允许排队的数量)
│ [水][水][水] │
└──────┬──────┘
│ 💧 (固定速率 Rate)
▼
[ 后端服务器 ]- Rate (流速):桶底漏水速度。例如 10r/s = 每秒只放行 10 个请求。
- Burst (容量):桶的大小。例如 burst=20 = 允许额外积压 20 个请求排队。
- Nodelay (不延迟):
- 不加:排队的请求要等桶底慢慢漏完才能走(用户感觉卡顿)。
- 加 nodelay:排队的请求立即放行(只要不超过 Burst 上限),瞬间处理突发流量。
限制请求速率 (limit_req)
这是最常用的限流方式,用于防刷、保护 API
基础配置模板
http {
# 1. 定义限流区域 (必须在 http 块中)
# $binary_remote_addr: 基于客户端 IP (二进制格式,节省内存)
# zone=api_limit: 区域名称
# size=10m: 共享内存大小 (1MB 约可存储 16000 个 IP 状态)
# rate=10r/s: 核心速率,每秒允许 10 个请求
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
server {
listen 80;
server_name api.example.com;
location /api/ {
# 2. 应用限流规则 (必须在 location 块中)
# zone=api_limit: 引用上面定义的区域
# burst=20: 允许突发 20 个请求 (排队容量)
# nodelay: 突发的请求立即处理,不延迟 (关键参数)
limit_req zone=api_limit burst=20 nodelay;
# 可选:自定义拒绝时的返回码 (默认是 503)
limit_req_status 429;
proxy_pass http://backend;
}
}
}
| 参数 | 含义 | 示例效果 |
|---|---|---|
| rate | 基础流速 | 10r/s = 平均每秒处理 10 个请求。 |
| burst | 桶容量/缓冲池 | burst=20 = 允许瞬间进来 30 个请求 (10 个正常 + 20 个突发),超出的才拒绝。 |
| nodelay | 是否延迟处理 | 不加:超出的 20 个请求会按 rate 的速度排队慢慢处理(用户感觉卡顿)。 加:超出的 20 个请求立即转发给后端(用户感觉流畅,但后端压力瞬间增大)。 (通常防刷都加 nodelay) |
| key | 限流维度 | $binary_remote_addr (按 IP) $http_authorization (按 Token) $uri (按接口) |
限制并发连接 (limit_conn)
用于防止单个 IP 占用过多连接(如下载站、防 CC 攻击)。
http {
# 1. 定义连接限制区域
# 每个 IP 最多允许 10 个并发连接
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
location /download/ {
# 2. 应用限制
# 同一个 IP 同时只能有 10 个连接在下载
limit_conn conn_limit 10;
# 超过限制返回 503 或自定义
limit_conn_status 503;
proxy_pass http://file_server;
}
}
}全局 + 单 IP 双重限制
既防单个疯子,也防群体攻击
# 定义两个区
limit_req_zone $binary_remote_addr zone=ip:10m rate=10r/s;
limit_req_zone $server_name zone=global:10m rate=1000r/s;
location / {
limit_req zone=ip burst=20 nodelay; # 单 IP 限流
limit_req zone=global burst=100 nodelay; # 全站总限流
}
调试与监控
查看谁被限流了?
查看 Nginx 错误日志 (error.log):
tail -f /var/log/nginx/error.log | grep "limiting"
输出示例:limiting requests, excess: 20.456 by zone “my_limit” (表示超额了 20 个请求被拒)。
到此这篇关于nginx的限流配置的几种方法实现的文章就介绍到这了,更多相关nginx 限流配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
nginx报错:[emerg] getpwnam(“www“)failed问题及解决
这篇文章主要介绍了nginx报错:[emerg] getpwnam(“www“)failed问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2025-03-03


最新评论