使用Nginx实现限流

使用Nginx实现限流,第1张

并发100、1000,每秒能处理的请求数相近,因为这次目的不是压测nginx 性能,所以没必要继续往下压,这里压测主要是跟后面限流后的数据做对比。

虽然请求没有失败,但是明显地RPS 下降很明显,请求等待耗时也比不限流要多。

总耗时接近19s,也就是说新增令牌应该是19*50=950,而再加上原来令牌桶有100个令牌,总数是1050个,且perserver_conn=200,按道理也是能够承接100个客户端的1000个请求。

同上,RPS也是接近50左右,请求没有失败,请求等待耗时跟上面一样

总压测耗时200s,新增令牌数:200*50=10000,没毛病

RPS涨到4k多,但是从压测结果来看,接近99%的请求都是失败的,也就是说4k多里面接近99%都是失败的请求

nginx 限制了该server最多只能接受200个并发连接,所以只要nginx接收到的并发数小于200,nginx都能够处理,但由于令牌桶的限制,nginx最多只能同时处理100个请求,其余的请求会进行排队,并且会在每秒内在生成50个令牌提供给排队中的请求。

以上配置可以针对 /front/index/specialDetails 该url 下的所有请求进行限流,但是有个问题是:该url 下是产品的链接,而所有产品链接都是在该url下以产品id 进行区分,这样限流相当于将所有产品都进行限流,如果有某个爆款产品把链接占用完了,会影响其他常规产品的访问。

正常一个产品链接: https://www-test.yunkezan.com/front/index/specialDetails?weChatId=421&goodId=17503&activityId=2027&channel=promoteMall&tag_id=-1&tag_name=%E9%99%90%E6%97%B6%E6%8A%A2%E8%B4%AD&tag2_id=-5&tag2_name=%E7%83%AD%E9%97%A8

返回503 被限流。

对于网站来说,尤其是流量较大出名的网站,经常遇到攻击,如DDOS攻击等,虽然有些第三方,如Cloudflare可以挡,但对于动态网站PHP来说,只能挡一部分。这时候需要对于单个IP恶意攻击做出限流。nginx的两个模块可以限流。

nginx两个限流模块:

连接频率限制,ngx_http_limit_conn_module:官方文档:https://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

请求频率限制,ngx_http_limit_req_module:官方文档:https://nginx.org/en/docs/http/ngx_http_limit_req_module.html

网上理论很多,根据名字可知:

当然还是看不懂的话,通俗点讲(相对于时间比较):

比如秒杀,抢购,连接频率限制和请求频率限制应该配合使用 , 使用连接频率限制同一IP同时只能有3个连接, 再使用请求频率限制对于同一ip的请求,限制平均速率为5个请求/秒 , 这样比单独只使用一种限制要好很多。

比如只使用请求频率限制 , 可以精确地限制同一ip1秒只能发起5次的http请求 , 假如同一ip1秒内发起了100000次请求 , 虽然限制了只有5次成功响应 , 但是其他的99995次的请求TCP握手建立http连接是不是会消耗服务器资源? 所以还需要配合使用。

1、limit_req_zone,示例:

2、limit_conn_zone,示例:

3、搭配一起使用

1、ab命令

ab是apache自带的压力测试工具。一般不用额外安装,ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。比如nginx、tomcat、IIS等。

测试命令

2、wrk命令

需自己安装,地址:https://github.com/wg/wrk

安装

测试命令:

还有其他压测工具,自行研究


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11230863.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存