Nginx 自切换脚本

现状:

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

 

问题:

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

 

解决的思路:

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

 

解决的方法:

1,  A写两套nginx配置文件,一台后端为A,一台后端为B。然后在AB上做好相互访问的反向代理,以便从C过来后可以到达对方。

2,  A上部署速度测试脚本,设定切换条件,当条件成立后切换nginx配置文件。使后端进行更换。

 

脚本要实现的功能:

1,  定时的检测到AB的速度。并记录。

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的值大于60encn10秒以上,且当前后端为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秒,cnen10秒以上,且当前后端为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