国产化服务器下 Nginx 一键自动化部署实战(适配麒麟 V10 / openEuler / 龙蜥 / RockyLinux)
原创:云动课堂
关键词:Nginx、一键部署、国产操作系统、Shell脚本、运维自动化
一、业务背景:国产化替代下的 Nginx 部署难题
随着信创产业的快速推进,越来越多的企业将业务系统迁移至国产操作系统,例如 银河麒麟 V10 、openEuler 、龙蜥 Anolis OS 等。在这些系统上部署常见的 Web 服务(如 Nginx),不再像 CentOS 7 那样"yum install"即可万事大吉。
实际运维中,我们面临以下典型场景:
- 某金融机构要求所有新上线的门户网站必须运行在麒麟 V10 环境,运维团队需在 30 台新交付的服务器上快速部署 Nginx + 反向代理。
- 某政务云平台同时使用 openEuler 和 龙蜥 8 两种操作系统,部署脚本需要兼容不同包管理器(yum / dnf)和默认仓库差异。
- 传统手工部署方式不仅耗时,而且容易遗漏防火墙放行、SELinux 配置、开机自启等细节,导致服务"装上了却访问不了"。
核心痛点: 缺乏一套"一次编写,到处运行"的 Nginx 自动化部署方案,能够适配国产操作系统生态,并提供标准化的运维信息输出。
二、需求分析:我们需要一个"开箱即用"的 Nginx 部署工具
通过梳理上述业务场景,我们总结出以下 5 项核心需求:
| 需求编号 | 需求描述 |
|---|---|
| R1 | 多 OS 适配:自动识别银河麒麟 V10、openEuler、龙蜥 8、Rocky Linux 8、CentOS 7/8,并调用正确的包管理器(yum/dnf) |
| R2 | 可选官方源:支持用户选择是否使用 Nginx 官方 YUM 源(获取最新稳定版) |
| R3 | 环境联动配置:自动配置 firewalld 放行 HTTP 服务;自动调整 SELinux 策略(如果启用) |
| R4 | 交付即验证:安装后自动生成一个包含运维信息的测试页面,浏览器访问即可确认部署成功 |
| R5 | 运维信息沉淀:部署完成后输出完整的服务状态、访问地址、配置文件路径、管理命令,并保存至文件,方便后续维护 |
简单来说,我们需要一个 "黑盒式"一键脚本 :运维人员只需执行 sudo ./deploy_nginx.sh,其余工作(检测系统、安装、配置、启动、验证)完全自动化。
三、方案设计:打造 Nginx 一键自动化部署脚本
3.1 技术选型
- 脚本语言:Bash(几乎所有 Linux 发行版内置)
- 安装方式:优先使用系统包管理器(yum/dnf),支持添加 Nginx 官方源
- 配置策略:尽量不修改 Nginx 默认配置,仅确保防火墙和 SELinux 兼容
- 测试页面:内嵌 HTML 代码,动态生成包含服务器 IP、部署时间、关键路径的页面
3.2 脚本执行流程
整个脚本被划分为 6 个逻辑清晰的步骤:
开始
检测操作系统
安装Nginx
配置防火墙+SELinux
创建测试页面
启动服务并设置开机自启
输出运维信息汇总
结束
3.3 关键技术点
- OS 识别 :通过
/etc/os-release获取ID和VERSION_ID,对未知系统自动降级为 CentOS 兼容模式。 - 官方源处理 :动态写入
/etc/yum.repos.d/nginx.repo,并导入 GPG 密钥。 - 防火墙适配 :优先检测
firewalld是否运行,若运行则放行http服务;否则仅给出提示。 - SELinux 兼容 :设置
httpd_can_network_connect布尔值,并将网页目录上下文标记为httpd_sys_content_t。 - 彩色输出与日志 :使用 ANSI 颜色区分 INFO/WARN/ERROR,同时将所有输出追加到
/tmp/nginx_install.log。
四、脚本核心预览(完整版见文末)
由于篇幅限制,此处仅展示脚本的核心函数片段,完整脚本请参见文末附录。
4.1 完整的脚本内容
bash
#!/bin/bash
# ===================================================================
# 项目名称:Nginx 高性能Web服务 · 一键自动化部署方案
# 适用系统:银河麒麟 V10 / openEuler / 龙蜥 8 / Rocky Linux 8 / CentOS 7/8
# 脚本单位:阜阳云动科技
# 功能描述:自动安装 Nginx,创建测试页面,输出运维信息
# ===================================================================
set -e # 遇到错误即退出
# ----------------------------- 全局变量 -----------------------------
NGINX_VERSION="1.20.1" # 默认版本(若从官方源安装则忽略)
NGINX_CONF="/etc/nginx/nginx.conf"
HTML_DIR="/usr/share/nginx/html"
TEST_PAGE="index.html"
SERVICE_NAME="nginx"
LOG_FILE="/tmp/nginx_install.log"
TIME=$(date "+%Y-%m-%d %H:%M:%S")
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# ----------------------------- 工具函数 -----------------------------
log_info() {
echo -e "${GREEN}[INFO]${NC} $(date +'%Y-%m-%d %H:%M:%S') - $1" | tee -a $LOG_FILE
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $(date +'%Y-%m-%d %H:%M:%S') - $1" | tee -a $LOG_FILE
}
log_error() {
echo -e "${RED}[ERROR]${NC} $(date +'%Y-%m-%d %H:%M:%S') - $1" | tee -a $LOG_FILE
exit 1
}
print_step() {
echo -e "\n${BLUE}========== $1 ==========${NC}"
}
print_banner() {
echo -e "${PURPLE}
**********************************************
* Nginx 一键自动化部署脚本 *
* 单位:云动课堂 *
**********************************************${NC}"
}
# 检测操作系统
detect_os() {
if [ -f /etc/os-release ]; then
. /etc/os-release
OS=$ID
VER=$VERSION_ID
else
log_error "无法检测操作系统版本"
fi
case $OS in
centos|rhel|rocky|anolis|openEuler|kylin)
log_info "检测到操作系统: $OS $VER"
;;
*)
log_warn "未经过完全测试的操作系统: $OS,将尝试使用 CentOS 兼容模式"
OS="centos"
;;
esac
}
# 配置 Nginx 官方源(可选,默认使用系统源)
setup_nginx_repo() {
if [ -f /etc/yum.repos.d/nginx.repo ]; then
log_info "Nginx 源已存在,跳过配置"
return
fi
log_info "配置 Nginx 官方 YUM 源..."
cat > /etc/yum.repos.d/nginx.repo << EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
# 导入 GPG 密钥
rpm --import https://nginx.org/keys/nginx_signing.key 2>/dev/null || log_warn "GPG 密钥导入失败,将忽略签名验证"
}
# 安装 Nginx
install_nginx() {
print_step "步骤1:安装 Nginx"
# 检查是否已安装
if command -v nginx &> /dev/null; then
log_warn "Nginx 已安装,跳过安装步骤"
return
fi
# 选择安装方式:优先使用官方源,否则使用默认源
read -p "是否使用 Nginx 官方源(y/n,默认 y)? " use_official
use_official=${use_official:-y}
if [[ "$use_official" =~ ^[Yy]$ ]]; then
setup_nginx_repo
fi
# 安装依赖
log_info "更新 YUM 缓存并安装必要工具..."
if command -v dnf &> /dev/null; then
dnf install -y epel-release 2>/dev/null || true
dnf makecache
dnf install -y nginx curl wget
else
yum install -y epel-release 2>/dev/null || true
yum makecache
yum install -y nginx curl wget
fi || log_error "Nginx 安装失败"
# 验证安装
if command -v nginx &> /dev/null; then
log_info "Nginx 安装成功,版本:$(nginx -v 2>&1)"
else
log_error "Nginx 未找到,安装可能失败"
fi
}
# 配置防火墙和 SELinux
configure_firewall_selinux() {
print_step "步骤2:配置防火墙及 SELinux"
# 防火墙配置
if command -v firewall-cmd &> /dev/null; then
if systemctl is-active --quiet firewalld; then
log_info "firewalld 正在运行,添加 HTTP 服务..."
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
log_info "防火墙已允许 HTTP (80端口)"
else
log_warn "firewalld 未运行,跳过防火墙配置"
fi
elif command -v iptables &> /dev/null; then
log_warn "未检测到 firewalld,请手动配置 iptables 开放 80 端口"
fi
# SELinux 配置:设置 httpd 相关布尔值(仅当 SELinux 启用时)
if command -v getenforce &> /dev/null && [ "$(getenforce)" != "Disabled" ]; then
log_info "配置 SELinux 策略..."
setsebool -P httpd_can_network_connect on 2>/dev/null || true
chcon -R -t httpd_sys_content_t $HTML_DIR 2>/dev/null || true
log_info "SELinux 已适配 Nginx"
fi
}
# 创建测试页面
create_test_page() {
print_step "步骤3:创建测试 HTML 页面"
local host_ip=$(ip route get 1 | awk '{print $NF;exit}' 2>/dev/null || echo "127.0.0.1")
cat > ${HTML_DIR}/${TEST_PAGE} << EOF
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>云动课堂 - Nginx 部署成功</title>
<style>
body { font-family: 'Microsoft YaHei', sans-serif; text-align: center; margin-top: 15%; background: #f0f2f5; }
.container { background: white; padding: 40px; border-radius: 10px; display: inline-block; box-shadow: 0 0 15px rgba(0,0,0,0.1); }
h1 { color: #009688; }
.info { text-align: left; margin-top: 20px; background: #f9f9f9; padding: 15px; border-radius: 5px; }
.footer { margin-top: 30px; font-size: 12px; color: #999; }
</style>
</head>
<body>
<div class="container">
<h1>✅ Nginx 已成功部署</h1>
<p>恭喜!Nginx Web 服务器运行正常。</p>
<div class="info">
<strong>📌 运维信息:</strong><br>
部署时间:${TIME}<br>
服务器 IP:${host_ip}<br>
配置文件:${NGINX_CONF}<br>
网站根目录:${HTML_DIR}<br>
日志目录:/var/log/nginx/<br>
服务管理:systemctl {start|stop|restart|status} nginx<br>
</div>
<div class="footer">
脚本制作单位:云动课堂 | 一键自动化部署
</div>
</div>
</body>
</html>
EOF
log_info "测试页面已创建:${HTML_DIR}/${TEST_PAGE}"
}
# 启动并启用 Nginx 服务
start_nginx() {
print_step "步骤4:启动 Nginx 服务"
# 检查配置文件语法
nginx -t || log_error "Nginx 配置文件语法错误"
systemctl enable ${SERVICE_NAME} 2>/dev/null || log_warn "设置开机自启失败"
systemctl restart ${SERVICE_NAME} || log_error "Nginx 启动失败"
if systemctl is-active --quiet ${SERVICE_NAME}; then
log_info "Nginx 服务已成功启动并设为开机自启"
else
log_error "Nginx 服务未正常运行"
fi
}
# 输出运维信息汇总
output_summary() {
print_step "部署完成 - 运维信息汇总"
local ip_addr=$(ip route get 1 | awk '{print $NF;exit}' 2>/dev/null)
local public_ip=$(curl -s ifconfig.me 2>/dev/null || echo "无法获取")
local nginx_version=$(nginx -v 2>&1 | cut -d'/' -f2)
echo -e "${GREEN}
╔══════════════════════════════════════════════════════════════╗
║ Nginx 部署成功信息 ║
╠══════════════════════════════════════════════════════════════╣
║ 服务状态 :$(systemctl is-active nginx)
║ 版本 :$nginx_version
║ 访问地址 :http://${ip_addr} (内网)
║ :http://${public_ip} (公网,若有)
║ 配置文件 :$NGINX_CONF
║ 网站根目录 :$HTML_DIR
║ 测试页面 :${HTML_DIR}/${TEST_PAGE}
║ 访问日志 :/var/log/nginx/access.log
║ 错误日志 :/var/log/nginx/error.log
║ 服务管理命令 :systemctl start/stop/restart nginx
║ 日志查看命令 :tail -f /var/log/nginx/access.log
║ 部署时间 :${TIME}
║ 脚本单位 :云动课堂
╚══════════════════════════════════════════════════════════════╝
${NC}"
# 保存信息到文件
cat > /root/nginx_deploy_info.txt << EOF
Nginx 部署信息(生成时间:${TIME})
-----------------------------------
服务状态:$(systemctl is-active nginx)
版本:${nginx_version}
内网访问:http://${ip_addr}
配置文件:${NGINX_CONF}
根目录:${HTML_DIR}
日志:/var/log/nginx/
管理命令:systemctl start/stop/restart nginx
EOF
log_info "运维信息已保存至 /root/nginx_deploy_info.txt"
}
# 主函数
main() {
# 必须以 root 身份运行
if [ "$EUID" -ne 0 ]; then
log_error "请使用 root 用户或 sudo 执行此脚本"
fi
print_banner
detect_os
install_nginx
configure_firewall_selinux
create_test_page
start_nginx
output_summary
echo -e "\n${GREEN}✨ Nginx 一键部署完成!通过浏览器访问服务器 IP 即可看到测试页面。${NC}"
}
# 执行主函数
main
4.2 安装与防火墙联动
bash
install_nginx() {
# 询问是否使用官方源
read -p "是否使用 Nginx 官方源(y/n,默认 y)? " use_official
if [[ "$use_official" =~ ^[Yy]$ ]]; then
setup_nginx_repo
fi
# 使用 dnf 或 yum 安装
if command -v dnf &> /dev/null; then
dnf install -y nginx
else
yum install -y nginx
fi
}
configure_firewall_selinux() {
# firewalld 放行 http
if systemctl is-active --quiet firewalld; then
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
fi
# SELinux 调整
if [ "$(getenforce)" != "Disabled" ]; then
setsebool -P httpd_can_network_connect on
chcon -R -t httpd_sys_content_t /usr/share/nginx/html
fi
}
4.3 自动生成运维测试页面
脚本会动态生成一个包含 部署时间、服务器 IP、配置文件路径、日志目录 等信息的 HTML 文件,存放在网站根目录下。用户访问 http://服务器IP 即可看到。
五、部署效果演示(成功输出摘要)
在一台 龙蜥 8 服务器上执行脚本后,终端输出如下(已脱敏):
bash
[root@localhost ~]# ./install_nginx.sh
**********************************************
* Nginx 一键自动化部署脚本 *
* 单位:云动课堂 *
**********************************************
[INFO] 2026-04-28 01:31:20 - 检测到操作系统: anolis 8.10
========== 步骤1:安装 Nginx ==========
是否使用 Nginx 官方源(y/n,默认 y)? y
[INFO] 2026-04-28 01:31:26 - 配置 Nginx 官方 YUM 源...
[INFO] 2026-04-28 01:31:27 - 更新 YUM 缓存并安装必要工具...
nginx stable repo 47 kB/s | 111 kB 00:02
依赖关系解决。
==================================================================================================================================================================================
软件包 架构 版本 仓库 大小
==================================================================================================================================================================================
安装:
epel-release noarch 8-11.an8 Extras 23 k
事务概要
==================================================================================================================================================================================
安装 1 软件包
总下载:23 k
安装大小:35 k
下载软件包:
epel-release-8-11.an8.noarch.rpm 132 kB/s | 23 kB 00:00
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
总计 130 kB/s | 23 kB 00:00
运行事务检查
事务检查成功。
运行事务测试
事务测试成功。
运行事务
准备中 : 1/1
安装 : epel-release-8-11.an8.noarch 1/1
运行脚本: epel-release-8-11.an8.noarch 1/1
验证 : epel-release-8-11.an8.noarch 1/1
已安装:
epel-release-8-11.an8.noarch
完毕!
AnolisOS-8 - AppStream 45 kB/s | 4.3 kB 00:00
AnolisOS-8 - BaseOS 52 kB/s | 4.3 kB 00:00
AnolisOS-8 - Extras 40 kB/s | 3.0 kB 00:00
AnolisOS-8 - PowerTools 56 kB/s | 4.3 kB 00:00
AnolisOS-8 - Kernel 5.10 41 kB/s | 4.3 kB 00:00
Extra Packages for Enterprise Linux 8 - x86_64 9.5 MB/s | 14 MB 00:01
Extra Packages for Enterprise Linux Modular 8 - x86_64 20 kB/s | 733 kB 00:36
nginx stable repo 7.8 kB/s | 3.0 kB 00:00
元数据缓存已建立。
上次元数据过期检查:0:00:05 前,执行于 2026年04月28日 星期二 01时32分23秒。
软件包 curl-7.61.1-35.0.2.an8.3.x86_64 已安装。
软件包 wget-1.19.5-12.0.1.an8.x86_64 已安装。
依赖关系解决。
==================================================================================================================================================================================
软件包 架构 版本 仓库 大小
==================================================================================================================================================================================
安装:
nginx x86_64 1:1.30.0-1.el8.ngx nginx-stable 1.0 M
升级:
curl x86_64 7.61.1-35.0.2.an8.9 BaseOS 222 k
libcurl x86_64 7.61.1-35.0.2.an8.9 BaseOS 303 k
事务概要
==================================================================================================================================================================================
安装 1 软件包
升级 2 软件包
总下载:1.5 M
下载软件包:
(1/3): libcurl-7.61.1-35.0.2.an8.9.x86_64.rpm 1.1 MB/s | 303 kB 00:00
(2/3): curl-7.61.1-35.0.2.an8.9.x86_64.rpm 796 kB/s | 222 kB 00:00
(3/3): nginx-1.30.0-1.el8.ngx.x86_64.rpm 13 kB/s | 1.0 MB 01:17
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
总计 20 kB/s | 1.5 MB 01:17
运行事务检查
事务检查成功。
运行事务测试
事务测试成功。
运行事务
准备中 : 1/1
升级 : libcurl-7.61.1-35.0.2.an8.9.x86_64 1/5
升级 : curl-7.61.1-35.0.2.an8.9.x86_64 2/5
运行脚本: nginx-1:1.30.0-1.el8.ngx.x86_64 3/5
安装 : nginx-1:1.30.0-1.el8.ngx.x86_64 3/5
运行脚本: nginx-1:1.30.0-1.el8.ngx.x86_64 3/5
----------------------------------------------------------------------
Thanks for using nginx!
Please find the official documentation for nginx here:
* https://nginx.org/en/docs/
Please subscribe to nginx-announce mailing list to get
the most important news about nginx:
* https://nginx.org/en/support.html
Commercial subscriptions for nginx are available on:
* https://nginx.com/products/
----------------------------------------------------------------------
清理 : curl-7.61.1-35.0.2.an8.3.x86_64 4/5
清理 : libcurl-7.61.1-35.0.2.an8.3.x86_64 5/5
运行脚本: libcurl-7.61.1-35.0.2.an8.3.x86_64 5/5
验证 : nginx-1:1.30.0-1.el8.ngx.x86_64 1/5
验证 : curl-7.61.1-35.0.2.an8.9.x86_64 2/5
验证 : curl-7.61.1-35.0.2.an8.3.x86_64 3/5
验证 : libcurl-7.61.1-35.0.2.an8.9.x86_64 4/5
验证 : libcurl-7.61.1-35.0.2.an8.3.x86_64 5/5
已升级:
curl-7.61.1-35.0.2.an8.9.x86_64 libcurl-7.61.1-35.0.2.an8.9.x86_64
已安装:
nginx-1:1.30.0-1.el8.ngx.x86_64
完毕!
[INFO] 2026-04-28 01:33:49 - Nginx 安装成功,版本:nginx version: nginx/1.30.0
========== 步骤2:配置防火墙及 SELinux ==========
[WARN] 2026-04-28 01:33:49 - firewalld 未运行,跳过防火墙配置
========== 步骤3:创建测试 HTML 页面 ==========
[INFO] 2026-04-28 01:33:49 - 测试页面已创建:/usr/share/nginx/html/index.html
========== 步骤4:启动 Nginx 服务 ==========
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[INFO] 2026-04-28 01:33:50 - Nginx 服务已成功启动并设为开机自启
========== 部署完成 - 运维信息汇总 ==========
╔══════════════════════════════════════════════════════════════╗
║ Nginx 部署成功信息 ║
╠══════════════════════════════════════════════════════════════╣
║ 服务状态 :active
║ 版本 :1.30.0
║ 访问地址 :http://0 (内网)
║ :http://36.6.234.128 (公网,若有)
║ 配置文件 :/etc/nginx/nginx.conf
║ 网站根目录 :/usr/share/nginx/html
║ 测试页面 :/usr/share/nginx/html/index.html
║ 访问日志 :/var/log/nginx/access.log
║ 错误日志 :/var/log/nginx/error.log
║ 服务管理命令 :systemctl start/stop/restart nginx
║ 日志查看命令 :tail -f /var/log/nginx/access.log
║ 部署时间 :2026-04-28 01:31:20
║ 脚本单位 :云动课堂
╚══════════════════════════════════════════════════════════════╝
[INFO] 2026-04-28 01:33:52 - 运维信息已保存至 /root/nginx_deploy_info.txt
✨ Nginx 一键部署完成!通过浏览器访问服务器 IP 即可看到测试页面。
✨ Nginx 一键部署完成!通过浏览器访问服务器 IP 即可看到测试页面。


随后浏览器访问 http://192.168.50.31,显示如下页面(含运维信息卡片)。

效果图摘要:页面背景浅灰,中央白色卡片显示"✅ Nginx 已成功部署",并列出部署时间、IP、配置文件、日志路径等,底部标注"脚本制作单位:云动课堂"。
六、后期维护建议
脚本虽然实现了一键部署,但生产环境仍需注意以下运维要点:
-
定期更新 Nginx 版本
- 执行
yum update nginx(或dnf update nginx) 可升级到官方源的最新稳定版。 - 升级后建议执行
nginx -t并systemctl restart nginx。
- 执行
-
配置文件自定义
- 脚本未改动
nginx.conf,如需新增虚拟主机(server block),请将自定义配置放入/etc/nginx/conf.d/目录。 - 修改配置后务必执行
nginx -t检查语法。
- 脚本未改动
-
日志轮转与监控
- Nginx 默认日志位于
/var/log/nginx/。建议配置 logrotate(系统已自带)并确保日志不占满磁盘。 - 可接入 Zabbix 或 Prometheus 监控
nginx_status模块(需手动启用 stub_status)。
- Nginx 默认日志位于
-
安全加固
- 隐藏版本号:在
nginx.conf的http块中添加server_tokens off;。 - 根据业务需要配置 HTTPS(使用 Let's Encrypt 或企业证书)。
- 限制请求方法、禁用不安全的 HTTP 方法。
- 隐藏版本号:在
-
备份策略
- 至少备份
/etc/nginx/整个目录和网站根目录。 - 脚本生成的
/root/nginx_deploy_info.txt文件可保留作为初始配置快照。
- 至少备份
附录:完整脚本代码
由于博客篇幅限制,完整脚本已上传至 [GitHub Gist / 云动课堂代码库],也可直接联系作者获取。
核心特性回顾:
- ✅ 适配麒麟 V10、openEuler、龙蜥 8、Rocky 8、CentOS 7/8
- ✅ 一键安装 + 防火墙 + SELinux + 测试页面
- ✅ 运维信息彩色汇总并保存至文件
- ✅ 幂等性设计(重复执行不会破坏已有配置)
写在最后:国产操作系统生态正在快速成熟,运维工具的"跨平台兼容性"将成为刚需。希望这份 Nginx 一键部署方案能帮助大家节省时间,也希望更多开源爱好者一起贡献适配不同发行版的自动化脚本。
单位:云动课堂
技术交流:欢迎留言讨论,或访问我们的官网获取更多运维实战课程。
(完)