nginx限制某请求并发数
问题描述:网站前后台都返回502状态码,检查网络攻击并不算高,通过日志分析发现大量/ContentManage/Ajax/GetPreAndNextPublicInformation或/ContentManage/Ajax/GetPrevAndNextContent请求,虽然不会对网站安全造成影响,而且是会直接中断跳出的,但是请求比较集中,造成了其他正常请求的响应速度变慢
解决方法:通过nginx限制具体url的访问并发数
在nginx的http{}节下添加
#并发限制
limit_conn_zone $binary_remote_addr zone=addr:20m;
limit_req_zone $binary_remote_addr zone=one:20m rate=1r/s;
limit_conn_zone:定义一个名为 addr 的共享内存区(20MB),用于记录每个客户端 IP( $ binary_remote_addr)的并发连接数。
limit_req_zone:定义一个名为 one 的共享内存区(20MB),用于记录每个客户端 IP 的请求频率,限制为 1 次/秒。
然后在 location ~* ^/ContentManage/Ajax/GetPreAndNextPublicInformation 和/ContentManage/Ajax/GetPrevAndNextContent下添加:limit_conn addr 1; # 同一 IP 最多 1 个并发连接limit_req zone=one nodelay; # 请求速率限制为 1r/s,突发请求不延迟(直接处理或拒绝)
可以根据实际需求看是否添加burst参数
limit_req zone=one burst=3 nodelay; #burst=3 表示允许最多 3 个突发请求
注意默认限流/限连失败返回 503状态码,可自行定义错误代码。