• <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>
            隨筆-161  評論-223  文章-30  trackbacks-0
            腳本概述
               nginx是一款著名的開源web服務(wù)器,為方便升級與恢復(fù),編寫了一個(gè)簡單的腳本,因?yàn)樯墏浞萘丝蓤?zhí)行文件和配置文件(后綴名為old),所以可用于恢復(fù)。當(dāng)升級時(shí),若nginx正在運(yùn)行,則不中斷服務(wù)進(jìn)行平滑升級,否則直接拷貝覆蓋;當(dāng)恢復(fù)時(shí),若nginx正在運(yùn)行,則不中斷服務(wù)進(jìn)行平滑恢復(fù),否則直接拷貝覆蓋。是否正在運(yùn)行根據(jù)pid來判斷,而pid從pid文件讀取,pid文件則從conf文件提取(默認(rèn)為/usr/local/nginx/logs/nginx.pid)。對于參數(shù)指定的conf文件,會分析它是否存在http {和server {行來檢查有效性。該腳本的用法如下:
               ● 第1參數(shù)必須為upgrade或restore,分別表示升級或恢復(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í),首先要忽略空白行和注釋行,對應(yīng)正則式分別為^$、^[[:blank:]]*#;然后識別http {或server {行,對應(yīng)正則式分別為^[[:blank:]]*http[[:blank:]]*{[[:blank:]]*、^[[:blank:]]*server[[:blank:]]*{[[:blank:]]*。不管恢復(fù)還是升級,當(dāng)替換nginx可執(zhí)行文件后,如果nginx正在運(yùn)行(一定要使用mv替換才能成功),先發(fā)送USR2信號(通知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

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

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

               恢復(fù)后:運(yùn)行./ngxadmin restore后,如下圖
               
               從上可得,sbin子目錄下沒有了nginx.old,conf子目錄下沒有了nginx.conf.old,nginx可執(zhí)行文件和配置文件均已恢復(fù)為升級前的版本。
            posted on 2015-01-19 00:36 春秋十二月 閱讀(2056) 評論(0)  編輯 收藏 引用 所屬分類: System
            久久66热人妻偷产精品9| 久久久精品久久久久久| 国内精品人妻无码久久久影院导航| 亚洲国产综合久久天堂 | 久久久国产精华液| 久久精品极品盛宴观看| 久久亚洲精品国产精品| 狠狠色综合网站久久久久久久| 久久99热这里只频精品6| 久久精品成人免费网站| 久久久久波多野结衣高潮| 国产国产成人精品久久| 精品久久久一二三区| 丁香五月综合久久激情| 久久av无码专区亚洲av桃花岛| 久久精品国产亚洲av瑜伽| 久久Av无码精品人妻系列 | 久久综合精品国产一区二区三区| 综合人妻久久一区二区精品| 久久精品一区二区影院| 久久久久一区二区三区| 香蕉久久av一区二区三区| 亚洲婷婷国产精品电影人久久 | 久久久久女人精品毛片| 天天综合久久一二三区| 国产亚洲美女精品久久久| 青草影院天堂男人久久| 国内精品久久久久影院日本| 午夜精品久久久久久99热| 国内精品伊人久久久久妇| 亚洲精品成人网久久久久久| 国产亚洲美女精品久久久| 99久久精品国产一区二区三区 | 久久久久久久精品妇女99| 亚洲欧美国产精品专区久久| 久久久WWW免费人成精品| 久久久噜噜噜久久| 久久综合鬼色88久久精品综合自在自线噜噜 | 久久久久久久久66精品片| 欧美色综合久久久久久 | 亚洲中文字幕无码久久精品1|