openEuler 完整 Nginx + MySQL + Redis + 自动备份教程
openEuler 完整 Nginx + MySQL + Redis + 自动备份教程
不用删掉重建虚拟机!openEuler 完全可以做这个 LNMR(Nginx+MySQL+Redis)实验,反而对你简历加分(懂欧拉,云厂商/政企很多用openEuler) 唯一改动点:
- 包管理器:
dnf代替 Ubuntu 的apt - 防火墙:
firewalld代替ufw - 软件包名称、部分配置路径细微差异
- 你的虚拟机内存2G,和之前方案一样,必须做MySQL内存限制,否则OOM卡死
面试加分点:你可以讲:同时接触Ubuntu和openEuler,熟悉RPM系、DEB系差异,熟悉firewalld和ufw两套防火墙,在欧拉上部署Web+数据库+定时备份。
openEuler 完整 Nginx + MySQL + Redis + 自动备份教程(适配你2G内存虚拟机)
系统:openEuler LTS(x86_64),root用户操作
1. 系统初始化
# 更新源
dnf update -y
# 安装工具
dnf install -y vim curl wget git net-tools
# firewalld 放行端口(80、22)
systemctl start firewalld
systemctl enable firewalld
# 永久放行端口
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=http
# 重载生效
firewall-cmd --reload
# 查看放行规则
firewall-cmd --list-ports
注意:openEuler默认firewalld,没有ufw,Ubuntu的ufw命令全部不能用。
2. 安装 Nginx
dnf install nginx -y
systemctl start nginx
systemctl enable nginx
systemctl status nginx
创建网站目录与站点配置
mkdir -p /var/www/myblog
chown -R nginx:nginx /var/www/myblog
# 写入首页
cat > /var/www/myblog/index.html <<'EOF'
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>My Blog openEuler</title></head>
<body><h1>Hello Nginx on openEuler!</h1></body>
</html>
EOF
openEuler 的nginx配置目录:/etc/nginx/
vim /etc/nginx/conf.d/myblog.conf
写入:
server {
listen 80;
server_name 你的虚拟机IP;
root /var/www/myblog;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
检查配置、重载nginx
nginx -t
systemctl reload nginx
浏览器访问虚拟机IP,看到页面就成功。
1、chown -R nginx:nginx /var/www/myblog
chown` = change owner 修改文件/目录归属 语法:`chown -R 属主:属组 目录
- 第一个
nginx:操作系统用户名(openEuler安装nginx自动创建的系统账号,nginx进程worker就是用这个用户运行) - 冒号
:分隔 用户 和 用户组 - 第二个
nginx:操作系统用户组名(同名用户组) -R:递归,目录下所有子文件、子目录全部一起修改归属
含义:把
/var/www/myblog整个网站目录,所有者设为nginx用户,所属组设为nginx组。 目的:nginx进程读取网页文件的时候有权限,不会报403 Forbidden权限拒绝。
对比Ubuntu:Ubuntu里是
www-data:www-data,RPM系(openEuler/CentOS/RHEL)默认是nginx:nginx,面试经常问这个差异。
验证命令(openEuler执行)
ls -ld /var/www/myblog
输出里会看到 nginx nginx。
2、dnf update -y
dnf:openEuler、CentOS、RHEL的包管理器(替代旧yum)update:更新本地软件源缓存,升级系统所有已安装软件包-y:所有交互提问自动选yes,不用手动确认
注意:生产环境不要随便直接
dnf update -y,容易把内核/组件升级引发业务故障;学习虚拟机可以随便跑。
3、Nginx反向代理IP的核心问题(重点,面试高频)
一句话纠正你的理解: Nginx反向代理本身没有“单独固定IP”,Nginx就跑在这台openEuler虚拟机上,Nginx的IP = 虚拟机网卡IP。
两种架构
架构A(你现在当前实验,Nginx只做静态Web,不是反向代理)
Windows浏览器(客户端) →【虚拟机IP:80】→ openEuler虚拟机上的Nginx,Nginx直接读取本地/var/www/myblog静态页面返回。
- 客户端访问地址:虚拟机IP:80
- Nginx监听的IP:虚拟机网卡IP,端口80
- 没有后端,不存在代理转发。
架构B(Nginx作为反向代理,典型前后端分离)
Windows浏览器(客户端) →【虚拟机IP:80】→ Nginx(本虚拟机)→ proxy_pass转发到后端应用服务(可以是同机127.0.0.1:8080,或者另一台服务器IP)
# 反向代理示例配置
location /api/ {
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
-
客户端浏览器访问:虚拟机IP:80(对外入口IP,Nginx的IP)
-
Nginx收到请求,作为代理,主动发起新连接访问后端服务(后端地址写在
proxy_pass里面) -
后端应用看到的TCP连接来源IP,
默认是Nginx的虚拟机内网IP
,不是浏览器Windows客户端IP!
- 所以需要加
X-Real-IP / X-Forwarded-For请求头,把真实客户端IP透传给后端应用
- 所以需要加
通俗总结
- 对外入口IP(用户浏览器访问的IP):Nginx所在虚拟机IP
- 后端服务IP:proxy_pass后面写的地址,可以是本机127.0.0.1,也可以是别的机器
- Nginx反向代理是中间人,有两条TCP连接: 连接1:浏览器 ↔ Nginx(源IP:Windows主机,目的IP:虚拟机IP) 连接2:Nginx ↔ 后端应用(源IP:虚拟机IP,目的IP:后端IP)
4、实操小练习(你现在openEuler虚拟机直接敲)
# 查看本机网卡IP(拿到虚拟机IP)
ip a
# 查看nginx进程运行用户
ps aux | grep nginx
# 查看网站目录权限
ls -ld /var/www/myblog
ls -l /var/www/myblog/index.html
面试口述版(可以直接背)
nginx:nginx代表文件的属主为nginx用户,属组为nginx用户组。openEuler这类RPM系操作系统安装Nginx会自动创建nginx系统账号,worker进程以此账号运行,网站目录归属nginx用户,保证读取文件权限,避免403。Ubuntu是www-data用户。 Nginx反向代理部署在虚拟机上,对外暴露的访问IP就是虚拟机IP。Nginx收到客户端请求之后,新建TCP连接转发给proxy_pass指定的后端服务;后端应用默认拿到的源IP是Nginx虚拟机IP,需要配置X-Forwarded-For透传客户端真实IP。
如果你想,我现在给你写一份Nginx反向代理完整配置,在你openEuler虚拟机上直接做反向代理实验。
3. 安装 MySQL(openEuler 推荐 mysql 8.0,2G内存必须调参)
dnf install mysql-server mysql -y
systemctl start mysqld
systemctl enable mysqld
MySQL8.0安装后,root有临时密码,查看临时密码:
grep 'temporary password' /var/log/mysqld.log
拿到临时密码,执行安全初始化:
mysql_secure_installation
交互选项:
- 输入临时密码
- 设置新root密码(复杂度要求:大小写+数字+符号)
- 后面全部选 Y:删除匿名用户、禁止root远程登录、删除test库、刷新权限
登录数据库:
mysql -uroot -p
CREATE DATABASE myblog DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'myblog_user'@'localhost' IDENTIFIED BY "MySQL密码";
GRANT ALL PRIVILEGES ON myblog.* TO 'myblog_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
⚠️2G内存关键优化(防止OOM崩溃)
vim /etc/my.cnf
[mysqld] 段添加:
innodb_buffer_pool_size = 128M
performance_schema = OFF
tmp_table_size = 16M
max_heap_table_size = 16M
重启mysql
systemctl restart mysqld
验证:free -h,观察内存占用。
4. 安装 Redis
dnf install redis -y
systemctl start redis
systemctl enable redis
修改配置,设置密码,只监听本机:
vim /etc/redis.conf
bind 127.0.0.1
requirepass YourRedisPass123!
maxmemory 256mb
maxmemory-policy allkeys-lru
2G虚拟机限制redis最大256M,防止吃掉全部内存
重启验证
systemctl restart redis
redis-cli
auth Redis密码
set test hello
get test
exit
5. Shell自动备份脚本【openEuler可用,完全兼容】
脚本逻辑和之前Ubuntu版本几乎一模一样,shell语法通用,不用大改。
# 创建目录
mkdir -p /data/backup
mkdir -p /data/scripts
vim /data/scripts/backup.sh
#!/bin/bash
# openEuler 网站+MySQL自动备份脚本
SITE_DIR="/var/www/myblog"
DB_NAME="myblog"
DB_USER="myblog_user"
DB_PASS="MySQL密码"
BACKUP_DIR="/data/backup"
KEEP_DAYS=7
LOG_FILE="/data/backup/backup.log"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="backup_${DATE}"
BACKUP_FILE="${BACKUP_DIR}/${BACKUP_NAME}.tar.gz"
echo "========== $(date) 开始备份 ==========" >> "${LOG_FILE}"
TMP_DIR="/tmp/${BACKUP_NAME}"
mkdir -p "${TMP_DIR}"
# 备份网站文件
echo "[$(date)] 备份网站文件: ${SITE_DIR}" >> "${LOG_FILE}"
cp -rp "${SITE_DIR}" "${TMP_DIR}/"
# 备份数据库
echo "[$(date)] 备份数据库: ${DB_NAME}" >> "${LOG_FILE}"
mysqldump -u "${DB_USER}" -p"${DB_PASS}" "${DB_NAME}" > "${TMP_DIR}/database.sql" 2>>"${LOG_FILE}"
if [ $? -ne 0 ]; then
echo "[$(date)] [错误] 数据库备份失败!" >> "${LOG_FILE}"
rm -rf "${TMP_DIR}"
exit 1
fi
# 打包压缩
echo "[$(date)] 压缩备份文件" >> "${LOG_FILE}"
tar -zcf "${BACKUP_FILE}" -C "/tmp" "${BACKUP_NAME}"
rm -rf "${TMP_DIR}"
SIZE=$(du -h "${BACKUP_FILE}" | cut -f1)
echo "[$(date)] 备份完成: ${BACKUP_FILE} (${SIZE})" >> "${LOG_FILE}"
# 删除7天前备份
find "${BACKUP_DIR}" -name "backup_*.tar.gz" -mtime +${KEEP_DAYS} -delete
echo "[$(date)] 当前备份列表:" >> "${LOG_FILE}"
ls -lh "${BACKUP_DIR}"/backup_*.tar.gz >> "${LOG_FILE}" 2>&1
echo "========== $(date) 备份结束 ==========" >> "${LOG_FILE}"
echo "" >> "${LOG_FILE}"
赋予权限,手动测试:
chmod +x /data/scripts/backup.sh
/data/scripts/backup.sh
ls -lh /data/backup
cat /data/backup/backup.log
测试恢复(必做)
mkdir -p /tmp/restore_test
tar -zxf /data/backup/xxx.tar.gz -C /tmp/restore_test
配置定时任务,openEuler自带crontab,语法不变
crontab -e
# 每天凌晨3点执行
0 3 * * * /data/scripts/backup.sh
crontab -l
# 每月、每天、每周,凌晨 3 点 0 分,执行脚本 /data/scripts/backup.sh
# 位置 字段 含义 示例说明
# 第 1 位 分钟 minute 0~59 0 → 第 0 分钟(整点)
# 第 2 位 小时 hour 0~23 3 → 凌晨 3 点
# 第 3 位 日期 day 1~31 * → 每月所有日期
# 第 4 位 月份 month 1~12 * → 每年所有月份
# 第 5 位 星期 week 0~7(0 和 7 都是周日) * → 每周全部星期
6. 关键差异(面试可以直接背)
| 项目 | Ubuntu | openEuler |
|---|---|---|
| 包管理器 | apt | dnf |
| 防火墙 | ufw | firewalld |
| Nginx用户 | www-data | nginx |
| MySQL配置 | /etc/mysql | /etc/my.cnf |
| systemd | 支持 | 同样支持(systemctl命令通用) |
| shell脚本 | 完全通用 | 完全通用,crontab一样 |
大部分命令:
systemctl / ss / ps / top / grep / sed / awk / tar完全一致,你现有的Linux基础直接复用。
7. 2G内存虚拟机额外避坑
- 不要同时开太多服务,实验时只跑nginx+mysql+redis;
- 观察
free -h,如果swap大量占用,就是内存不足,可以临时关闭redis测试; - 不要在这个欧拉虚拟机跑K8s,K8s放WSL2;这个虚拟机专门用来做Web+数据库+备份实验。
8. 阶段检验清单(不变,直接打勾)
- Nginx浏览器访问成功
- MySQL数据库、用户创建成功,内存优化生效
- Redis密码设置成功,本地读写正常
- backup.sh手动执行成功,生成备份包
- 备份包解压正常,sql文件可读取
- crontab定时任务配置完成
直接在当前openEuler虚拟机操作即可,不需要重建。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)