脚本化挂在物理盘、nfs、yum、pg数据库、nginx(已上传脚本)

news2025/1/17 4:58:40

文章目录

  • 前言
  • 一、什么是脚本化安装
  • 二、使用步骤
    • 1.物理磁盘脚本挂载(离线)
    • 2.yum脚本化安装(离线)
    • 3.nfs脚本化安装(离线)
    • 4.pg数据库脚本化安装(离线)
    • 5.nginx脚本化安装(离线)
  • 总结


前言

在Linux中,Shell脚本是一种强大的工具,用于自动化任务和管理系统。编写Shell脚本时,需要遵循一定的格式和规范,以确保脚本的可读性和可维护性。


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是脚本化安装

Linux脚本是一种可以在Linux或其他类Unix操作系统上运行的脚本语言。它可以用于自动化系统管理任务、软件开发、数据处理等各种任务。脚本通常是以文本文件的形式编写,其中包含一系列命令和语句,这些命令和语句可以在终端或脚本解释器中执行。

底层原理是,当用户运行脚本时,操作系统会将其交给解释器解释执行。解释器会逐行读取脚本文件,将每一行转化为对应的操作系统命令进行执行。因为Linux脚本语言是一种解释型语言,所以它可以在不同的平台和系统上运行,而不需要进行编译。这使得脚本编写和调试更加容易。

脚本语言的优点是它具有易读性、易维护性、易于使用的特点。Linux脚本可以处理多种文本格式,包括CSV、XML、JSON等。此外,它还具有强大的系统管理功能,如文件管理、进程管理、网络管理等。因此,它在自动化运维、软件开发、数据处理等领域广泛应用。

二、使用步骤

1.物理磁盘脚本挂载(离线)

使用方法
将代码保存为.sh格式

dos2unix 物理盘挂载.sh     ----转载为linux可识别的语言
sh 物理盘挂载.sh           ----根据提示填写信息即可

代码

#!/bin/bash

# 检查是否以root用户运行
if [ "$EUID" -ne 0 ]; then
  echo "请以root用户或使用sudo运行此脚本"
  exit 1
fi

# 列出所有块设备
echo "当前块设备列表:"
lsblk

# 提示用户输入设备路径
read -p "请输入要格式化的磁盘设备路径(例如 /dev/vdb):" DEVICE_PATH

# 检查设备是否存在
if [ ! -e "$DEVICE_PATH" ]; then
  echo "设备 $DEVICE_PATH 不存在,请检查路径是否正确!"
  exit 1
fi

# 提示用户确认设备路径
echo "您选择的设备是:$DEVICE_PATH"
read -p "请确认是否继续格式化此设备?(y/n): " CONFIRM

if [ "$CONFIRM" != "y" ]; then
  echo "操作已取消。"
  exit 0
fi

# 提示用户选择文件系统类型
echo "请选择要使用的文件系统类型:"
echo "1. ext3"
echo "2. ext4"
echo "3. xfs"
echo "4. btrfs"
read -p "输入选项(1-4):" FILESYSTEM_OPTION

# 根据用户选择设置文件系统类型
case $FILESYSTEM_OPTION in
  1) FILESYSTEM="ext3";;
  2) FILESYSTEM="ext4";;
  3) FILESYSTEM="xfs";;
  4) FILESYSTEM="btrfs";;
  *) echo "无效选项,默认使用 ext3"; FILESYSTEM="ext3";;
esac

# 格式化磁盘
echo "格式化 $DEVICE_PATH 为 $FILESYSTEM 文件系统..."
if [ "$FILESYSTEM" == "xfs" ]; then
  mkfs.xfs "$DEVICE_PATH"
elif [ "$FILESYSTEM" == "btrfs" ]; then
  mkfs.btrfs "$DEVICE_PATH"
else
  mkfs.$FILESYSTEM "$DEVICE_PATH"
fi

# 提示用户输入挂载点路径
read -p "请输入挂载点路径(例如 /vdb):" MOUNT_POINT

# 创建挂载点目录
echo "创建挂载点目录 $MOUNT_POINT..."
mkdir -p "$MOUNT_POINT"

# 挂载设备到挂载点
echo "挂载 $DEVICE_PATH 到 $MOUNT_POINT..."
mount "$DEVICE_PATH" "$MOUNT_POINT"

# 编辑 /etc/fstab 文件,以确保系统重启后自动挂载
echo "编辑 /etc/fstab 文件以确保系统重启后自动挂载..."
echo "$DEVICE_PATH $MOUNT_POINT $FILESYSTEM defaults 0 0" >> /etc/fstab

# 检查挂载是否成功
echo "检查挂载是否成功..."
mount -a

# 列出所有块设备,确认挂载
echo "当前块设备列表:"
lsblk

