limit_req作用:
limit_req原理:
漏桶算,
在limit_req的限制下,请求被nginx以固定的速率处理,这个符合漏桶算法,即流出的速率恒定。
http { limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s; ......略.... server{ ......略.... location / { limit_req zone=perip; limit_req_status 503; ......略.... } ......略.... } }
说明:
在上面这个例子中:就是同一个ip地址在每秒内只能访问1次
配置好以后重启nginx使用ab测试
ab -n 100 -c 10 http://127.0.0.1/
测试结果:
http { limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s; ......略.... server{ ......略.... location / { limit_req zone=perip burst=5; limit_req_status 503; ......略.... } ......略.... } }
burst :
有大量请求时,超过频次限制的请求,会允许5个访问
允许超过限制后添加到队列执行,队列执行速率按照zone配置的rate进行
注意:burst指定的请求数量,不会马上进行处理,而是按照上面zone中rate指定的值,以固定的速率进行处理。
执行ab测试
ab -n 100 -c 10 http://127.0.0.1/
测试结果:
有6个请求成功(1+队列5个),符合预期
注意时间,花费了5.009s (队列中的请求按设定的速率1秒执行一个所以消耗5s+另外一个,总计大于5s),符合预期
参考三:nodelay
http { limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s; ......略.... server{ ......略.... location / { limit_req zone=perip burst=5 nodelay; limit_req_status 503; ......略.... } ......略.... } }
nodelay参数说明:
这里有一点要注意:因为nodelay允许立即处理,也就是有并发请求时,事实上已经超过了rate设置的处理速率了,所以要根据自己机器的实际情况设置这个值
注意nodelay+burts另外一个情况:
nodelay只是对放到burst队列中的请求立即处理,但处理完成后队列并不立即清空,
队列清空的速度仍然按原来的速度每秒一个清空,所以当再有请求过来时,并不会马上又有两个burst请求被处理.
再次测试:
ab -n 100 -c 10 http://127.0.0.1/
这次请求完成时间为 0.009秒
网站需要把动态生成的内容(java,php,python等程序生成)和静态内容分离到不同的虚拟主机
因为静态内容不需要大量的计算,所以通常limit_req用于限制动态内容的访问频率
限流的目的不是让用户不能访问,而是为了保证用户能流畅的访问,所以需要根据页面的实际情况来限制。
如果一个页面打开时同时发出的请求比较多, (静态文件分离后要检查ajax请求数, 可以根据生产环境的日志进行检查) 则rate值不能低于并发的请求数.如果低于并发的情求数,会导致用户不能正常访问页面
以下配置仅供参考
limit_req_zone $binary_remote_addr zone=reqperip:20m rate=20r/s; limit_req zone=reqperip burst=10 nodelay;
使用nginx配置能减少部分cc攻击导致宕机情况增加基础安全,配合其他手段进行更全面的安全基础防护。
遇到恶意大量ddos攻击,还是只有花钱买专业服务。
https://www.leftso.com/article/1702235681398460417.html