Nginx 实战系列(七)—— Nginx一键安装脚本详解

文章目录

前言

在Web服务领域,Nginx因其高性能、高并发和低内存占用等特点,已成为最受欢迎的Web服务器和反向代理服务器之一。然而,手动编译安装Nginx往往步骤繁琐,容易出错,尤其是在生产环境中,快速、可靠地部署Nginx显得尤为重要。

本文将以一个自动安装Nginx的Shell脚本为基础,详细介绍如何在CentOS系统上自动化完成Nginx的安装、配置和服务管理,帮助系统管理员和开发者提升部署效率,减少人为错误。


一、脚本基础设置

1.1 权限验证

脚本首先检查当前用户是否为root用户,确保具有执行安装所需的权限:

bash 复制代码
if [ $(id -u) -ne 0 ]; then
    echo "请使用root用户运行此脚本!"
    exit 1
fi

1.2 变量定义

定义Nginx版本、下载地址、安装路径等变量,便于后续维护和修改:

bash 复制代码
NGINX_VERSION="1.20.2"
NGINX_URL="https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz"
INSTALL_DIR="/opt"
NGINX_SOURCE_DIR="${INSTALL_DIR}/nginx-${NGINX_VERSION}"
NGINX_INSTALL_DIR="/usr/local/nginx"

二、系统环境准备

2.1 关闭防火墙与SELinux

为避免端口访问限制,脚本会临时关闭防火墙并禁用SELinux:

bash 复制代码
echo "正在关闭防火墙和SELinux..."
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

注意:生产环境中请根据实际安全策略调整,不建议直接禁用SELinux。


三、依赖安装与用户配置

3.1 安装编译依赖

安装编译Nginx所需的开发工具和库:

bash 复制代码
echo "正在安装依赖包..."
yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel wget > /dev/null

3.2 创建Nginx运行用户

为Nginx创建一个无登录权限的系统用户,提升安全性:

bash 复制代码
echo "正在创建Nginx运行用户..."
if ! id -u nginx &>/dev/null; then
    useradd -M -s /sbin/nologin nginx
else
    echo "用户nginx已存在,跳过创建"
fi

四、Nginx源码编译与安装

4.1 下载与解压源码

下载Nginx源码并解压到指定目录:

bash 复制代码
echo "正在下载Nginx源码..."
cd ${INSTALL_DIR}
if [ ! -f "nginx-${NGINX_VERSION}.tar.gz" ]; then
    wget ${NGINX_URL} > /dev/null
else
    echo "Nginx源码包已存在,跳过下载"
fi

if [ -d "${NGINX_SOURCE_DIR}" ]; then
    echo "删除已存在的源码目录..."
    rm -rf ${NGINX_SOURCE_DIR}
fi

echo "正在解压Nginx源码..."
tar zxvf nginx-${NGINX_VERSION}.tar.gz -C ${INSTALL_DIR} > /dev/null

4.2 配置编译选项

配置Nginx编译参数,包括安装路径、运行用户和启用模块:

bash 复制代码
echo "正在编译安装Nginx..."
cd ${NGINX_SOURCE_DIR}

./configure \
--prefix=${NGINX_INSTALL_DIR} \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module > /dev/null

if [ $? -ne 0 ]; then
    echo "配置失败,请检查错误!"
    exit 1
fi

启用http_stub_status_module用于状态监控,http_ssl_module支持HTTPS。

4.3 编译与安装

执行编译和安装过程:

bash 复制代码
make > /dev/null && make install > /dev/null
if [ $? -ne 0 ]; then
    echo "编译安装失败,请检查错误!"
    exit 1
fi

五、服务配置与管理

5.1 创建软链接

将Nginx可执行文件链接到系统路径:

bash 复制代码
echo "创建Nginx命令软链接..."
ln -sf ${NGINX_INSTALL_DIR}/sbin/nginx /usr/local/sbin/

5.2 配置Systemd服务

创建Nginx的Systemd服务文件,实现服务管理:

bash 复制代码
echo "配置Nginx系统服务..."
cat > /lib/systemd/system/nginx.service <<EOF
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=${NGINX_INSTALL_DIR}/logs/nginx.pid
ExecStart=${NGINX_INSTALL_DIR}/sbin/nginx
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=/bin/kill -s QUIT \$MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF

chmod 754 /lib/systemd/system/nginx.service

5.3 启动与验证服务

重新加载Systemd配置并启动Nginx:

bash 复制代码
echo "启动Nginx服务..."
systemctl daemon-reload
systemctl start nginx.service
systemctl enable nginx.service

验证安装是否成功:

bash 复制代码
if systemctl is-active --quiet nginx.service; then
    echo "Nginx安装成功并已启动!"
    echo "Nginx版本信息:"
    nginx -v
    echo ""
    echo "可以通过以下命令管理Nginx:"
    echo "启动Nginx: systemctl start nginx"
    echo "停止Nginx: systemctl stop nginx"
    echo "重启Nginx: systemctl restart nginx"
    echo "查看状态: systemctl status nginx"
else
    echo "Nginx启动失败,请检查错误!"
    exit 1

六、脚本使用方式与结果展示

  • 将脚本保存为 install_nginx.sh
  • 赋予执行权限:chmod +x install_nginx.sh
  • 执行脚本:./install_nginx.sh

