nginx 返回 429 too many requests
错误表示客户端在短时间内发送了过多请求,触发了nginx的请求限流规则。
这通常是nginx配置了请求频率限制(limit_req
模块)或连接数限制(limit_conn
模块)的结果。
以下是排查和解决方案:
1.确认限流配置位置
在nginx配置文件中(通常是 nginx.conf
或 sites-enabled/
下的文件),检查以下配置:
http { # 定义限流区域(通常放在 http 块中) limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; # 示例:每秒10请求 server { location / { # 应用限流规则 limit_req zone=one burst=20 nodelay; # 关键配置行 } } }
limit_req_zone
: 定义限流区域(名称、内存大小、限流速率)。limit_req
: 在location
或server
块中启用限流。
2.调整限流参数
根据实际需求修改以下参数:
rate
: 允许的平均请求速率。- 例如
rate=5r/s
(每秒5次)或rate=30r/m
(每分钟30次)。 burst
: 允许的突发请求数(临时超过rate
的请求会被放入队列)。nodelay
: 突发请求立即处理(不延迟),但超过burst
的请求会被拒绝。
示例调整:
# 放宽限流:每秒20请求 + 允许40个突发请求 limit_req_zone $binary_remote_addr zone=one:10m rate=20r/s; location / { limit_req zone=one burst=40 nodelay; }
3.检查其他可能的限流配置
limit_conn
(连接数限制):
limit_conn_zone $binary_remote_addr zone=addr:10m; location / { limit_conn addr 10; # 每个ip最多10个并发连接 }
多级限流:检查是否在多个位置(如 server
、location
)重复配置了限流。
4.定位触发限流的客户端
查看nginx错误日志,找到触发429的客户端ip:
grep "429" /var/log/nginx/error.log
输出示例:
2023/10/01 12:00:00 [error] 12345#0: *100000 limiting requests, client: 192.168.1.1, ...
5.临时禁用限流(测试用)
若需确认问题,可注释掉配置中的 limit_req
和 limit_conn
行,并重载nginx:
sudo nginx -s reload
6.优化建议
区分静态资源:对静态文件(如图片/css)禁用限流:
location ~* \.(jpg|css|js)$ { limit_req off; # 不限制静态资源 }
按业务分层限流:对api路径设置更严格的限制:
location /api/ { limit_req zone=api_zone; }
增大内存区域:如果ip很多,增加 limit_req_zone
的内存(如 zone=one:20m
)。
7.高级场景:动态限流
如果需要动态调整限流规则(例如根据业务状态),可结合openresty + lua脚本:
location / { access_by_lua_block { -- 自定义lua脚本实现动态限流 } }
总结步骤
- 检查nginx配置:找到
limit_req
或limit_conn
的位置。 - 调整速率/突发值:根据业务需求优化参数。
- 查日志确认触发源:分析是否由正常流量或爬虫导致。
- 重载配置:修改后执行
sudo nginx -s reload
。
注意:
过严的限流会影响用户体验,过松则可能无法保护后端。建议通过压测确定合理阈值。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论