# 重启系统
echo "系统将在5秒后重启..."
sleep 5
reboot

在这里插入图片描述

2.yum脚本化安装(离线)

使用方法和上面差不多

dos2unix yum.sh
sh yum.sh
#!/bin/bash

# 检查是否以root用户运行
if [ "$EUID" -ne 0 ]; then
  echo "请以root用户或使用sudo运行此脚本"
  exit 1
fi

# 提示用户输入挂载点路径(默认为 /media/cdrom)
read -p "请输入挂载点路径(默认为 /media/cdrom):" MOUNT_POINT

# 如果用户未输入挂载点路径,则使用默认值
if [ -z "$MOUNT_POINT" ]; then
  MOUNT_POINT="/media/cdrom"
fi

# 创建挂载点目录
echo "创建挂载点目录 $MOUNT_POINT..."
mkdir -p "$MOUNT_POINT"

# 显示磁盘使用情况
echo "当前磁盘使用情况:"
df -h

# 备份原有yum仓库配置
echo "备份原有yum仓库配置..."
cp -rf /etc/yum.repos.d /etc/yum.repos.d_bak

# 清除原有yum仓库配置
echo "清除原有yum仓库配置..."
rm -rf /etc/yum.repos.d/*

# 创建新的yum仓库配置文件
echo "创建新的yum仓库配置文件..."
cat <<EOF > /etc/yum.repos.d/Media.repo
[iso]
name=Media
baseurl=file://${MOUNT_POINT}/
gpgcheck=0
enabled=1
EOF

# 编辑fstab文件以自动挂载光驱
echo "编辑 /etc/fstab 文件以自动挂载光驱..."
echo "/dev/sr0   ${MOUNT_POINT}   iso9660   defaults   0   0" >> /etc/fstab

# 重新加载systemd配置
echo "重新加载systemd配置..."
systemctl daemon-reload

# 挂载所有文件系统
echo "挂载所有文件系统..."
mount -a

# 停止并禁用防火墙
echo "停止并禁用防火墙..."
systemctl stop firewalld
systemctl disable firewalld

# 清除yum缓存并重建
echo "清除yum缓存并重建..."
yum clean all
yum makecache

# 列出可用的软件包
echo "列出可用的软件包..."
yum list

# 确认挂载成功
echo "挂载点 $MOUNT_POINT 的挂载状态:"
mount | grep "$MOUNT_POINT"

# 完成提示
echo "配置完成!挂载点已设置为 $MOUNT_POINT,yum仓库已配置。"

在这里插入图片描述

3.nfs脚本化安装(离线)

使用方法

dos2unix nfs.sh
sh nfs.sh

代码

#!/bin/bash

# 安装nfs-utils和rpcbind
echo "安装nfs-utils和rpcbind..."
yum install -y nfs-utils rpcbind

# 提示用户输入共享路径的目录
read -p "请输入NFS共享目录的路径(例如 /home/nfs): " SHARE_DIR

# 如果用户没有输入,则使用默认值 /home/nfs
if [ -z "$SHARE_DIR" ]; then
    SHARE_DIR="/home/nfs"
    echo "未输入共享目录路径,使用默认值 $SHARE_DIR"
fi

# 创建NFS共享目录
echo "创建NFS共享目录 $SHARE_DIR..."
mkdir -p "$SHARE_DIR"
chmod -R 777 "$SHARE_DIR"  # 将权限改为777

# 配置exports文件
echo "配置 /etc/exports..."
cat > /etc/exports <<EOF
$SHARE_DIR *(rw,sync,no_root_squash)
EOF

# 重新加载exports配置
echo "重新加载exports配置..."
exportfs -ra

# 启动并启用nfs服务
echo "启动nfs服务..."
systemctl start nfs-server

echo "设置nfs服务开机自启动..."
systemctl enable nfs-server

echo "NFS服务器配置完成。"

# 提示用户是否在本地安装NFS客户端
read -p "是否在本地安装NFS客户端?(y/n, 默认n): " INSTALL_LOCAL

if [[ "$INSTALL_LOCAL" == "y" ]]; then
    # 安装nfs客户端
    echo "安装nfs客户端..."
    yum install -y nfs-utils
    echo "NFS客户端安装完成。"
fi

# 提示用户输入目标服务器的IP地址,支持多个IP地址
read -p "请输入目标服务器的IP地址,多个IP地址用逗号分隔(留空跳过): " TARGET_IPS

# 如果用户没有输入目标IP地址,则跳过分发步骤
if [ -z "$TARGET_IPS" ]; then
    echo "未输入目标服务器IP地址,跳过分发步骤。"
else
    # 将逗号分隔的IP地址转换为数组
    IFS=',' read -r -a TARGET_IP_ARRAY <<< "$TARGET_IPS"

    # 定义目标服务器的用户名(默认 root)
    TARGET_USER="root"

    # 定义目标服务器上的目标路径
    TARGET_DIR="/root/"

    # 定义脚本文件名
    SCRIPT_FILE="setup_nfs.sh"

    # 将当前脚本内容保存到临时文件
    echo "将当前脚本保存为临时文件 $SCRIPT_FILE ..."
    cat > "$SCRIPT_FILE" <<EOF
#!/bin/bash

# 安装nfs-utils和rpcbind
echo "安装nfs-utils和rpcbind..."
yum install -y nfs-utils rpcbind

# 提示用户输入共享路径的目录
read -p "请输入NFS共享目录的路径(例如 /home/nfs): " SHARE_DIR

# 如果用户没有输入,则使用默认值 /home/nfs
if [ -z "\$SHARE_DIR" ]; then
    SHARE_DIR="/home/nfs"
    echo "未输入共享目录路径,使用默认值 \$SHARE_DIR"
fi

# 创建NFS共享目录
echo "创建NFS共享目录 \$SHARE_DIR..."
mkdir -p "\$SHARE_DIR"
chmod -R 777 "\$SHARE_DIR"  # 将权限改为777

# 配置exports文件
echo "配置 /etc/exports..."
cat > /etc/exports <<EOL
\$SHARE_DIR *(rw,sync,no_root_squash)
EOL

# 重新加载exports配置
echo "重新加载exports配置..."
exportfs -ra

# 启动并启用nfs服务
echo "启动nfs服务..."
systemctl start nfs-server

echo "设置nfs服务开机自启动..."
systemctl enable nfs-server

echo "NFS服务器配置完成。"
EOF

    # 设置脚本权限
    chmod +x "$SCRIPT_FILE"

    # 遍历所有目标服务器,发送并执行脚本
    for TARGET_IP in "${TARGET_IP_ARRAY[@]}"; do
        echo "处理目标服务器 $TARGET_IP..."

        # 确保目标路径存在
        echo "在目标服务器 $TARGET_IP 上创建目标路径 $TARGET_DIR ..."
        ssh "$TARGET_USER@$TARGET_IP" "mkdir -p $TARGET_DIR"

        # 将脚本发送到目标服务器
        echo "将脚本 $SCRIPT_FILE 发送到目标服务器 $TARGET_IP ..."
        scp "$SCRIPT_FILE" "$TARGET_USER@$TARGET_IP:$TARGET_DIR"

        # 在目标服务器上执行脚本
        echo "在目标服务器 $TARGET_IP 上执行脚本..."
        ssh "$TARGET_USER@$TARGET_IP" "chmod +x $TARGET_DIR/$SCRIPT_FILE && $TARGET_DIR/$SCRIPT_FILE"
    done

    # 删除本地的临时脚本文件
    echo "删除本地的临时脚本文件 $SCRIPT_FILE ..."
    rm "$SCRIPT_FILE"

    echo "NFS配置脚本已成功发送并在所有目标服务器上执行。"
fi

在这里插入图片描述

4.pg数据库脚本化安装(离线)

使用方法

dos2unix pg.sh
sh pg.sh

代码

#!/bin/bash

set -e  # 出现错误时退出脚本

function setup_logging {
    log_file="/var/log/pg_install.log"
    touch "$log_file"
    exec > >(tee -i "$log_file") 2>&1
    echo "日志文件:$log_file"
}

function install_postgresql {
    # 引入日志记录
    setup_logging

    # 提示用户输入源码包的存放路径
    echo "请输入 PostgreSQL 源码包的存放路径(例如 /data/sources):"
    read -r source_path

    # 在指定路径下查找 .tar.gz 或 .tar 文件
    source_file=$(find "$source_path" -type f \( -name "*.tar.gz" -o -name "*.tar" \) -print -quit)

    # 检查是否找到文件
    if [ -z "$source_file" ]; then
        echo "未在路径 $source_path 下找到 .tar.gz 或 .tar 文件。请检查路径并重新运行脚本。"
        exit 1
    fi

    # 解压找到的源码包
    echo "正在解压 $source_file..."
    tar -zxvf "$source_file"

    # 获取解压后的目录名
    tar_dir=$(tar -tf "$source_file" | head -1 | cut -f1 -d"/")

    # 进入解压后的目录
    cd "$tar_dir" || { echo "无法进入目录 $tar_dir。请检查解压结果。"; exit 1; }

    # 添加 PostgreSQL 用户
    useradd postgresql

    # 提示用户是否要手动设置密码
    echo "是否要手动设置 PostgreSQL 用户的密码? (y/n)"
    read -r answer

    if [[ "$answer" == "y" ]]; then
        # 提示用户手动输入密码
        passwd postgresql
    else
        # 使用默认密码 root1234
        echo "postgresql:root1234" | chpasswd
        echo "默认密码 root1234 已设置。"
    fi

    # 提示用户是否已经手动创建了数据目录
    echo "是否已经手动创建了 PostgreSQL 数据目录? (y/n)"
    read -r data_dir_answer

    if [[ "$data_dir_answer" != "y" ]]; then
        # 提示用户输入数据目录路径
        echo "请输入 PostgreSQL 数据目录的路径(例如 /data/postgresql/data):"
        read -r data_dir_path

        # 创建 PostgreSQL 数据目录
        mkdir -p "$data_dir_path"
        chown -R postgresql:postgresql "$data_dir_path"
        chmod 750 "$data_dir_path"
    else
        # 提示用户输入现有的数据目录路径
        echo "请输入现有的 PostgreSQL 数据目录的路径(例如 /data/postgresql/data):"
        read -r data_dir_path
    fi

    # 提示用户是否已经手动创建了安装路径
    echo "是否已经手动创建了 PostgreSQL 安装路径(例如 /data/postgresql/pgsql)? (y/n)"
    read -r install_dir_answer

    if [[ "$install_dir_answer" != "y" ]]; then
        # 提示用户输入 PostgreSQL 安装路径
        echo "请输入 PostgreSQL 安装路径(例如 /data/postgresql/pgsql):"
        read -r install_path

        # 创建 PostgreSQL 安装路径
        mkdir -p "$install_path"
        chown -R postgresql:postgresql "$install_path"
        chmod 750 "$install_path"
    else
        # 提示用户输入现有的安装路径
        echo "请输入现有的 PostgreSQL 安装路径(例如 /data/postgresql/pgsql):"
        read -r install_path
    fi

    # 更新 yum 缓存
    yum makecache fast

    # 定义依赖包列表
    dependencies=(
        readline-devel
        systemtap
        systemtap-sdt-devel
        perl-ExtUtils-Embed
        pam
        pam-devel
        libxml2
        libxml2-devel
        libxslt
        libxslt-devel
        python3-devel
        libicu-devel
        zlib-devel
    )

    # 检查并安装缺失的依赖包
    for pkg in "${dependencies[@]}"; do
        if ! rpm -q "$pkg" &> /dev/null; then
            echo "未安装依赖包 $pkg,正在安装..."
            yum install -y "$pkg"
        fi
    done

    # 特殊处理 python2-devel
    if ! rpm -q python2-devel &> /dev/null; then
        echo "未找到 python2-devel,尝试安装 python3-devel 替代..."
        yum install -y python3-devel
    fi

    # 配置 PostgreSQL 的安装选项
    ./configure --prefix="$install_path" --with-pgport=5432 --with-libraries="$install_path/lib" --with-includes="$install_path/include" --with-perl --with-python --with-openssl --with-pam --with-libxml --with-libxslt

    # 编译并安装 PostgreSQL
    make && make install

    # 设置安装目录权限
    chown -R postgresql:postgresql "$install_path"
    chmod 750 "$install_path"

    # 初始化数据库
    su - postgresql -c "$install_path/bin/initdb -D $data_dir_path"

    # 启动 PostgreSQL 服务
    su - postgresql -c "$install_path/bin/pg_ctl -D $data_dir_path -l $data_dir_path/logfile start"

    # 修改环境变量
    cat <<EOF >> /etc/profile
export PATH=$install_path/bin:\$PATH
export PGHOME=$install_path
export PGDATA=$data_dir_path
export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:\$PGHOME/lib
EOF

    # 使环境变量生效
    source /etc/profile

    # 创建 systemd 服务单元文件
    cat <<EOF > /etc/systemd/system/postgresql.service
[Unit]
Description=PostgreSQL database server
After=network.target

[Service]
Type=forking
User=postgresql
Group=postgresql
Environment=PGPORT=5432
Environment=PGDATA=$data_dir_path
ExecStart=$install_path/bin/pg_ctl start -D \$PGDATA -l \$PGDATA/logfile
ExecStop=$install_path/bin/pg_ctl stop -D \$PGDATA -m fast
ExecReload=$install_path/bin/pg_ctl reload -D \$PGDATA
TimeoutSec=300

[Install]
WantedBy=multi-user.target
EOF

    # 重新加载 systemd 配置
    systemctl daemon-reload

    # 询问用户是否设置开机自启动
    echo "是否设置 PostgreSQL 为开机自启动? (y/n)"
    read -r enable_answer

    if [[ "$enable_answer" == "y" ]]; then
        # 启用 PostgreSQL 服务
        systemctl enable postgresql
        echo "PostgreSQL 已设置为开机自启动。"
    else
        echo "PostgreSQL 未设置为开机自启动。"
    fi

    # 启动 PostgreSQL 服务
    systemctl start postgresql

    echo "PostgreSQL 数据库安装并启动成功。"

    # 修改 postgresql.conf 文件
    modify_postgresql_conf "$data_dir_path"

    # 修改 pg_hba.conf 文件
    modify_pg_hba_conf "$data_dir_path"
}

function modify_postgresql_conf {
    local data_dir_path=$1

    # 编辑 postgresql.conf 文件
    echo "正在修改 $data_dir_path/postgresql.conf 文件..."

    # 修改第60行 listen_addresses 的值为 '*'
    sed -i '60s/^#//; 60s/localhost/*/' "$data_dir_path/postgresql.conf"

    # 修改第64行 port 的值为 5432
    sed -i '64s/^#//' "$data_dir_path/postgresql.conf"

    echo "postgresql.conf 文件修改完成。"
}

