news 2026/10/1 8:45:24

openEuler 搭建 Nginx + MySQL + Redis + 自动备份教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
openEuler 搭建 Nginx + MySQL + Redis + 自动备份教程

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点执行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. 关键差异(面试可以直接背)

项目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虚拟机操作即可,不需要重建。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 8:44:15

Oracle数据库基础之5_权限管理

Schema模式是一系列对象的集合。一个模式只能够被一个数据库用户所拥有&#xff0c;并且模式的名称与这个用户的名称相同。ORACLE 数据库中的每个用户都拥有一个唯一的模式&#xff0c;他所创建的所有模式对象都保存在自己的模式中。模式对象的类型有表、索引、簇、触发器、PL/…

作者头像 李华
网站建设 2026/10/1 8:42:36

AnythingLLM 搭本地知识库:文档问答不准怎么调

有同事问我&#xff0c;本地大模型能不能直接读公司的产品文档&#xff0c;别张嘴就瞎编。我前阵子用 AnythingLLM 搭过一套本地知识库&#xff0c;能用&#xff0c;但中间踩了三个坑&#xff0c;今天把过程和调参的地方写下来。先说这套东西在干嘛。让模型回答文档里的问题&am…

作者头像 李华
网站建设 2026/10/1 8:42:14

台州市热门的品牌策划设计服务商有哪些,靠谱企业形象设计公司筛选名录

台州企业形象设计怎么选&#xff1a;一份务实的筛选参考 台州及浙东沿海制造产业带近年来对外形象需求明显上升。企业参与招投标、展会、外贸洽谈、线上传播时&#xff0c;客户第一眼看到的往往不是产品参数&#xff0c;而是标志、色彩、画册、官网这些视觉载体。搜索企业形象设…

作者头像 李华
网站建设 2026/10/1 8:41:37

Sqlserver_Oracle_Mysql_Postgresql表_索引碎片或膨胀的知识点汇总

碎片的定义&#xff1a; 指单个数据块/页内部的空间利用率不足。 成因&#xff1a; INSERT&#xff1a; 向页中插入新行&#xff0c;但新行的大小不足以填满块/页的空闲空间。 UPDATE&#xff1a; 更新导致行增长&#xff08;如 VARCHAR 列写入更多数据&#xff09;&#xff0c…

作者头像 李华