nginx限流配置
这个 Nginx 警告日志表明服务器正在通过 limit_req 模块对客户端请求进行速率限制。以下是详细分析和解决方案:
日志解读
2025/03/20 17:40:58 [warn] 1337272#0: *11 delaying request, excess: 0.680, by zone "ip_limit", client: 54.2.2.13, server: ...
| 字段 | 说明 |
|---|---|
delaying request |
请求被延迟处理(未被拒绝,但需等待可用配额) |
excess: 0.680 |
当前请求超出速率限制的量(单位:请求数) |
zone "ip_limit" |
触发的速率限制规则名称(对应 limit_req_zone 配置) |
client: 54.254.221.13 |
触发限流的客户端 IP |
原因分析
-
限流规则生效
你配置了 Nginx 的limit_req模块,对客户端请求速率进行了限制。当请求超过阈值时,Nginx 会根据配置进行 延迟处理 或 直接拒绝。 -
典型配置示例
http { # 定义限流区域:10MB 内存,速率 100 请求/秒 limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=100r/s; server { location / { # 应用限流:允许突发 20 请求,超出后延迟处理 limit_req zone=ip_limit burst=20; } } } -
excess 值计算
excess: 0.680表示当前请求在速率窗口期内超过了允许值 0.68 个请求。- 当
burst队列已满时,新的请求会被延迟或拒绝。
解决方案
1. 调整限流参数(推荐)
根据实际流量优化 rate 和 burst:
http {
# 提高速率至 200 请求/秒,突发 50 请求
limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=200r/s;
server {
location / {
# 允许突发 50 请求,超出后延迟处理
limit_req zone=ip_limit burst=50;
}
}
}
重启 Nginx 生效:
sudo nginx -s reload
2. 启用即时处理突发请求
添加 nodelay 参数,允许突发请求立即处理(但仍限制总体速率):
location / {
limit_req zone=ip_limit burst=50 nodelay;
}
3. 监控限流状态
查看限流统计:
# 查看 Nginx 状态(需启用 ngx_http_status_module)
curl http://localhost/nginx_status
# 或通过日志分析
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
4. 防御恶意 IP
若特定 IP 频繁触发限流,可将其加入黑名单:
http {
# 创建黑名单区域
geo $block_ip {
default 0;
54.254.221.13 1; # 手动添加 IP
}
server {
if ($block_ip) {
return 403;
}
}
}
限流配置参数详解
| 参数 | 说明 |
|---|---|
limit_req_zone |
定义限流内存区域(键值、内存大小、速率) |
zone=ip_limit:10m |
共享内存区域名称和大小(1MB 可存约 1.6 万 IP 状态) |
rate=100r/s |
允许的请求速率(单位:r/s=每秒, r/m=每分钟) |
burst=20 |
允许的突发请求数 |
nodelay |
立即处理突发请求,但后续请求仍需遵守速率限制 |
总结
- 临时调整:增加
burst或rate缓解告警。 - 长期优化:结合业务流量模型和服务器性能,设置合理限流值。
- 监控工具:使用 Prometheus + Grafana 实时监控限流状态。
欢迎大家学习,交流
浙公网安备 33010602011771号