function modify_pg_hba_conf {
    local data_dir_path=$1

    # 编辑 pg_hba.conf 文件
    echo "正在修改 $data_dir_path/pg_hba.conf 文件..."

    # 在匹配行后添加新的配置行
    sed -i '/# IPv4 local connections:/ a \
host    all             all             0.0.0.0/0               md5' "$data_dir_path/pg_hba.conf"

    echo "pg_hba.conf 文件修改完成。"
}

# 执行 PostgreSQL 安装
install_postgresql

问题

开机自启可提供选择,如果选择启用可能会报错,或者安装好后会报错,看一下之前创建的数据路径底下的logfile

在这里插入图片描述

5.nginx脚本化安装(离线)

使用方法

dos2unix nginx.sh
sh nginx.sh

代码

#!/bin/bash

# 检查并创建目录
check_and_create_dir() {
    local dir=$1
    if [ ! -d "$dir" ]; then
        read -p "目录 $dir 不存在,是否现在创建?(y/n): " choice
        if [ "$choice" = "y" ]; then
            mkdir -p "$dir"
            echo "目录 $dir 已创建"
        else
            echo "跳过创建目录 $dir,这可能导致后续操作失败"
            exit 1
        fi
    else
        echo "目录 $dir 已存在,跳过创建"
    fi
}