脚本执行结果:


总结

通过本文介绍的自动化安装脚本,我们可以快速、标准地在CentOS系统上部署Nginx,并完成基本的服务配置。该脚本具有以下优点:

  1. 自动化程度高:从依赖安装到服务启动全程自动化;
  2. 灵活可配置:通过修改变量可轻松切换Nginx版本;
  3. 符合安全规范:使用非root用户运行Nginx,减少安全风险;
  4. 服务化管理:通过Systemd统一管理Nginx服务,便于运维。

当然,在实际生产环境中,还需根据需求进一步配置Nginx的虚拟主机、日志切割、性能调优等选项。但本脚本作为一个基础安装工具,无疑为后续的配置工作打下了良好的基础。


附:完整脚本

bash 复制代码
#!/bin/bash

# Nginx自动化安装脚本
# 适用于CentOS系统
# 版本:nginx-1.20.2

# 检查是否为root用户
if [ $(id -u) -ne 0 ]; then
    echo "请使用root用户运行此脚本!"
    exit 1
fi

# 定义变量
NGINX_VERSION="1.20.2"
NGINX_URL="https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz"
INSTALL_DIR="/opt"
NGINX_SOURCE_DIR="${INSTALL_DIR}/nginx-${NGINX_VERSION}"
NGINX_INSTALL_DIR="/usr/local/nginx"

# 1. 关闭防火墙和SELinux
echo "正在关闭防火墙和SELinux..."
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

# 2. 安装依赖包
echo "正在安装依赖包..."
yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel wget > /dev/null

# 3. 创建运行用户和组
echo "正在创建Nginx运行用户..."
if ! id -u nginx &>/dev/null; then
    useradd -M -s /sbin/nologin nginx
else
    echo "用户nginx已存在,跳过创建"
fi

# 4. 下载并解压Nginx源码
echo "正在下载Nginx源码..."
cd ${INSTALL_DIR}
if [ ! -f "nginx-${NGINX_VERSION}.tar.gz" ]; then
    wget ${NGINX_URL} > /dev/null
else
    echo "Nginx源码包已存在,跳过下载"
fi

if [ -d "${NGINX_SOURCE_DIR}" ]; then
    echo "删除已存在的源码目录..."
    rm -rf ${NGINX_SOURCE_DIR}
fi

echo "正在解压Nginx源码..."
tar zxvf nginx-${NGINX_VERSION}.tar.gz -C ${INSTALL_DIR} > /dev/null

# 5. 编译安装Nginx
echo "正在编译安装Nginx..."
cd ${NGINX_SOURCE_DIR}

./configure \
--prefix=${NGINX_INSTALL_DIR} \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module > /dev/null

if [ $? -ne 0 ]; then
    echo "配置失败,请检查错误!"
    exit 1
fi

make > /dev/null && make install > /dev/null

if [ $? -ne 0 ]; then
    echo "编译安装失败,请检查错误!"
    exit 1
fi

# 创建软链接
echo "创建Nginx命令软链接..."
ln -sf ${NGINX_INSTALL_DIR}/sbin/nginx /usr/local/sbin/

# 6. 添加Nginx系统服务
echo "配置Nginx系统服务..."
cat > /lib/systemd/system/nginx.service <<EOF
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=${NGINX_INSTALL_DIR}/logs/nginx.pid
ExecStart=${NGINX_INSTALL_DIR}/sbin/nginx
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=/bin/kill -s QUIT \$MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF

chmod 754 /lib/systemd/system/nginx.service

# 启动Nginx服务
echo "启动Nginx服务..."
systemctl daemon-reload
systemctl start nginx.service
systemctl enable nginx.service

# 检查Nginx状态
if systemctl is-active --quiet nginx.service; then
    echo "Nginx安装成功并已启动!"
    echo "Nginx版本信息:"
    nginx -v
    echo ""
    echo "可以通过以下命令管理Nginx:"
    echo "启动Nginx: systemctl start nginx"
    echo "停止Nginx: systemctl stop nginx"
    echo "重启Nginx: systemctl restart nginx"
    echo "查看状态: systemctl status nginx"
else
    echo "Nginx启动失败,请检查错误!"
    exit 1
fi

exit 0

希望本文能帮助你更高效地部署和管理Nginx服务!

相关推荐
sinat_602035363 小时前
模块与包的导入
运维·服务器·开发语言·python
2301_810154553 小时前
VM中CentOS 7密码重置
linux·运维·centos
网硕互联的小客服4 小时前
408 Request Timeout:请求超时,服务器等待客户端发送请求的时间过长。
运维·服务器
王伯安呢4 小时前
告别线缆束缚!AirDroid Cast 多端投屏,让分享更自由
运维·服务器·教程·投屏·airdroid cast·多端互投
逍遥浪子~4 小时前
搭建本地gitea服务器
运维·服务器·gitea
喜欢你,还有大家4 小时前
FTP文件传输服务
linux·运维·服务器·前端
Bi4 小时前
Dokploy安装和部署项目流程
运维·前端
霍格沃兹软件测试开发5 小时前
AI 测试平台新功能揭秘:自动化测试用例运行的奥秘
运维·自动化·测试用例
MYZR15 小时前
现代农业自动化的技术演进与应用
自动化·语音识别