引言

这里主要是一个一键编译安装 Nginx的脚本

修订记录

序号时间修改内容
12024.04.23创建Nginx的脚本安装文件
22024.04.24补充用户配置修改部分
32024.04.25补充Nginx安装前检测

详细教程

这里的脚本是对源码编译方式进行浓缩的,如果遇到一些报错或异常

欢迎移步源码编译Nginx的教程文档

快速执行

复制下面的内容,直接粘贴到服务器的控制台即可

wget http://static.hw13.cn/usr/uploads/2024/04/nginx.sh && sh nginx.sh

注意,脚本内部有一些敏感操作,需要当前执行的用户有 sudo权限,请使用具有 sudo权限的用户执行,或使用 root用户执行

脚本正文

#!/bin/bash

# 【版本确定】要安装的Nginx版本
NGINX_VERSION=""
# 【存放位置】要安装的Nginx源码包存放位置
NGINX_SRC_DIR=""
# 【安装位置】要安装的Nginx位置
NGINX_INSTALL_DIR=""
# 【用户名】Nginx启动用户名
NGINX_USER=""
# 【输出开关】Nginx编译过程是否输出
NGINX_OUTPUT=false

# 默认值
NGINX_DEFAULT_USER="nginx"
NGINX_DEFAULT_VERSION="1.25.3"
NGINX_DEFAULT_SRC_DIR="/server/data/packages"
NGINX_DEFAULT_OUTPUT=false

readUserInputConfig()
{
    echo "------------------------------------ NGINX 脚本安装程序 ------------------------------------"
    read -p "请输入源码包存放位置(默认:${NGINX_DEFAULT_SRC_DIR},不修改直接回车):" NGINX_SRC_DIR
    read -p "请输入nginx使用的用户名(默认:${NGINX_DEFAULT_USER},不修改直接回车):" NGINX_USER
    read -p "请输入nginx版本号(默认:${NGINX_DEFAULT_VERSION},不修改直接回车):" NGINX_VERSION
    read -p "是否需要输出运行结果(默认:${NGINX_DEFAULT_OUTPUT},不修改直接回车):" NGINX_OUTPUT

    # 预防用户空输入
    if [[ -z ${NGINX_USER} ]]
    then
        NGINX_USER=$NGINX_DEFAULT_USER
    fi

    # 预防用户空输入
    if [[ -z ${NGINX_VERSION} ]]
    then
        NGINX_VERSION=$NGINX_DEFAULT_VERSION
    fi

    # 预防用户空输入
    if [[ -z ${NGINX_OUTPUT} ]]
    then
        NGINX_OUTPUT=$NGINX_DEFAULT_OUTPUT
    fi

    NGINX_DEFAULT_INSTALL_DIR="/server/nginx/$NGINX_VERSION"
    read -p "请输入nginx安装位置(默认:${NGINX_DEFAULT_INSTALL_DIR},不修改直接回车):" NGINX_INSTALL_DIR

    # 预防用户空输入
    if [[ -z ${NGINX_INSTALL_DIR} ]]
    then
        NGINX_INSTALL_DIR=$NGINX_DEFAULT_INSTALL_DIR
    fi

    # 预防用户空输入
    if [[ -z ${NGINX_SRC_DIR} ]]
    then
        NGINX_SRC_DIR=$NGINX_DEFAULT_SRC_DIR
    fi

    while [[ true ]]; do
        confirmInstallConfig
        read -p "是否确认配置并进行安装(yes):" NGINX_CONFIRM

        if [[ ${NGINX_CONFIRM} == "yes" ]]
        then
            break
        fi
    done
    echo "现在开始安装……"
}

confirmInstallConfig()
{
    echo "---------------------------------- 安装配置确认 --------------------------------------------"

    echo "Nginx的使用用户为:${NGINX_USER}"
    echo "Nginx的版本号为:${NGINX_VERSION}"
    echo "Nginx的安装位置为:${NGINX_INSTALL_DIR}"
    echo "Nginx的源码包存放位置为:${NGINX_SRC_DIR}"
    echo "Nginx安装过程是否需要输出:${NGINX_OUTPUT}"
}

# 主安装程序
main()
{
    # 检查nginx是否监听80端口
    sudo ps -aux | grep 'nginx: worker process' | grep -v grep
    if [ $? -eq 0 ]; then
        echo "【错误】当前Nginx已经安装上了,无需重复安装"
        exit 1
    fi

    # 安装依赖项
    sudo yum install -y zlib-devel openssl-devel pcre pcre-devel
    if [ $? -ne 0 ]; then
        echo "【错误】安装依赖项错误"
        exit 1
    fi

    # 添加nginx用户(如果尚未存在)
    id $NGINX_USER
    if [ $? -ne 0 ]; then
        sudo useradd $NGINX_USER -s /sbin/nologin -M
    fi

    # 创建源码包存放目录、安装目录
    sudo mkdir -p $NGINX_SRC_DIR $NGINX_INSTALL_DIR
    sudo chown -R $USER.$USER $NGINX_SRC_DIR
    sudo chown -R $USER.$USER $NGINX_INSTALL_DIR

    # 进入Nginx源码包存放目录
    cd $NGINX_SRC_DIR

    # 下载nginx源码包
    wget https://nginx.org/download/nginx-$NGINX_VERSION.tar.gz
    if [ $? -ne 0 ]; then
        echo "【错误】下载nginx源代码包出错"
        exit 1
    fi

    # 解压源码包
    tar -xzvf nginx-$NGINX_VERSION.tar.gz
    if [ $? -ne 0 ]; then
        echo "【错误】提取nginx源包时出错"
        exit 1
    fi

    # 进入解压后的目录
    cd nginx-$NGINX_VERSION

    # 配置nginx
    ./configure \
        --prefix=$NGINX_INSTALL_DIR \
        --user=$NGINX_USER \
        --group=$NGINX_USER \
        --with-http_ssl_module \
        --with-http_stub_status_module
    if [ $? -ne 0 ]; then
        echo "【错误】配置nginx出错"
        exit 1
    fi

    # 编译和安装nginx
    make
    if [ $? -ne 0 ]; then
        echo "【错误】编译nginx时出错"
        exit 1
    fi
    make install
    if [ $? -ne 0 ]; then
        echo "【错误】编译后安装nginx时出错"
        exit 1
    fi

    # 开放端口给程序占用(允许非root用户也可以执行nginx的启动(需要root执行))
    sudo setcap cap_net_bind_service=+eip $NGINX_INSTALL_DIR/sbin/nginx

    # 使用命令来启动nginx
    $NGINX_INSTALL_DIR/sbin/nginx

    # 检查nginx是否监听80端口
    sudo netstat -nltp | grep :80
    if [ $? -ne 0 ]; then
        echo "【错误】Nginx没有监听80端口。"
    else
        echo "Nginx正在80端口上运行和侦听"
    fi

    $NGINX_INSTALL_DIR/sbin/nginx -v
}

# 用户输入自定义配置
readUserInputConfig

# 调用函数执行
if [[ $NGINX_OUTPUT ]]; then
    main
else
    main > /dev/null 2>&1
fi

欢迎关注拓行公众号,分享各种技术博客文章

拓行——奋勇进取,开拓未来,砥砺前行

最后修改:2024 年 04 月 25 日
如果您对各种技术博客文章感兴趣,欢迎关注拓行公众号,分享各种专业技术知识~