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

原因分析

  1. 限流规则生效
    你配置了 Nginx 的 limit_req 模块,对客户端请求速率进行了限制。当请求超过阈值时,Nginx 会根据配置进行 延迟处理直接拒绝

  2. 典型配置示例

    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;
        }
      }
    }
    
  3. excess 值计算

    • excess: 0.680 表示当前请求在速率窗口期内超过了允许值 0.68 个请求。
    • burst 队列已满时,新的请求会被延迟或拒绝。

解决方案

1. 调整限流参数(推荐)

根据实际流量优化 rateburst

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 立即处理突发请求,但后续请求仍需遵守速率限制

总结

  • 临时调整:增加 burstrate 缓解告警。
  • 长期优化:结合业务流量模型和服务器性能,设置合理限流值。
  • 监控工具:使用 Prometheus + Grafana 实时监控限流状态。
posted @ 2025-03-20 17:54  jintaonote  阅读(91)  评论(0)    收藏  举报