• <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
            亚洲av伊人久久综合密臀性色| 久久国产精品一区二区| 久久婷婷色香五月综合激情| 国产A三级久久精品| 97精品国产91久久久久久| 国产精品99久久久久久猫咪| 东方aⅴ免费观看久久av| 久久99久久99小草精品免视看| 色偷偷91久久综合噜噜噜噜| 久久久久久久久久久久中文字幕| 国产日韩久久久精品影院首页| 漂亮人妻被中出中文字幕久久| 91久久国产视频| 久久久久99精品成人片欧美| 午夜精品久久久久久| 久久综合久久久| 成人免费网站久久久| 精品国产乱码久久久久久人妻| 国产免费久久精品99久久| 久久精品国产亚洲av水果派| 久久久久亚洲AV无码专区首JN| 久久人人超碰精品CAOPOREN | 久久精品国产亚洲5555| 色诱久久久久综合网ywww| 久久午夜福利电影| 国产叼嘿久久精品久久| 久久精品人成免费| 亚洲国产欧美国产综合久久| 2021国内精品久久久久久影院| 久久精品亚洲欧美日韩久久| 久久九九青青国产精品| 久久精品国产一区二区三区日韩| 亚洲av成人无码久久精品| 久久久久高潮综合影院| 国内精品久久久久久久久电影网| 久久综合久久综合亚洲| 久久久黄色大片| 久久久久久久97| 久久久无码精品亚洲日韩蜜臀浪潮| 精品久久久无码人妻中文字幕 | 99久久国产免费福利|