#!/bin/bash
#Nginx版本升级到1.12.2
export LANG="en_US.UTF-8"

#获取Nginx的安装目录
nginx_cut_path=`ps -ef | grep nginx | grep master | awk -F" /" '{print $2}' | awk -F" " '{print $1}'`
nginx_path=\/$nginx_cut_path
nginx_dir=`dirname $nginx_path`
 
#nginx-v查询的版本相关信息保存在nginx_ver_info
nginx_ver_info=`$nginx_dir/nginx -V 2>&1`

#截取当前Nginx的版本
nginx_ver=`echo $nginx_ver_info | awk -F"version: " '{print $2}' | awk -F" built" '{print $1}'`
nginx_inst_args=`echo $nginx_ver_info | awk -F"arguments:" '{print $2}'`

#判断当前版本是否已经为1.12.2,如是则退出
if [ "${nginx_ver}" = "nginx/1.12.2" ]
    then
        echo "当前的Nginx版本已经是1.12.2,无需升级"
  exit 88
 else
     echo "当前版本为$nginx_ver,需要升级,正在搜索源码包nginx-1.12.2.tar.gz,请稍等..."
fi

#通过locate的方式先查找nginx-1.12.2.tar.gz
locate_nginx_tgz=`locate nginx-1.12.2.tar.gz`
if [ "${#locate_nginx_tgz}" = "0" ]
    then
     #如果locate没有找到,再通过find的方式查找nginx-1.12.2.tar.gz 
        find_nginx_tgz=`find / -type f -name nginx-1.12.2.tar.gz`

if [ "${#find_nginx_tgz}" = "0" ]
      then
       echo "脚本没有搜索到源码包nginx-1.12.2.tar.gz,请确定已经上传到该主机,脚本已退出执行,请确实上传后重新执行该脚本!" 
                exit 88
   else
       echo "脚本通过find命令在目录$find_nginx_tgz下找到了源码包nginx-1.12.2.tar.gz,正在解压并编译安装,请稍等..."
       nginx_tgz_path=`dirname $find_nginx_tgz`
    cd $nginx_tgz_path   
        fi   
 else
     echo "脚本已经通过locate命令在目录$find_nginx_tgz下找到了源码包nginx-1.12.2.tar.gz,正在解压并编译安装,请稍等..."
        nginx_tgz_path=`dirname $locate_nginx_tgz`
  cd $nginx_tgz_path
fi

tar -zvxf $nginx_tgz_path/nginx-1.12.2.tar.gz

cd $nginx_tgz_path/nginx-1.12.2

#使用之前版本的参数进行配置
./configure $nginx_inst_args 

#注意平滑升级只要make,不需要make install
make

#备份“nginx”文件
cd $nginx_dir && mv nginx nginx.old

#复制新版本的“nginx”到原版本的路径并覆盖
cp $nginx_tgz_path/nginx-1.12.2/objs/nginx $nginx_dir/

#测试配置文件
$nginx_path -t
nginx_pid=`ps -ef | grep nginx | grep master | awk -F" " '{print $2}'`
find_nginx_pid1=`find / -type f -name nginx.pid | head -1`
find_nginx_pid2=`find / -type f -name nginx.pid | tail -1`
nginx_dir1=`dirname $find_nginx_pid1`
nginx_dir2=`dirname $find_nginx_pid2`
nginx_pid2=`cat $find_nginx_pid2`

if [ "${nginx_pid2}" = "${nginx_pid}" ]
    then
     echo "Nginx正在重命名Nginx.pid"
     #发送 USR2信号给旧版本主进程号,旧版本Nginx主进程接收到-USR2信号会自动把nginx.pid文件修改成nginx.pid.oldbin
     kill -USR2 `cat $nginx_dir2/nginx.pid`
  echo "正在从容关闭旧进程"
        # 从容关闭旧进程
        kill -QUIT `cat $nginx_dir2/nginx.pid.oldbin`
 else
     echo "Nginx正在重命名Nginx.pid"
     kill -USR2 `cat $nginx_dir1/nginx.pid`
  echo "正在从容关闭旧进程"
        kill -QUIT `cat $nginx_dir1/nginx.pid.oldbin`
 fi        

#再次截取nginx的版本号
nginx_ver_new=`$nginx_path -v 2>&1`
nginx_ver_new1=`echo $nginx_ver_new | awk -F"/" '{print $2}'`

#判断更新后的ningx版本是否是1.12.2
if [ "${nginx_ver_new1}" = "1.12.2" ]
    then
     echo "恭喜,Nginx版本已成功升级到1.12.2!"
  exit 88
    else
        echo "抱歉,Nginx-1.12.2未升级成功,请通过手工方式升级!"
        exit 88
fi