# 检查文件是否存在
check_file() {
    local file=$1
    if [ ! -f "$file" ]; then
        echo "文件 $file 不存在,请下载后再运行此脚本"
        exit 1
    fi
}

# 解压缩文件到指定目录
unzip_file() {
    local file=$1
    local dir=$2
    check_file "$file"
    unzip -o "$file" -d "$dir"
    echo "文件 $file 已解压缩到 $dir"
}

# 解压 .tar.gz 文件到指定目录
untar_file() {
    local file=$1
    local dir=$2
    check_file "$file"
    tar -xvf "$file" -C "$dir"
    echo "文件 $file 已解压到 $dir"
}

# 检查 RPM 包是否已安装,如果未安装且 RPM 文件存在,则安装
check_and_install_rpm() {
    local rpm_file=$1
    local package_name=$2
    if rpm -q "$package_name" > /dev/null; then
        echo "包 $package_name 已安装,跳过"
    else
        if [ -f "$rpm_file" ]; then
            rpm -ivh "$rpm_file" --nodeps
            echo "RPM 包 $rpm_file 已安装"
        else
            echo "RPM 包 $rpm_file 不存在,尝试使用 yum 安装"
            yum install -y "$package_name"
            if [ $? -ne 0 ]; then
                echo "yum 安装 $package_name 失败,请手动安装"
                exit 1
            fi
        fi
    fi
}

