Nginx 实战系列(七)—— Nginx一键安装脚本详解
文章目录
- 前言
- 一、脚本基础设置
- 1.1 权限验证
- 1.2 变量定义
- 二、系统环境准备
- 2.1 关闭防火墙与SELinux
- 三、依赖安装与用户配置
- 3.1 安装编译依赖
- 3.2 创建Nginx运行用户
- 四、Nginx源码编译与安装
- 4.1 下载与解压源码
- 4.2 配置编译选项
- 4.3 编译与安装
- 五、服务配置与管理
- 5.1 创建软链接
- 5.2 配置Systemd服务
- 5.3 启动与验证服务
- 六、脚本使用方式与结果展示
- 总结
- 附:完整脚本
前言
在Web服务领域,Nginx因其高性能、高并发和低内存占用等特点,已成为最受欢迎的Web服务器和反向代理服务器之一。然而,手动编译安装Nginx往往步骤繁琐,容易出错,尤其是在生产环境中,快速、可靠地部署Nginx显得尤为重要。
本文将以一个自动安装Nginx的Shell脚本为基础,详细介绍如何在CentOS系统上自动化完成Nginx的安装、配置和服务管理,帮助系统管理员和开发者提升部署效率,减少人为错误。
一、脚本基础设置
1.1 权限验证
脚本首先检查当前用户是否为root用户,确保具有执行安装所需的权限:
if [ $(id -u) -ne 0 ]; thenecho "请使用root用户运行此脚本!"exit 1
fi
1.2 变量定义
定义Nginx版本、下载地址、安装路径等变量,便于后续维护和修改:
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:
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所需的开发工具和库:
echo "正在安装依赖包..."
yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel wget > /dev/null
3.2 创建Nginx运行用户
为Nginx创建一个无登录权限的系统用户,提升安全性:
echo "正在创建Nginx运行用户..."
if ! id -u nginx &>/dev/null; thenuseradd -M -s /sbin/nologin nginx
elseecho "用户nginx已存在,跳过创建"
fi
四、Nginx源码编译与安装
4.1 下载与解压源码
下载Nginx源码并解压到指定目录:
echo "正在下载Nginx源码..."
cd ${INSTALL_DIR}
if [ ! -f "nginx-${NGINX_VERSION}.tar.gz" ]; thenwget ${NGINX_URL} > /dev/null
elseecho "Nginx源码包已存在,跳过下载"
fiif [ -d "${NGINX_SOURCE_DIR}" ]; thenecho "删除已存在的源码目录..."rm -rf ${NGINX_SOURCE_DIR}
fiecho "正在解压Nginx源码..."
tar zxvf nginx-${NGINX_VERSION}.tar.gz -C ${INSTALL_DIR} > /dev/null
4.2 配置编译选项
配置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/nullif [ $? -ne 0 ]; thenecho "配置失败,请检查错误!"exit 1
fi
启用
http_stub_status_module
用于状态监控,http_ssl_module
支持HTTPS。
4.3 编译与安装
执行编译和安装过程:
make > /dev/null && make install > /dev/null
if [ $? -ne 0 ]; thenecho "编译安装失败,请检查错误!"exit 1
fi
五、服务配置与管理
5.1 创建软链接
将Nginx可执行文件链接到系统路径:
echo "创建Nginx命令软链接..."
ln -sf ${NGINX_INSTALL_DIR}/sbin/nginx /usr/local/sbin/
5.2 配置Systemd服务
创建Nginx的Systemd服务文件,实现服务管理:
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
EOFchmod 754 /lib/systemd/system/nginx.service
5.3 启动与验证服务
重新加载Systemd配置并启动Nginx:
echo "启动Nginx服务..."
systemctl daemon-reload
systemctl start nginx.service
systemctl enable nginx.service
验证安装是否成功:
if systemctl is-active --quiet nginx.service; thenecho "Nginx安装成功并已启动!"echo "Nginx版本信息:"nginx -vecho ""echo "可以通过以下命令管理Nginx:"echo "启动Nginx: systemctl start nginx"echo "停止Nginx: systemctl stop nginx"echo "重启Nginx: systemctl restart nginx"echo "查看状态: systemctl status nginx"
elseecho "Nginx启动失败,请检查错误!"exit 1
六、脚本使用方式与结果展示
- 将脚本保存为
install_nginx.sh
- 赋予执行权限:
chmod +x install_nginx.sh
- 执行脚本:
./install_nginx.sh
脚本执行结果:
总结
通过本文介绍的自动化安装脚本,我们可以快速、标准地在CentOS系统上部署Nginx,并完成基本的服务配置。该脚本具有以下优点:
- 自动化程度高:从依赖安装到服务启动全程自动化;
- 灵活可配置:通过修改变量可轻松切换Nginx版本;
- 符合安全规范:使用非root用户运行Nginx,减少安全风险;
- 服务化管理:通过Systemd统一管理Nginx服务,便于运维。
当然,在实际生产环境中,还需根据需求进一步配置Nginx的虚拟主机、日志切割、性能调优等选项。但本脚本作为一个基础安装工具,无疑为后续的配置工作打下了良好的基础。
附:完整脚本
#!/bin/bash# Nginx自动化安装脚本
# 适用于CentOS系统
# 版本:nginx-1.20.2# 检查是否为root用户
if [ $(id -u) -ne 0 ]; thenecho "请使用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; thenuseradd -M -s /sbin/nologin nginx
elseecho "用户nginx已存在,跳过创建"
fi# 4. 下载并解压Nginx源码
echo "正在下载Nginx源码..."
cd ${INSTALL_DIR}
if [ ! -f "nginx-${NGINX_VERSION}.tar.gz" ]; thenwget ${NGINX_URL} > /dev/null
elseecho "Nginx源码包已存在,跳过下载"
fiif [ -d "${NGINX_SOURCE_DIR}" ]; thenecho "删除已存在的源码目录..."rm -rf ${NGINX_SOURCE_DIR}
fiecho "正在解压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/nullif [ $? -ne 0 ]; thenecho "配置失败,请检查错误!"exit 1
fimake > /dev/null && make install > /dev/nullif [ $? -ne 0 ]; thenecho "编译安装失败,请检查错误!"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
EOFchmod 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; thenecho "Nginx安装成功并已启动!"echo "Nginx版本信息:"nginx -vecho ""echo "可以通过以下命令管理Nginx:"echo "启动Nginx: systemctl start nginx"echo "停止Nginx: systemctl stop nginx"echo "重启Nginx: systemctl restart nginx"echo "查看状态: systemctl status nginx"
elseecho "Nginx启动失败,请检查错误!"exit 1
fiexit 0
希望本文能帮助你更高效地部署和管理Nginx服务!