nginx_单机平滑升级

#!/bin/bash

# 定义要下载的 Nginx 源码包的 URL 和保存路径
nginx_tar="http://nginx.org/download/nginx-1.19.0.tar.gz"
nginx_tar_file="/tmp/nginx-1.19.0.tar.gz"
nginx_version="nginx-1.19.0"
nginx_path=$(which nginx)  # 获取 Nginx 的路径


# 检查 Nginx 是否已安装并获取路径
function check_nginx_installed {
    # -z 判断字符串是否为空
    if [ -z "$nginx_path" ]; then
        echo "Nginx is not installed or not found in PATH"
        exit 1
    fi
    echo "Nginx is installed at: $nginx_path"  # 输出 Nginx 路径
}

# 检查 Nginx 进程是否在运行
function check_nginx_status {
    nginx_status=$(ps -ef | grep -v grep | grep nginx | wc -l)
    if [ "$nginx_status" -gt 0 ]; then
        echo "nginx is running"
    else
        echo "nginx is not running"
        exit 1
    fi
}

# 下载 Nginx 源码包
function download_nginx {
    if [ ! -f "$nginx_tar_file" ]; then
        echo "Downloading $nginx_version..."
        wget -P /tmp "$nginx_tar"
    else
        echo "$nginx_version already exists"
    fi
}

# 解压 Nginx 源码包
function extract_nginx {
    cd /tmp 
    if [ ! -f /tmp"$nginx_version" ]; then
        echo "Extracting $nginx_version..."
        tar -zxvf $nginx_tar_file
    fi
}

# 安装yum -y install pcre-devel zlib-devel openssl-devel  gd-devel geoip-devel gcc gcc-c++ make
function install_dependence {
    yum -y install pcre-devel zlib-devel openssl-devel  gd-devel geoip-devel gcc gcc-c++ make coreutils
}

# 编译和安装 Nginx
function compile_and_install_nginx {
    cd /tmp/$nginx_version || exit
    echo "Checking nginx compile info..."
    nginx_compile_info=$($nginx_path -V 2>&1 | sed -n 's/.*configure arguments: //p')
    
    echo "Configuring nginx...   $nginx_compile_info"
    ./configure $nginx_compile_info
    echo "Compiling nginx..."
    make
    mv $nginx_path{,.bak}
    cp objs/nginx $nginx_path
}

# 获取 Nginx PID 文件路径
function get_nginx_pid_path {
    nginx_pid_path=$($nginx_path -V 2>&1 | sed -n 's/.*--pid-path=\([^ ]*\).*/\1/p')
    echo "$nginx_pid_path"
}

# 检查 PID 文件
function check_nginx_pid {
    local nginx_pid_path
    nginx_pid_path=$(get_nginx_pid_path)

    # 检查 PID 文件是否存在
    if [ -f "$nginx_pid_path" ]; then
        local master_pid
        master_pid=$(cat "$nginx_pid_path")  # 获取主进程 PID
        
        # 获取当前主进程和工作进程的数量
        local master_count
        local worker_count
        master_count=$(pgrep -c -F "$nginx_pid_path")  # 计算主进程数量
        worker_count=$(pgrep -c -P "$master_pid" -u nginx)  # 计算工作进程数量

        echo "Current master process PID: $master_pid"
        echo "Number of master processes: $master_count"
        echo "Number of worker processes: $worker_count"

        # 向主进程发送信号以重新加载
        kill -USR2 "$master_pid"

        # 处理旧版本进程
        if [ -f "${nginx_pid_path}.oldbin" ]; then
            kill -WINCH "$(cat "${nginx_pid_path}.oldbin")"
            kill -QUIT "$(cat "${nginx_pid_path}.oldbin")"
        fi
    else
        echo "$nginx_version PID file does not exist"
    fi
}


# 检查 Nginx 进程状态
function check_nginx_process {
    local cpu_cores
    cpu_cores=$(grep -c 'cpu cores' /proc/cpuinfo)
    local nginx_pid_path
    nginx_pid_path=$(get_nginx_pid_path)

    if [ -s "$nginx_pid_path" ]; then
        local master_num
        local slave_num
        master_num=$(pgrep -c -F "$nginx_pid_path")
        slave_num=$(pgrep -c -P "$(cat "$nginx_pid_path")" -u nginx)

        if [ "$master_num" -eq 0 ] || [ "$slave_num" -lt "$cpu_cores" ]; then
            echo "Nginx process may have a problem!!!"
        fi
    else
        echo "Nginx PID file may have a problem!!!"
    fi
    echo "Nginx process is running with pid $nginx_pid_path"
}


# 主程序逻辑
check_nginx_installed
check_nginx_status
download_nginx
extract_nginx
install_dependence
compile_and_install_nginx
check_nginx_pid
check_nginx_process

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值