一、问题
昨晚(2020-07-09)八点左右,生产运行的APP大面积上报请求超时,无法获取数据,显示网络连接错误等。经过简单测试,发现并不是如用户所说的APP完全无法与服务器通讯,偶尔请求又能正常返回。
登录后台后,直接查看系统连接数,发现并发数较高,等待处理的请求也很多,造成了网络阻塞;
$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
返回结果一般如下:
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉
二、处理
分析可能是有类似爬虫的程序在对我们的系统进行扫描。由于系统并没有特别高并发的需求(小众应用),所以没有所谓的高并发架构,但应用服务端采用的是Nginx,故决定限制一下限制客户端的访问频次和访问次数。
Nginx可以通过ngx_http_limit_conn_module和ngx_http_limit_req_module配置来限制ip在同一时间段的访问次数:
ngx_http_limit_conn_module
可以根据设定的条件来限定客户端(单一ip)的并发访问,使用limit_conn_zone和limit_conn指令。
1、在nginx.conf里的http{}里加上如下代码:
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
2、在需要限制并发数和下载带宽的网站配置server{}里加上如下代码:
limit_conn perip 2;
limit_conn perserver 20;
limit_rate 100k;
参数明下:
$binary_remote_addr 限制同一客户端ip地址;
$server_name 限制同一server最大并发数;
limit_conn 限制并发连接数;
limit_rate 限制下载速度;
ngx_http_limit_req_module
可以根据设定的条件来限定客户端(单一ip)的访问频率,使用limit_req_zone和limit_req指令。
1、在nginx.conf里的http{}里加上如下代码:
#定义一个名为one的limit_req_zone用来存储session,大小是10M内存,
#以$binary_remote_addr / $server_name 为key,限制平均每秒的请求为10个,
#1m能存储16000个状态,rete的值必须为整数,
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
limit_req_zone $server_name zone=perserver:10m rate=10r/s;
2、在需要限制并发数和下载带宽的网站配置server{}里加上如下代码:
limit_req zone=perip burst=5 nodelay; #漏桶数为5个,也就是队列数,nodelay:不启用延迟.
limit_req zone=perserver burst=10; #限制nginx的处理速率为每秒10个
网友评论