Nginx 自切换脚本
现状:
现生产环境中有两台nginx服务器A,B 分别用来做不同域名的反向代理,A,B所处机房都在上海,相互访问速度都很快。随着访问量的增大,为进一步改善用户体验,需在另一个城市北京部署一台nginx反向代理加速服务器C,要求同时对A,B进行缓存加速。
问题:
由于网络的不稳定因素,C服务器到A,B的速度并不相同,有时到A快,有时到B快。
解决的思路:
由于A B间的互通是很快的,C到AB间的速度不一,因此可以考虑C到AB中最快的一台,然后AB之间相互访问,如下图所示:
解决的方法:
1, 在A写两套nginx配置文件,一台后端为A,一台后端为B。然后在AB上做好相互访问的反向代理,以便从C过来后可以到达对方。
2, 在A上部署速度测试脚本,设定切换条件,当条件成立后切换nginx配置文件。使后端进行更换。
脚本要实现的功能:
1, 定时的检测到A,B的速度。并记录。
2, 根据网络状况,进行nginx的重启,加载速度较快的后端配置文件。
脚本内容如下:
#!/bin/sh
PIDFILE="/usr/local/nginx/logs/nginx.pid"
#两个不同的后端所对应的配置文件
estart="/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf"
cstart="/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/cnnginx.conf"
#到两个后端的速度
en=`ping 192.168.0.1 -c 5 | awk -F"/" '/rtt/{print $5}' | cut -d "." -f1`
cn=`ping 192.168.0.2 -c 5 | awk -F"/" '/rtt/{print $5}' | cut -d "." -f1`
#切换后端的日志记录
n_log="/var/log/changnginx.log"
echo "en is "$en > $n_log
echo "cn is "$cn >> $n_log
cha=`expr $cn - $en`
echo $cha >> $n_log
default="en"
if [ -f $PIDFILE ]; then
echo "Nginx program is runing!!!"
else
$estart
echo "Nginx program is the successful start!!! "
fi
while [ 1 ]
do
#切换的条件,当到cn的值大于60,en比cn快10秒以上,且当前后端为cn时
if [ $cn -gt 60 -a $cha -gt 10 -a $default = "cn" ];then
kill -QUIT `cat $PIDFILE`
echo "cn is "$cn "en is "$en "cha is" $cha >> $n_log
echo "chang to ennginx" >> $n_log
sleep 1
ulimit -SHn 51200
$estart
default="en"
elif [ $en -gt 60 -a $cha -lt -10 -a $default = "en" ];then
#当到en的值大于60秒,cn比en快10秒以上,且当前后端为en时,切换到cn
kill -QUIT `cat $PIDFILE`
echo "cn is "$cn "en is "$en "cha is" $cha >> $n_log
echo "chang to cnnginx" >> $n_log
sleep 1
ulimit -SHn 51200
$cstart
default="cn"
else
sleep 60
#等待60秒后记录到en的速度
en=`ping 192.168.0.1 -c 5 | awk -F"/" '/rtt/{print $5}' | cut -d "." -f1`
if [ -z $en ];then
#当到后端en没有速度。可判定为en网络中断,切换到cn
echo "en is down,chang to cn" >> $n_log
kill -QUIT `cat $PIDFILE`
sleep 1
ulimit -SHn 51200
$cstart
default="cn"
fi
#记录到cn的速度
cn=`ping 192.168.0.2 -c 5 | awk -F"/" '/rtt/{print $5}' | cut -d "." -f1`
if [ -z $cn ];then
#当到后端cn没有速度。可判定为cn网络中断,切换到en
echo "cn is down,chang to en " >> $n_log
kill -QUIT `cat $PIDFILE`
sleep 1
ulimit -SHn 51200
$estart
default="en"
fi
#计算速度差
cha=`expr $cn - $en`
fi
done
转载于:https://blog.51cto.com/liguxk/372496