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> EOFopenEuler 的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 mysqldMySQL8.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-lru2G虚拟机限制redis最大256M,防止吃掉全部内存
重启验证
systemctl restart redis redis-cli auth Redis密码 set test hello get test exit5. 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点执行03* * * /data/scripts/backup.shcrontab-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虚拟机操作即可,不需要重建。