• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-159  評(píng)論-223  文章-30  trackbacks-0
            腳本概述
               nginx是一款著名的開(kāi)源web服務(wù)器,為方便升級(jí)與恢復(fù),編寫(xiě)了一個(gè)簡(jiǎn)單的腳本,因?yàn)樯?jí)備份了可執(zhí)行文件和配置文件(后綴名為old),所以可用于恢復(fù)。當(dāng)升級(jí)時(shí),若nginx正在運(yùn)行,則不中斷服務(wù)進(jìn)行平滑升級(jí),否則直接拷貝覆蓋;當(dāng)恢復(fù)時(shí),若nginx正在運(yùn)行,則不中斷服務(wù)進(jìn)行平滑恢復(fù),否則直接拷貝覆蓋。是否正在運(yùn)行根據(jù)pid來(lái)判斷,而pid從pid文件讀取,pid文件則從conf文件提?。J(rèn)為/usr/local/nginx/logs/nginx.pid)。對(duì)于參數(shù)指定的conf文件,會(huì)分析它是否存在http {和server {行來(lái)檢查有效性。該腳本的用法如下:
               ● 第1參數(shù)必須為upgrade或restore,分別表示升級(jí)或恢復(fù)。
               ● 第2參數(shù)是可選的,為nginx可執(zhí)行文件,默認(rèn)為/usr/local/nginx/sbin/nginx。
               ● 第3參數(shù)是可選的,為nginx配置文件,默認(rèn)為/usr/local/nginx/conf/nginx.conf。

            腳本實(shí)現(xiàn)
               在循環(huán)讀取配置文件每一行時(shí),首先要忽略空白行和注釋行,對(duì)應(yīng)正則式分別為^$、^[[:blank:]]*#;然后識(shí)別http {或server {行,對(duì)應(yīng)正則式分別為^[[:blank:]]*http[[:blank:]]*{[[:blank:]]*、^[[:blank:]]*server[[:blank:]]*{[[:blank:]]*。不管恢復(fù)還是升級(jí),當(dāng)替換nginx可執(zhí)行文件后,如果nginx正在運(yùn)行(一定要使用mv替換才能成功),先發(fā)送USR2信號(hào)(通知nginx創(chuàng)建新的工作進(jìn)程)并等待老的pid文件出現(xiàn),再發(fā)送QUIT使老的nginx工作進(jìn)程退出。
              1#! /bin/bash
              2# nginx admin script
              3
              4. extfuncs
              5
              6usage()
              7{
              8  echo "Usage: $(basename "$0") upgrade|restore [executable file] [configure file]"
              9  exit 1
             10}

             11
             12if [ $# -lt 1 ]; then
             13  usage
             14elif [ "$1" != "upgrade" -"$1" != "restore" ]; then
             15  echo "The first parameter must be upgrade or restore" 
             16  exit 1
             17fi
             18
             19do_restore=no
             20"$1" = "restore" ] && do_restore=yes
             21    
             22bin_file=${2:-/usr/local/nginx/sbin/nginx}
             23! check_file_exist "$bin_file" && usage
             24
             25if [ ! -"$bin_file" ]; then
             26  echo "$bin_file: Permission denied"
             27  exit 1
             28fi
             29
             30conf_file=${3:-/usr/local/nginx/conf/nginx.conf}
             31! check_file_exist "$conf_file" && usage
             32
             33re_0="[[:blank:]]"
             34re_1="$re_0*"
             35re_2="^$re_1"
             36re_3="$re_0+.+"
             37re_4="$re_2#"
             38re_http="${re_2}http${re_1}{${re_1}"
             39re_server="${re_2}server${re_1}{${re_1}"
             40re_pid="${re_2}pid$re_3"
             41
             42has_http=
             43has_server=
             44pid_file=
             45
             46while read line
             47do
             48  if (echo $line | grep "^$" > /dev/null|| (echo $line | grep "$re_4" > /dev/null); then
             49      continue
             50  elif (echo $line | grep "$re_http" > /dev/null); then
             51    has_http=yes
             52  elif (echo $line | grep "$re_server" > /dev/null); then
             53    has_server=yes
             54  test -"$pid_file" || pid_file=`echo $line | awk '{if($0~/'"$re_pid"'/) print substr($2,1,index($2,";")-1)}'`    
             55  test -"$pid_file" && break
             56done < "$conf_file"
             57
             58if [ "x$has_http" != "xyes" -"x$has_server" != "xyes" ]; then
             59  echo "$conf_file is not valid nginx configure file"
             60  exit 1
             61fi
             62
             63if [ -"$pid_file" ]; then
             64  pid_file=/usr/local/nginx/logs/nginx.pid
             65elif [ "${pid_file,0,1}" != "/" ]; then
             66  pid_file=/usr/local/nginx/$pid_file
             67fi
             68
             69"x$do_restore" = "xno" ] && ! check_file_exist nginx && exit 1
             70"x$do_restore" = "xyes" ] && ! check_file_exist "${bin_file}.old" && exit 1
             71"x$do_restore" = "xyes" ] && ! check_file_exist "${conf_file}.old" && exit 1
             72    
             73pid=$(get_pid "$pid_file")
             74check_pid $pid
             75ret=$?
             76
             77if [ "$ret" -eq "0" ]; then
             78  if [ "x$do_restore" = "xno" ]; then
             79     mv "$bin_file" "${bin_file}.old"
             80     cp "$conf_file" "${conf_file}.old"
             81  else
             82     mv "$bin_file" "${bin_file}.tmp"
             83  fi
             84  echo -"nginx is running($pid),"
             85else
             86  echo -"nginx is not run,"
             87fi
             88
             89if [ "x$do_restore" = "xno" ]; then
             90    echo "upgrading it"
             91else
             92    echo "restoring it"
             93fi
             94
             95if [ "x$do_restore" = "xno" ]; then    
             96  cp -f nginx $bin_file
             97else
             98  mv "${bin_file}.old" "$bin_file"    
             99  mv "${conf_file}.old" "$conf_file"
            100fi
            101
            102$bin_file ---"$conf_file"
            103
            104if [ "$ret" -eq "0" ]; then
            105  kill -USR2 $pid
            106  wait_file "${pid_file}.oldbin" 
            107  kill -QUIT `cat "${pid_file}.oldbin"`    
            108  [ "x$do_restore" = "xyes" ] && rm -"${bin_file}.tmp"
            109fi
            110
            111if [ "x$do_restore" = "xno" ]; then
            112    echo "upgrade nginx finished"
            113else
            114  echo "restore nginx finished"
            115fi

            腳本示例
               升級(jí)前:nginx正在運(yùn)行中,由于此時(shí)還沒(méi)升級(jí),所以沒(méi)有old備份文件,如下圖
               

               升級(jí)后:運(yùn)行./ngxadmin upgrade后,如下圖
               
               從上可得,sbin和conf子目錄下分別多出了一個(gè)nginx.old和nginx.conf.old。

               恢復(fù)后:運(yùn)行./ngxadmin restore后,如下圖
               
               從上可得,sbin子目錄下沒(méi)有了nginx.old,conf子目錄下沒(méi)有了nginx.conf.old,nginx可執(zhí)行文件和配置文件均已恢復(fù)為升級(jí)前的版本。
            posted on 2015-01-19 00:36 春秋十二月 閱讀(2048) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): System
            亚洲精品乱码久久久久久久久久久久| 久久久亚洲裙底偷窥综合| 99热热久久这里只有精品68| 欧美久久一区二区三区| 亚洲国产精品久久久天堂| 久久精品人人槡人妻人人玩AV| 久久99热这里只有精品国产 | 人人妻久久人人澡人人爽人人精品| 97热久久免费频精品99| 久久91精品国产91久| 久久人人爽人人爽人人AV东京热 | 97精品伊人久久大香线蕉| 浪潮AV色综合久久天堂| 国产精品午夜久久| 中文国产成人精品久久不卡| 国产精品久久久久乳精品爆 | 久久久久久久久久免免费精品| 99久久国语露脸精品国产| 久久不见久久见免费影院www日本| 久久人人添人人爽添人人片牛牛| 欧美熟妇另类久久久久久不卡| 91精品国产91久久| 国产亚洲欧美成人久久片| 久久国产精品99国产精| 久久国产成人| 99久久精品午夜一区二区| 国产午夜久久影院| 国色天香久久久久久久小说| 99热都是精品久久久久久| 久久久噜噜噜www成人网| 久久毛片一区二区| 色妞色综合久久夜夜| 99久久精品国产综合一区 | 久久久精品国产亚洲成人满18免费网站| 欧美日韩精品久久久免费观看| 久久香蕉一级毛片| 精品久久久久久无码中文野结衣| 亚洲精品乱码久久久久久蜜桃不卡| 久久亚洲天堂| 亚洲精品无码久久久久去q | 99久久99这里只有免费的精品|