# 获取用户指定的解压目录路径,默认为 /data/nginxzip
read -p "请输入文件解压目录(默认为 /data/nginxzip): " dir
dir=${dir:-/data/nginxzip}

# 获取 nginx.zip 的具体路径,默认为 /data/nginx.zip
read -p "请指定 nginx.zip 的完整路径(例如:/data/nginx.zip): " nginx_zip_path
nginx_zip_path=${nginx_zip_path:-/data/nginx.zip}

# 提示用户创建目录
echo "请确保以下目录已创建在您的系统中,否则脚本将自动为您创建它们:"
echo "$dir"

# 暂停以允许用户手工创建目录
read -p "按 Enter 键继续或者退出脚本后手工创建... " -rs
echo

# 检查并创建目录
check_and_create_dir "$dir"

# 检查文件是否存在
check_file "$nginx_zip_path"

# 解压 nginx.zip
unzip_file "$nginx_zip_path" "$dir"

# 检查并解压其他文件
files=("nginx-1.20.2.tar.gz" "pcre-8.41.zip" "openssl-1.1.1j.tar.gz" "zlib-1.3.1.tar.gz")
for file in "${files[@]}"; do
    check_file "$dir/$file"
done

unzip_file "$dir/pcre-8.41.zip" "$dir"
untar_file "$dir/nginx-1.20.2.tar.gz" "$dir"
untar_file "$dir/openssl-1.1.1j.tar.gz" "$dir"
untar_file "$dir/zlib-1.3.1.tar.gz" "$dir"

