• <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  評論-223  文章-30  trackbacks-0
            腳本概述
               nginx是一款著名的開源web服務(wù)器,為方便升級與恢復(fù),編寫了一個簡單的腳本,因為升級備份了可執(zhí)行文件和配置文件(后綴名為old),所以可用于恢復(fù)。當升級時,若nginx正在運行,則不中斷服務(wù)進行平滑升級,否則直接拷貝覆蓋;當恢復(fù)時,若nginx正在運行,則不中斷服務(wù)進行平滑恢復(fù),否則直接拷貝覆蓋。是否正在運行根據(jù)pid來判斷,而pid從pid文件讀取,pid文件則從conf文件提取(默認為/usr/local/nginx/logs/nginx.pid)。對于參數(shù)指定的conf文件,會分析它是否存在http {和server {行來檢查有效性。該腳本的用法如下:
               ● 第1參數(shù)必須為upgrade或restore,分別表示升級或恢復(fù)。
               ● 第2參數(shù)是可選的,為nginx可執(zhí)行文件,默認為/usr/local/nginx/sbin/nginx。
               ● 第3參數(shù)是可選的,為nginx配置文件,默認為/usr/local/nginx/conf/nginx.conf。

            腳本實現(xiàn)
               在循環(huán)讀取配置文件每一行時,首先要忽略空白行和注釋行,對應(yīng)正則式分別為^$、^[[:blank:]]*#;然后識別http {或server {行,對應(yīng)正則式分別為^[[:blank:]]*http[[:blank:]]*{[[:blank:]]*、^[[:blank:]]*server[[:blank:]]*{[[:blank:]]*。不管恢復(fù)還是升級,當替換nginx可執(zhí)行文件后,如果nginx正在運行(一定要使用mv替換才能成功),先發(fā)送USR2信號(通知nginx創(chuàng)建新的工作進程)并等待老的pid文件出現(xiàn),再發(fā)送QUIT使老的nginx工作進程退出。
              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正在運行中,由于此時還沒升級,所以沒有old備份文件,如下圖
               

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

               恢復(fù)后:運行./ngxadmin restore后,如下圖
               
               從上可得,sbin子目錄下沒有了nginx.old,conf子目錄下沒有了nginx.conf.old,nginx可執(zhí)行文件和配置文件均已恢復(fù)為升級前的版本。
            posted on 2015-01-19 00:36 春秋十二月 閱讀(2048) 評論(0)  編輯 收藏 引用 所屬分類: System
            性欧美丰满熟妇XXXX性久久久| 精品久久久久久久久中文字幕| 久久亚洲AV成人出白浆无码国产| 亚洲精品无码专区久久同性男| 国产综合成人久久大片91| 99久久这里只有精品| 久久精品国产亚洲av日韩| 色综合久久久久综合体桃花网| 久久久无码精品亚洲日韩京东传媒| 久久久久久亚洲精品影院| 久久午夜福利无码1000合集| 国产精品一区二区久久精品涩爱| 成人综合久久精品色婷婷| 久久久久亚洲av成人网人人软件| 久久久久久国产精品无码下载 | 色狠狠久久综合网| 性高湖久久久久久久久AAAAA| 国产精品乱码久久久久久软件| 久久久久久精品免费看SSS| 色婷婷综合久久久中文字幕| 99久久成人国产精品免费| 一本一道久久精品综合| 色婷婷狠狠久久综合五月| 亚洲色婷婷综合久久| 国产精品福利一区二区久久| 大美女久久久久久j久久| 99久久这里只精品国产免费| 国内精品久久久久影院日本| 狠狠人妻久久久久久综合蜜桃| 久久久国产亚洲精品| 精品熟女少妇a∨免费久久| 国产精品美女久久久免费| 久久人做人爽一区二区三区| 99久久99久久久精品齐齐 | 亚洲国产精品成人AV无码久久综合影院| 久久久久99这里有精品10| 国产L精品国产亚洲区久久| 久久精品青青草原伊人| 精品久久久久久国产三级| 久久亚洲精精品中文字幕| 伊人久久大香线蕉综合网站 |