openEuler 完整 Nginx + MySQL + Redis + 自动备份教程

不用删掉重建虚拟机!openEuler 完全可以做这个 LNMR(Nginx+MySQL+Redis)实验,反而对你简历加分(懂欧拉,云厂商/政企很多用openEuler) 唯一改动点:

  1. 包管理器:dnf 代替 Ubuntu 的 apt
  2. 防火墙:firewalld 代替 ufw
  3. 软件包名称、部分配置路径细微差异
  4. 你的虚拟机内存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;
}
  1. 客户端浏览器访问:虚拟机IP:80(对外入口IP,Nginx的IP)

  2. Nginx收到请求,作为代理,主动发起新连接访问后端服务(后端地址写在proxy_pass里面)

  3. 后端应用看到的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

交互选项:

  1. 输入临时密码
  2. 设置新root密码(复杂度要求:大小写+数字+符号)
  3. 后面全部选 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. 关键差异(面试可以直接背)

项目UbuntuopenEuler
包管理器aptdnf
防火墙ufwfirewalld
Nginx用户www-datanginx
MySQL配置/etc/mysql/etc/my.cnf
systemd支持同样支持(systemctl命令通用)
shell脚本完全通用完全通用,crontab一样

大部分命令:systemctl / ss / ps / top / grep / sed / awk / tar 完全一致,你现有的Linux基础直接复用。

7. 2G内存虚拟机额外避坑

  1. 不要同时开太多服务,实验时只跑nginx+mysql+redis;
  2. 观察free -h,如果swap大量占用,就是内存不足,可以临时关闭redis测试;
  3. 不要在这个欧拉虚拟机跑K8s,K8s放WSL2;这个虚拟机专门用来做Web+数据库+备份实验。

8. 阶段检验清单(不变,直接打勾)

  • Nginx浏览器访问成功
  • MySQL数据库、用户创建成功,内存优化生效
  • Redis密码设置成功,本地读写正常
  • backup.sh手动执行成功,生成备份包
  • 备份包解压正常,sql文件可读取
  • crontab定时任务配置完成

直接在当前openEuler虚拟机操作即可,不需要重建。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