# 安装所需的 RPM 包
rpms=(
    "cpp-4.8.5-44.el7.x86_64.rpm gcc"
    "gcc-4.8.5-44.el7.x86_64.rpm gcc"
    "gcc-c++-4.8.5-36.el7.x86_64.rpm gcc-c++"
    "glibc-2.17-317.el7.x86_64.rpm glibc"
    "glibc-common-2.17-317.el7.x86_64.rpm glibc-common"
    "glibc-devel-2.17-317.el7.x86_64.rpm glibc-devel"
    "glibc-headers-2.17-317.el7.x86_64.rpm glibc-headers"
    "libstdc++-devel-4.8.5-36.el7.x86_64.rpm libstdc++-devel"
)

for rpm in "${rpms[@]}"; do
    rpm_file=$(echo "$rpm" | cut -d' ' -f1)
    package_name=$(echo "$rpm" | cut -d' ' -f2)
    check_and_install_rpm "$rpm_file" "$package_name"
done

echo "所有解压和依赖包安装已完成,开始编译和安装组件..."

# 第一步:编译安装 OpenSSL
echo "编译安装 OpenSSL..."
cd "$dir/openssl-1.1.1j/"
./config
if [ $? -eq 0 ]; then
    make
    if [ $? -eq 0 ]; then
        make install
        if [ $? -eq 0 ]; then
            echo "OpenSSL 安装成功!"
        else
            echo "OpenSSL make install 失败!"
            exit 1
        fi
    else
        echo "OpenSSL make 失败!"
        exit 1
    fi
else
    echo "OpenSSL 配置失败!"
    exit 1
fi
cd -

# 第二步:编译安装 pcre
echo "编译安装 pcre..."
cd "$dir/pcre-8.41/"
./configure
if [ $? -eq 0 ]; then
    make
    if [ $? -eq 0 ]; then
        make install
        if [ $? -eq 0 ]; then
            echo "pcre 安装成功!"
        else
            echo "pcre make install 失败!"
            exit 1
        fi
    else
        echo "pcre make 失败!"
        exit 1
    fi
else
    echo "pcre 配置失败!"
    exit 1
fi
cd -

# 第三步:编译安装 zlib
echo "编译安装 zlib..."
cd "$dir/zlib-1.3.1/"
./configure
if [ $? -eq 0 ]; then
    make
    if [ $? -eq 0 ]; then
        make install
        if [ $? -eq 0 ]; then
            echo "zlib 安装成功!"
        else
            echo "zlib make install 失败!"
            exit 1
        fi
    else
        echo "zlib make 失败!"
        exit 1
    fi
else
    echo "zlib 配置失败!"
    exit 1
fi
cd -

# 第四步:编译安装 Nginx
echo "编译安装 Nginx..."
cd "$dir/nginx-1.20.2/"
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-pcre=../pcre-8.41 --with-openssl=../openssl-1.1.1j --with-stream
if [ $? -eq 0 ]; then
    make
    if [ $? -eq 0 ]; then
        make install
        if [ $? -eq 0 ]; then
            echo "Nginx 安装成功!"
        else
            echo "Nginx make install 失败!"
            exit 1
        fi
    else
        echo "Nginx make 失败!"
        exit 1
    fi
else
    echo "Nginx 配置失败!"
    exit 1
fi
cd -

# 复制 nginx 到 /usr/bin 目录
if [ -f "/usr/local/nginx/sbin/nginx" ]; then
    cp /usr/local/nginx/sbin/nginx /usr/bin/
    if [ $? -eq 0 ]; then
        echo "nginx 已成功复制到 /usr/bin 目录"
    else
        echo "复制 nginx 到 /usr/bin 目录失败"
        exit 1
    fi
else
    echo "/usr/local/nginx/sbin/nginx 文件不存在,请检查 Nginx 是否正确安装"
    exit 1
fi

# 检查 nginx 是否可执行
if [ -x "/usr/bin/nginx" ]; then
    echo "nginx 在 /usr/bin 目录下已可用"
else
    echo "nginx 在 /usr/bin 目录下不可执行,请检查文件权限"
    exit 1
fi

# 修改 nginx.conf 文件中的端口号
echo "修改 nginx.conf 文件中的端口号..."
sed -i '36s/listen       80;/listen       8088;/' /usr/local/nginx/conf/nginx.conf

# 验证修改是否成功
if grep -q "listen       8088;" /usr/local/nginx/conf/nginx.conf; then
    echo "nginx.conf 文件中的端口号已成功修改为 8088"
