当前位置: 首页 > 后端技术 > PHP

关于Laravel和Nginx限流策略防止恶意请求_0

时间:2023-03-29 14:57:06 PHP

一、问题背景最近公司最近上线的几台服务器经常出现CPU占用率过高,影响部分应用的响应超时,产生大量的短信和邮件警报。排查数据库日志和access.log,发现API接口被刷屏,疯狂请求恶意请求,最长时间约120次/s。之前在这方面经验不多,处理起来不是很顺利。这次的问题正好提醒了我。这个问题暴露后,我会记录解决方案和策略。线上部署方案为:nginx+laravel。首先,我们尝试从nginx层面入手,这样占用内存较少,不需要转发给php-fpm处理。2.(恶意)请求特征要想好的特征,一定要抓取某些特征,利用这个特征来有效控制恶意请求。IP在短时间内对某个接口产生大量请求user_agent,异常信息量或空请求量比平时高很多。3、限流策略(nginx)限制请求数。首先是控制单个IP时间上的请求数和IP连接数。配置如下:http{limit_req_zone$binary_remote_addrzone=one:1mrate=1r/s;server{location/api/{limit_reqzone=oneburst=5;}}}limit_req_zone主要控制单个IP的请求率,使用漏桶算法完成限制,limit_req_zone大小,主要用于存放统计IP请求信息,1M可存放16000个IP,当每秒请求超过16000时,其余访问将访问503服务暂时不可用。以上模板设置,每秒最大请求数不超过1个,最大延迟请求不超过5个。如果我们服务器每个接口的响应时间是200ms-300ms,那么我们对应的限制每秒应该设置为1000ms/接口响应时间。限制并发连接数限制了用户请求的频率后,如果还有较大的恶意请求,我们还可以限制并发连接数。http{limit_conn_zone$binary_remote_addrzone=one:1m;server{location/api/{limit_conn一个10;}}}limit_conn_zone:主要用来控制并发请求数,频率不能太快。limit_conn_zonesize与limit_req_zone含义相同,可以根据需要动态调整。上面的例子,就是限制每个客户端IP的最大并发连接数为10。设置IP黑名单当某个IP请求过于频繁或者需要彻底杜绝该IP的访问时,可以使用deny配置nginx禁止访问黑名单中的IP。http{包括blockip.conf;}黑名单配置deny195.91.112.66;deny192.168.2.100;加入黑名单后,再次访问会出现403禁止访问。限制UA(用户代理)信息http{server{if($http_user_agent~*"curl"){return403;}}}上面禁止ua信息为curl的客户端,直接返回403。禁止多个ua,用|隔开。if($http_user_agent~*"curl|wget"){return403;}(四)、限流策略(laravel)在我们的laravel项目中,有一个Throttle中间件,这个策略可以在应用层有效的抑制恶意用户请求,配置如下:Route::group(['middleware'=>'throttle:30:1'],function(){Route::any('/login','LoginController@login');});在throttle配置中,第一个参数控制请求次数,第二个参数用于控制请求频率。上面的配置表明每个客户端IP每分钟最多请求30条登录路由。当客户端ip超过请求限制时,服务端会返回429TooManyAttempts。回复