Hugo博客公告弹窗

如何解决 429 Too Many Requests

429 Too Many Requests 是 Nginx 返回的 HTTP 状态码,表示客户端发送的请求过多,超过了设定的访问频率或连接数限制。你在配置中启用了限流:

🔍 相关配置片段

以下是原始配置,当请求过多时,返回429

# 请求速率限制
limit_req_zone $binary_remote_addr zone=example_zone:50m rate=100r/s;
limit_req zone=example_zone burst=500 nodelay;
limit_req_status 429;

# 连接数限制
limit_conn_zone $binary_remote_addr zone=addr:30m;
limit_conn addr 500;
limit_conn_status 429;

✅ 如何解决 429 Too Many Requests

✅ 1. 放宽限制

适用于:真实用户高频访问,非恶意行为。

📌 调高请求频率限制

limit_req_zone $binary_remote_addr zone=example_zone:50m rate=200r/s;  # 原为100r/s
limit_req zone=example_zone burst=1000 nodelay; # 建议去掉nodelay,允许排队

📌 增加并发连接上限

limit_conn addr 1000;  # 原为500

✅ 2. 添加延迟队列(防止瞬时爆发)

nodelay 去掉,允许小延迟排队处理请求,而不是直接返回 429:

limit_req zone=example_zone burst=500;  # 去掉 nodelay,允许排队

✅ 3. 为特定路径关闭或放宽限制

适用于:如 /api/status/healthz 这类常访问路径。

location /api/status {
    limit_req off;
    limit_conn off;
    # 或者使用更宽松的规则
}

✅ 4. 使用更精细的限流变量

例如按 IP + 路径限流:

limit_req_zone "$binary_remote_addr$uri" zone=path_zone:50m rate=50r/s;

这样一个 IP 对多个接口不会共用同一限制。


✅ 5. 结合日志分析识别恶意流量

access.log 中搜索 429 状态:

grep " 429 " /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head
  • 找出异常频繁请求的 IP。
  • 可加入 deny 或使用 fail2ban 自动封禁。

✅ 6. 用 CDN 或前置负载均衡减压

如果是大规模访问,建议前置使用 Cloudflare、AWS ELB、阿里云 SLB 等服务,转移部分压力,并通过其提供的限流、缓存功能减少源站命中率。


🚨 总结

方法说明
放宽参数适合流量正常但配置过严
移除 nodelay允许排队缓冲突发流量
细粒度限制精准控制不同路径或用户
IP 黑名单识别并屏蔽恶意流量
前置缓存/CDN大流量防护利器
CC BY-NC-SA 4.0 转载请注明
最后更新于 2025-05-16 11:15
clarity统计