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 | 大流量防护利器 |