Nginx 自切换脚本

现状:

现生产环境中有两台nginx服务器A,B 分别用来做不同域名的反向代理,A,B所处机房都在上海,相互访问速度都很快。随着访问量的增大,为进一步改善用户体验,需在另一个城市北京部署一台nginx反向代理加速服务器C,要求同时对A,B进行缓存加速。

 

问题:

由于网络的不稳定因素,C服务器到A,B的速度并不相同,有时到A快,有时到B快。

 

解决的思路:

由于A B间的互通是很快的,C到AB间的速度不一,因此可以考虑C到AB中最快的一台,然后AB之间相互访问,如下图所示:

nginx控制流量配置 nginx流量切换_shell

解决的方法:

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