• <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
            国产精品久久久久9999| 国产日韩久久久精品影院首页| 国内精品伊人久久久影院| 亚洲国产另类久久久精品黑人| 91久久精一区二区三区大全| 国产精品丝袜久久久久久不卡| 亚洲人成无码久久电影网站| 成人综合伊人五月婷久久| 婷婷久久综合九色综合九七| 亚洲中文字幕久久精品无码APP| 欧美精品一区二区精品久久| 久久人人爽人人爽人人片AV不| 久久er国产精品免费观看2| 精品久久久久久久久免费影院 | 97超级碰碰碰碰久久久久| 武侠古典久久婷婷狼人伊人| 国产人久久人人人人爽| 久久久久久久97| 国产成人精品久久亚洲高清不卡 | 亚洲中文久久精品无码ww16| 久久综合狠狠综合久久97色| 国内精品久久国产大陆| 亚洲AV无一区二区三区久久| 色婷婷噜噜久久国产精品12p| 91精品久久久久久无码| 国产精品久久久久久吹潮| 久久天天躁狠狠躁夜夜不卡| 一本久久a久久精品综合香蕉| 久久精品无码av| 国产伊人久久| 91精品国产高清久久久久久91 | 亚洲?V乱码久久精品蜜桃 | 蜜臀av性久久久久蜜臀aⅴ| 欧美久久久久久| 日本高清无卡码一区二区久久| 国产成人精品久久亚洲| 伊人久久大香线蕉精品| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 99久久精品免费看国产一区二区三区 | 久久99中文字幕久久| 国产精品久久自在自线观看|