else
    echo "nginx.conf 文件中的端口号修改失败,请手动检查文件"
    exit 1
fi

# 定义 Nginx 服务文件内容
nginx_service_content='[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target'

# 创建 Nginx 服务文件
echo "创建 Nginx 服务文件 /etc/systemd/system/nginx.service"
echo "$nginx_service_content" | sudo tee /etc/systemd/system/nginx.service > /dev/null

if [ $? -ne 0 ]; then
    echo "创建 Nginx 服务文件失败!"
    exit 1
fi

# 重新加载 systemd 配置
echo "重新加载 systemd 配置"
sudo systemctl daemon-reload

if [ $? -ne 0 ]; then
    echo "重新加载 systemd 配置失败!"
    exit 1
fi

# 启用 Nginx 服务
echo "启用 Nginx 服务"
sudo systemctl enable nginx

if [ $? -ne 0 ]; then
    echo "启用 Nginx 服务失败!"
    exit 1
fi

# 启动 Nginx 服务
echo "启动 Nginx 服务"
sudo systemctl start nginx

if [ $? -ne 0 ]; then
    echo "启动 Nginx 服务失败!"
    exit 1
fi

# 检查 Nginx 服务状态
echo "检查 Nginx 服务状态"
sudo systemctl status nginx

if [ $? -ne 0 ]; then
    echo "检查 Nginx 服务状态失败!"
    exit 1
fi

echo "所有操作已完成!"

在这里插入图片描述


总结

脚本就是无脑话和不动手安装,本文不存在抄袭,都是自己平时觉得步骤繁琐,根据经验写的,可能有不足大家多多包涵,后续会更新k8s脚本化安装。我已经把脚本上传到资源(脚本.zip)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2277859.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k8s物料清单工具——KubeClarity

介绍 KubeClarity是一个用于检测和管理容器镜像和文件系统的软件清单&#xff08;SBOM&#xff09;和漏洞的工具。它扫描运行时的K8s集群和CI/CD流水线&#xff0c;以增强软件供应链安全性。 安装 添加 helm 仓库 helm repo add kubeclarity https://openclarity.github.io…

citrix netscaler13.1 重写负载均衡响应头(基础版)

在 Citrix NetScaler 13.1 中&#xff0c;Rewrite Actions 用于对负载均衡响应进行修改&#xff0c;包括替换、删除和插入 HTTP 响应头。这些操作可以通过自定义策略来完成&#xff0c;帮助你根据需求调整请求内容。以下是三种常见的操作&#xff1a; 1. Replace (替换响应头)…

Linux Centos 安装Jenkins到服务

一、前言 假设你已经下载了jenkins.war 安装了对应的jdk&#xff0c;下面我们来安装jenkins&#xff0c;以服务的形式安装。 二、安装 1&#xff09;将jenkins.war拷贝到合适的位置&#xff0c;我的位置 /u01/jenkins/ &#xff0c;位置你自己选。 2&#xff09;创建系统用户…

网安——计算机网络基础

一、计算机网络概述 1、Internet网相关概念及发展 网络&#xff08;Network&#xff09;有若干结点&#xff08;Node&#xff09;和连接这些结点的链路&#xff08;link&#xff09;所组成&#xff0c;在网络中的结点可以是计算机、集线器、交换机或路由器等多个网络还可以通…

Xcode 正则表达式实现查找替换

在软件开发过程中&#xff0c;查找和替换文本是一项常见的任务。正则表达式&#xff08;Regular Expressions&#xff09;是一种强大的工具&#xff0c;可以帮助我们在复杂的文本中进行精确的匹配和替换。Xcode 作为一款流行的开发工具&#xff0c;提供了对正则表达式的支持。本…

数据结构9——二叉搜索树

&#x1f947;1.二叉搜索树的概念 二叉搜索树(Binary Search Tree,BST)又称二叉排序树或二叉查找树&#xff0c;其要么是一棵空树&#xff0c;要么具有以下性质&#xff1a; ①&#xff1a;左子树上所有节点的值都小于根节点&#xff1b; ②&#xff1a;右子树上所有节点的值都…

leetcode刷题记录(四十八)——128. 最长连续序列

&#xff08;一&#xff09;问题描述 128. 最长连续序列 - 力扣&#xff08;LeetCode&#xff09;128. 最长连续序列 - 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。请你设计并实现时间复…

c语言——【linux】多进程编程 【进程的创建,相关shell指令,进程状态切换,回收资源,守护进程等】

1.思维导图 2.进程的创建 函数原型&#xff1a;pid_t fork(void); 功能描述&#xff1a;以当前进程为父进程&#xff0c;创建一个子进程 进程链和进程扇的创建 3.多进程具体使用 3.1进程替换 exec 函数一族 int execl(const char *path, const char *arg, ... /* (char *) N…

