共计 1716 个字符,预计需要花费 5 分钟才能阅读完成。
这篇文章主要为大家展示了“Web 应用服务器如何实现并发访问控制”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让丸趣 TV 小编带领大家一起研究并学习一下“Web 应用服务器如何实现并发访问控制”这篇文章吧。
前端负载一台,作用是客户端发起一条 http 请求到前端负载均衡服务器,然后负载层根据 web server 已定义的轮询算法,把各消息原封不动的转发到后段的各 web server 上,压力这块不是很大,因为都转到后端了。
但是有个问题,客户端在发起一条 http 请求到前端负载层的时候,一分钟内这个请求数会达到惊人的几十万条不等(项目业务需要,客户端自身需要把金额等数据同步到各项目服务器上),基本是客户端对服务端发起的同步请求,还有其它的对 web 站点的访问请求。然后可能有些同步请求不是必须也不需要那么频繁或者是在这个时间内根本不需要把数据同步上来。固鉴于此就想着看能不能在前端负载层做个并发控制,对这个传过来的客户端 IP 做个操作。当这个 IP 请求次数大于内部设定的某个值的时候就让它拒绝访问服务器,这样的话服务器在处理消息的时候也会更加有效率,也能起到一定的宫级作用。想了想应该可以实现,所以才有了下面的脚本。记录下来供各位小伙伴参考下 ……
#!/bin/bash
#Author:You Names
#Contact Mail:455436588@qq.com
#Version:3.0
#Company:COMPANY
#Create time:2019-07-17 17:31:58
#Description:Nginx server concurrency restrictions
Max=100000
CFS=/usr/local/nginx/conf/nginx.conf
LOGS=/usr/local/nginx/logs/access.log
#执行循环体
#过滤出 access.log 日志里所定义的 $remote_addr 地址。重复的打印出来并排序;
cat $LOGS | awk {print $2} | sort -n | uniq -c | sort -rn | head -n 10 | while read line
do
# 定义变量 $IP,打印出是哪个 IP;
IP=`echo $line | awk {print $2} `
# 定义变量 $Count,打印出这个 IP 出现的次数;
Count=`echo $line | awk {print $1} `
# 定义变量 $Docs,值为 nginx 的配置文件;
Docs=${cat $CFS}
# 定义变量 $CFG,看配置文件里有没有这个 IP;
CFG=`echo $Docs | grep ${IP} `
# 判断,如果 $Count 的值大于 $Max 的值,并且在 $CFG 里为空,不是这也不是那,执行替换并写入到 $Docs 指定 location 下做 deny 操作,重载并 continue;
if [[ $Count -gt $Max ]] [[ $CFG == ]] [[ $IP != IP ADDRESS ]] [[ $IP != IP ADDRESS ]]
then
sed -i /location \/ {/a\deny ${IP} $CFS
sed -i /location \/pads {/a\deny ${IP} $CFS
sed -i /location \~\* \\\.ios\$ {/a\deny ${IP} $CFS
sed -i /location \~\* \\\.android\*\$ {/a\deny ${IP} $CFS
/usr/local/nginx/sbin/nginx -t /usr/local/nginx/sbin/nginx -s reload echo SUCCESS!!
else
continue
fi
done
以上是“Web 应用服务器如何实现并发访问控制”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!