nginx 限制ip请求某个url的频率
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx 限制ip请求某个url的频率相关的知识,希望对你有一定的参考价值。
参考技术A 问题描述:今天在统计nginx日志中,url访问频率的时候,发现一个接口访问次数远远大于其他的url。于是用tail -f查看实时日志,发现有个ip以每秒3-4次请求这个url。询问开发后,得知是第三方调用的,频率有点高,需要限制一下。
解决:
在nginx的http模块中添加以下配置
rate=1r/s 的意思是每个地址每秒只能请求一次
在server模块中添加一下配置
burst是指一共有5个令牌,发完后,只能根据rate的设定每秒新增一个
reload nginx的配置之后,再次查看日志。可以看到访问频率明显降下来了
Nginx对同一IP限速限流
limit_conn_zone是限制同一个IP的连接数,而一旦连接建立以后,客户端会通过这连接发送多次请求,那么limit_req_zone就是对请求的频率和速度进行限制。
limit_conn_zone $binary_remote_address zone=addr:10m;
limit_conn addr 2;
有了连接数限制,相当于限制了客户端浏览器和Nginx之间 的管道个数,那么浏览器通过这个管道运输请求,如同向自来水管中放水,水的流速和压力对于管道另外一端是有影响的。为了防止不信任的客户端通过这个管道疯狂发送请求,对我们的耗CPU的资源URL不断发出狂轰滥炸,必须对请求的速度进行限制,如同对水流速度限制一样。
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
limit_req zone=one burst=10;
- rate=5r/s:从单一IP地址每秒5个请求是允许的,
- burst=10:允许超过频率rate限制的请求数不多于10个
- 当每秒请求超过5个,但是在10个以下,也就是每秒请求的数量在5到10之间的请求将被延时 delay,虽然这里没有明写delay,默认是延时,因为漏洞其实类似队列Queue或消息系统, 当每秒请求数量超过最低速率每秒5个时,多余的请求将会进入这个队列排队等待。如同机场安检,一次放入5个,多于5个,小于10个的排队等待,注意:这个队列或漏洞是以每秒为单位的
- 如果每秒请求数超过10个,也就是burst的限制,那么也不排队了直接回绝,返回503 http。也就是说排队长度不能超过10个。
如果我们使用nodelay:
limit_req zone=one burst=10 nodelay;
在Twitter Facebook LinkedIn这类大型网站中,由于访问量巨大,通常会在http服务器后面放置一个消息队列,比如Apache Kafka,用来排队大量请求,因此,对于中小型网站,推荐使用delay方案,而不要写明nodelay,但是网络上其他各种文章几乎都是推荐nodelay.
limit_rate 50k;limit_rate_after 500k;
当下载的大小超过500k以后,以每秒50K速率限制。
http://blog.csdn.net/jek123456/article/details/53334095
以上是关于nginx 限制ip请求某个url的频率的主要内容,如果未能解决你的问题,请参考以下文章