在服务器上增加新网段IP的路由配置

在服务器上增加新网段IP的路由配置 前提条件步骤一:检查当前路由表步骤二:添加新路由步骤三:验证新路由步骤四:持久化路由配置脚本示例结论在网络管理中,路由配置是一项基本且重要的任务。它决定了数据包在网络中的传输路径。本文将详细介绍如何在服务器上增加新的路由配置…

国产fpga nvme ip高速存储方案设计

国产高速存储方案主要是使用nvme ip实现高速存储方案&#xff0c;nvme ip采用纯verilog语言实现&#xff0c;用户拿到nvme ip使用起来也很简单。 先看看效果如 zu7eg板子&#xff0c;这个芯片支持pcie3.0 x4. zynq 7045板子只支持pcie 2.0 x4 速度测试&#xff0c;测试nvme …

浅谈云计算14 | 云存储技术

云存储技术 一、云计算网络存储技术基础1.1 网络存储的基本概念1.2云存储系统结构模型1.1.1 存储层1.1.2 基础管理层1.1.3 应用接口层1.1.4 访问层 1.2 网络存储技术分类 二、云计算网络存储技术特点2.1 超大规模与高可扩展性2.1.1 存储规模优势2.1.2 动态扩展机制 2.2 高可用性…

[操作系统] 深入理解约翰·冯·诺伊曼体系

约翰冯诺依曼&#xff08;John von Neumann&#xff0c;1903年12月28日—1957年2月8日&#xff09;&#xff0c;原名诺伊曼亚诺什拉约什&#xff08;Neumann Jnos Lajos&#xff09;&#xff0c;出生于匈牙利的美国籍犹太人数学家&#xff0c;20世纪最重要的数学家之一&#xf…

ElasticSearch上

安装ElasticSearch Lucene&#xff1a;Java语言的搜索引擎类库&#xff0c;易扩展&#xff1b;高性能&#xff08;基于倒排索引&#xff09;Elasticsearch基于Lucene&#xff0c;支持分布式&#xff0c;可水平扩展&#xff1b;提供Restful接口&#xff0c;可被任何语言调用Ela…

Qt应用之MDI(多文档设计)

qt creator 版本6.8.0 MinGW 64bit 由此模块可以扩展成设计一个qt文本编辑器。 界面如下 部分功能展示如下 新建文件 打开文件 mdi模式、级联模式和平铺模式 界面和程序构建过程。 1.如图所需.cpp和.h文件 2.mainwindow.ui和tformdoc.ui界面布局如下 不懂什么是Action如何…

【博主推荐】VUE常见问题及解决方案

文章目录 1.找不到模块“../views/index.vue”或其相应的类型声明。ts(2307)2.当改变 Vue 实例中的数据时&#xff0c;视图没有相应地更新3.在某些复杂的异步操作或者多个数据交互场景下&#xff0c;数据绑定的更新在时间上出现延迟4.父组件无法将数据正确地传递给子组件&#…

【Apache Doris】周FAQ集锦:第 29 期

引言 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和开发者分享有关 Apache Doris 的常见问题。 通过这个每周 FAQ 栏目&#xff0c;希望帮助社…

TensorFlow DAY3: 高阶 API(Keras,Estimator)(完)

TensorFlow 作为深度学习框架&#xff0c;当然是为了帮助我们更便捷地构建神经网络。所以&#xff0c;本次实验将会了解如何使用 TensorFlow 来构建神经网络&#xff0c;并学会 TensorFlow 构建神经网络的重要函数和方法。 知识点 Keras 顺序模型Keras 函数模型Keras 模型存储…

【React】脚手架进阶

目录 暴露webpack配置package.json的变化修改webpack.config.js配置less修改域名、端口号浏览器兼容处理处理跨域 暴露webpack配置 react-scripts对脚手架中的打包命令进行封装&#xff0c;如何暴露这些打包配置呢&#xff1f;上篇写到在package.json中的scripts配置项中有eje…

Thrustmaster Hotas Warthog飞行操作杆开发

目录 0 摘 要 &#xff1a;简单说一下这篇文章在搞啥 1 背 景 &#xff1a;什么需求以及对开发的背景调查 2 环境配置 &#xff1a;具体需要什么环境&#xff0c;对软件层面的需求 3 硬件测试 &#xff1a;测试遥感器…

OpenCV基于均值漂移算法(pyrMeanShiftFiltering)的水彩画特效

1、均值漂移算法原理 pyrMeanShiftFiltering算法结合了均值迁移&#xff08;Mean Shift&#xff09;算法和图像金字塔&#xff08;Image Pyramid&#xff09;的概念&#xff0c;用于图像分割和平滑处理。以下是该算法的详细原理&#xff1a; 1.1 、均值迁移&#xff08;Mean …