分布式(加一键部署脚本)LNMP-Redis-Discuz5.0部署指南-小白详细版

LNMP + Redis 部署 Discuz 5.0X 小白详细版指南

写给小白的超详细图文教程

  • 🎯 目标:零基础也能成功部署自己的论坛
  • 💻 操作系统:openEuler 24.03(华为开源Linux系统)
  • 🛠 核心技术:LNMP(Nginx + MySQL + PHP)+ Redis 缓存
  • 📦 应用系统:Discuz! X 5.0(著名开源论坛系统)

阅读说明:本文档每个命令都有详细解释,每个步骤都有预期结果。请按照顺序一步步来,遇到不懂的名词先看第一章的基础知识!


📖 第一章:基础知识入门

在开始动手之前,让我们先来了解一下我们要安装的这些东西都是什么。就像装修房子之前,先要认识水泥、砖头、钢筋一样!

1.1 什么是 LNMP?

🌟 一句话解释:LNMP 是四个软件的首字母缩写,它们组合在一起,就能让你的服务器"跑起来"一个网站。

📦 四个组件分别是什么?

组件全称通俗比喻作用
LLinux房子的地基和主体结构操作系统,整个服务器的基础
NNginx房子的前台接待员Web服务器,接收访客请求,决定谁来处理
MMySQL房子的超大仓库数据库,存放网站的所有数据
PPHP房子的加工车间编程语言,处理业务逻辑

💡 形象的比喻

想象你要开一家网上超市:

  • Linux = 超市所在的整栋大楼(提供场地)
  • Nginx = 超市门口的保安和接待员(接待顾客)
  • MySQL = 超市的巨大仓库(存放商品和订单信息)
  • PHP = 超市的加工车间(把原料加工成商品)

1.2 什么是 Redis?为什么需要它?

🌟 一句话解释:Redis 是一个"超级快的临时记事本",可以加速你的网站。

📝 生活中的类比

想象你去奶茶店点单:

  • 没有Redis:你每次点奶茶,店员都要从仓库找原料、煮茶、加料…要等10分钟
  • 有Redis:店员把最常做的10种奶茶提前做好放在冰柜里,你点单30秒就能拿到!

Redis 就是这个"冰柜",把常用数据提前准备好,让网站响应更快。

💡 Redis 的优势

特点说明
🚀 速度超快数据存在内存里,读写速度是硬盘的上千倍
📊 减轻数据库压力热门数据从Redis拿,不用每次都查MySQL
💾 数据持久化可以把内存中的数据保存到硬盘,防止丢失
🔄 支持多种数据类型不只是简单的键值对,还支持列表、集合等

1.3 什么是 Discuz?

🌟 一句话解释:Discuz 是一款"论坛建站神器",让你不需要写代码也能拥有一个完整的社区论坛。

🏠 Discuz 能做什么?

  • 📋 论坛帖子系统(发帖、回帖、点赞)
  • 👥 用户注册登录
  • 💬 即时通讯/站内消息
  • 📁 文件上传下载
  • 🎨 换肤、主题定制
  • 📊 数据统计
  • …还有超级多功能!

💡 为什么选择 Discuz?

  • 🎯 中国最流行的开源论坛系统
  • 📅 20多年历史,持续更新
  • 🌍 几百万网站在使用
  • 🆓 完全免费开源

1.4 openEuler 24.03 是什么?

🌟 一句话解释:openEuler(发音:欧普恩乐)是华为开源的 Linux 操作系统,就像 Windows、MacOS 一样,但它更适合服务器使用。

📊 openEuler 的特点

特点说明
🆓 完全开源免费任何人都可以自由使用和修改
🔒 安全稳定企业级稳定性,适合长期运行
🚀 性能优异针对服务器场景深度优化
📦 国产系统中国人开发的操作系统

💡 24.03 是什么意思?

  • 24 = 2024年发布的版本
  • 03 = 3月份的版本
  • 所以 24.03 就是 2024年3月发布的版本!

1.5 前置条件检查清单

在开始之前,请确认你满足以下条件:

✅ 服务器准备

检查项要求验证方法
操作系统openEuler 24.03 已安装运行 cat /etc/os-release
网络连接能访问互联网运行 ping baidu.com
管理员权限root 用户或 sudo 权限运行 whoami
SSH 工具已安装 SSH 客户端可用 MobaXterm、Xshell、FinalShell 等

✅ 网络信息准备

信息用途如何获取
服务器 IP 地址访问网站用运行 ip addrhostname -I
SSH 端口连接服务器用默认 22,一般不用改
root 密码登录服务器用安装系统时设置

⚠️ 重要提醒

不要在生产环境直接使用本教程
本教程面向测试环境,省略了很多安全设置。如果你要在正式网站使用,请参考附录的"生产环境注意事项"。


🔧 第二章:准备工作

磨刀不误砍柴工!开始之前先做好准备工作。

2.1 获取服务器 IP 地址

🎯 目标:找到你服务器的 IP 地址,就像知道快递收货地址一样。

📝 操作步骤

步骤 1:连接服务器
打开你的 SSH 工具(如 MobaXterm),连接到服务器:

用户名:root
密码:你的root密码
服务器IP:你的服务器IP
端口:22

步骤 2:查看 IP 地址
在终端中运行:

ip addr

📖 这条命令的意思是…

命令含义
ip网络配置工具
addraddress(地址)的缩写

✅ 预期结果

你会看到类似这样的输出:

1: lo: <LOOPBACK,UP> ...
2: eth0: <BROADCAST,MULTICAST,UP> ...
    inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic noprefixroute eth0

💡 重点看 inet 后面的数字,如 192.168.1.100,这就是你的服务器IP!

💡 小技巧

如果输出太多不好找,可以用这个命令只显示IP:

hostname -I

2.2 准备终端工具(SSH 连接)

🎯 目标:学会用 SSH 工具连接服务器,就像用远程桌面连接Windows一样。

📝 什么是 SSH?

SSH(Secure Shell)是一种加密的网络协议,让你能安全地远程控制另一台电脑。就像医院里的"远程会诊",专家不用亲自到场也能操控手术机器人!

💡 推荐使用的工具

工具优点适用系统
MobaXterm功能强大,免费版够用,支持拖拽上传Windows
FinalShell国产软件,界面友好Windows/Mac
Xshell经典老牌,收费但稳定Windows
系统自带TerminalMac/Linux自带Mac/Linux

📝 MobaXterm 使用步骤

  1. 下载安装:官网 https://mobaxterm.mobatek.net/
  2. 新建连接:点击左上角 “Session” → “SSH”
  3. 填写信息
    • Remote host:你的服务器IP(如 192.168.1.100)
    • Specify username:root
  4. 连接:点击 “OK”,输入密码即可

⚠️ 注意事项

⚠️ 第一次连接会提示"是否保存密钥",选择"是"
⚠️ 输入密码时屏幕不会显示任何字符,这是正常的安全设计,输入完直接回车即可


2.3 准备 Discuz 安装包

🎯 目标:下载 Discuz 5.0 安装包,准备上传到服务器。

📥 下载 Discuz

  1. 访问 Discuz 官网:https://www.discuz.vip/
    或社区下载站:https://www.dismall.com/
  2. 进入下载页面
  3. 下载最新版的 Discuz! X 5.0(通常文件名是 Discuz_X5.0_SC_UTF8.zip 或类似)

💡 直链下载:你也可以使用以下命令直接下载到服务器:

cd /usr/share/nginx/html/
wget https://download.comsenz.com/DiscuzX/Discuz_X5.0_SC_UTF8.zip
unzip Discuz_X5.0_SC_UTF8.zip

⚠️ 版本说明

💡 _SC_UTF8 是什么意思?

  • SC = 简体中文版(Simplified Chinese)
  • UTF8 = 统一的字符编码,避免乱码
  • 如果你要用繁体,就选 TC 版本

📁 安装包结构

下载后会得到一个压缩包,解压后会看到:

upload/          ← 这个文件夹里面的内容才是要上传的!
├── admin.php    ← 后台管理入口
├── forum.php    ← 论坛首页
├── static/      ← 静态资源文件夹
├── config/      ← 配置文件
└── ...          ← 其他文件

💡 为什么要上传 upload 里面的内容?

想象你买了套家具,upload 文件夹就是"零件包"。你需要把这些零件按照说明书组装起来,而不是把整个零件包扔上去!


🖥️ 第三章:安装 LNMP 环境

现在开始正式安装!这章会详细介绍每一步,让你知其然更知其所以然。

3.1 设置主机名

🎯 目标:给服务器起个名字,方便识别。

📝 背景知识

什么是主机名?
就像每个人都有名字一样,服务器也需要一个名字。在局域网中,你可以用名字而不是IP来访问其他电脑,比如 ssh lnmp-server 而不是 ssh 192.168.1.100

📝 操作步骤

步骤 1:设置主机名

hostnamectl set-hostname lnmp && bash

📖 这条命令的意思是…

命令部分含义
hostnamectl主机名管理工具(hostname control)
set-hostname设置主机名(set hostname)
lnmp你要设置的名字,叫什么都行,建议简短
&&并且(AND),前面的成功后再执行后面的
bash重新启动一个shell,让新主机名生效

✅ 预期结果

命令执行后不会有明显输出,但你可以验证:

hostname

应该显示 lnmp

⚠️ 注意事项

⚠️ 如果 && bash 不生效,可以:

  1. 手动输入 bash 回车
  2. 或者完全退出重新连接SSH

❌ 不要取太长的名字,可能会导致一些软件报错


3.2 安装软件包

🎯 目标:一次性安装所有需要的软件(Nginx、MySQL、PHP、Redis等)。

📝 背景知识

什么是 yum?
yum(Yellowdog Updater Modified)是 Linux 的软件商店。你可以把它想象成手机上的"应用市场",用它来一键安装软件!

📝 操作步骤

步骤 1:执行安装命令

yum install -y lrzsz mysql-server nginx redis php php-fpm php-mysqlnd php-xml

📖 这条命令的意思是…

命令部分含义
yum软件包管理器(Yellowdog Updater Modified)
install安装
-y自动确认所有提示(yes),不用手动按y
lrzsz文件传输工具(后面上传文件用)
mysql-serverMySQL数据库服务器
nginxWeb服务器(读作"引擎X")
phpPHP解释器
php-fpmPHP FastCGI进程管理器(让PHP跑得更快更稳定)
php-mysqlndPHP连接MySQL的驱动程序
php-xmlPHP处理XML的扩展(Discuz需要)
redisRedis缓存服务器

⚠️ 额外扩展:如果 Discuz 安装时提示缺少扩展,可以补充安装:

yum install -y php-gd php-mbstring php-json
systemctl restart php-fpm

💡 每个软件包的详细说明

软件包通俗解释类比
nginx网站的门卫和服务员餐厅接待员
mysql-server存放和管理数据的仓库大型图书馆
php把网页请求变成网页的翻译机厨师
php-fpm帮PHP更高效工作的管理器厨房主管
redis超快的临时记事本收银台的预约本

✅ 预期结果

安装过程会显示下载进度,最后显示:

Complete!

安装完成!

⚠️ 注意事项

⚠️ 安装过程可能需要几分钟,取决于你的网络速度
⚠️ 如果提示 Package not found,可能是软件源的问题,先运行 yum update 更新软件源
⚠️ openEuler 默认用 dnf,yum 命令会自动转发给 dnf,两者效果一样


3.3 启动服务

🎯 目标:让安装的软件运行起来!

📝 背景知识

什么是 systemctl?
systemctl 是 Linux 系统的"服务管理器"。你可以把它想象成一个大楼的物业管理系统,用它来控制各个服务(电梯、空调、消防)的开关状态。

📝 操作步骤

步骤 1:启动 Nginx

systemctl start nginx

📖 这条命令的意思是…

命令部分含义
systemctl系统服务控制工具(system control)
start启动
nginx要启动的服务名

✅ 预期结果

没有任何错误输出就说明成功了!


步骤 2:启动 PHP-FPM

systemctl start php-fpm

✅ 预期结果

没有任何错误输出就说明成功了!


步骤 3:同时启动多个服务

systemctl start nginx php-fpm

📖 这条命令的意思是…

命令部分含义
systemctl start启动服务
nginx php-fpm同时启动这两个服务(用空格分隔)

💡 小技巧

💡 你可以用一条命令启动所有需要的服务:

systemctl start nginx php-fpm mysqld redis

这样 nginx、php-fpm、mysql、redis 四个服务同时启动!

💡 设置开机自启(可选):

systemctl enable nginx php-fpm mysqld redis

这样服务器重启后,服务会自动启动!


3.4 验证服务状态

🎯 目标:确认服务是否成功启动。

📝 背景知识

什么是进程?
进程就是正在运行的程序。就像你打开很多浏览器窗口一样,每个窗口都是一个进程。

📝 操作步骤

步骤 1:检查 Nginx 是否在监听端口

netstat -anptu | grep nginx

📖 这条命令的意思是…

命令部分含义
netstat网络状态查看工具(network statistics)
-a显示所有(all)
-n用数字显示端口(不用显示服务名)
-p显示进程ID(process)
-t显示TCP协议
-u显示UDP协议
|管道,把前面命令的输出传给后面
grep nginx过滤出包含"nginx"的行

✅ 预期结果

tcp   0   0   0.0.0.0:80   0.0.0.0:*   LISTEN   1234/nginx: master

📊 结果解读

字段含义我们看到的值
tcpTCP协议tcp
0.0.0.0:80监听所有IP的80端口正常!
LISTEN正在监听正常!
1234进程ID-
nginx: masternginx主进程正常!

✅ 如果看到 LISTENnginx,说明 Nginx 启动成功!


步骤 2:检查 PHP-FPM 进程

ps aux | grep php-fpm

📖 这条命令的意思是…

命令部分含义
ps进程查看工具(process status)
aux显示所有进程(a=all, u=详细信息, x=包括未终端的)
| grep php-fpm过滤出包含 php-fpm 的行

✅ 预期结果

root   1234   0.0   0.2   ...   php-fpm: master process
apache 1235   0.0   0.1   ...   php-fpm: pool www
apache 1236   0.0   0.1   ...   php-fpm: pool www

📊 结果解读

字段含义解读
root运行用户主进程需要root权限
apache运行用户工作进程用普通用户跑,更安全
master主进程管理其他进程
pool wwwwww连接池处理网页请求的进程

✅ 如果看到 master 和 pool www,说明 PHP-FPM 启动成功!


步骤 3:一键查看所有服务状态

systemctl status nginx php-fpm

📖 这条命令的意思是…

命令部分含义
systemctl status查看状态

✅ 预期结果

每个服务会显示类似这样的信息:

● nginx.service - nginx: high performance web server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled)
   Active: active (running)   ← 绿色,表示正在运行!

active (running) = 正在运行 ✅
inactive (dead) = 没有运行
failed = 启动失败


✅ 第四章:环境验证测试

安装完软件后,先测试一下能不能正常工作,就像装修完要先开灯试电一样!

4.1 创建 PHP 测试页

🎯 目标:创建一个测试页面,验证 Nginx + PHP 能否正常工作。

📝 背景知识

什么是 phpinfo()?
phpinfo() 是一个PHP内置函数,它会显示PHP的所有配置信息。就像打开冰箱看里面有什么,这个函数能让你看到PHP的全部"内脏"!

📝 操作步骤

步骤 1:进入网站目录

cd /usr/share/nginx/html/

📖 这条命令的意思是…

命令部分含义
cd切换目录(change directory)
/usr/share/nginx/html/Nginx的网站根目录

💡 什么是网站根目录?
就是存放网页文件的地方。用户访问你的网站时,服务器会从这里找文件。就像图书馆的入口大厅,所有书籍都在这里!


步骤 2:清空目录(可选)

rm -rf *

📖 这条命令的意思是…

命令部分含义
rm删除(remove)
-r递归删除,包括子文件夹(recursive)
-f强制删除,不提示确认(force)
*所有文件(通配符)

⚠️ 警告:这个命令会删除目录下所有文件!如果是新装的系统没关系,但如果目录里有重要文件,请先备份!


步骤 3:创建 PHP 测试文件

vim index.php

📖 这条命令的意思是…

命令部分含义
vimLinux最常用的文本编辑器(类似Windows的记事本)
index.php要创建的文件名

📝 Vim 编辑器使用方法

Vim 有三种模式:

模式进入方式用途
普通模式默认浏览、移动光标、删文字
编辑模式i输入文字
命令模式:保存、退出等操作

📝 详细操作步骤

  1. 输入 vim index.php 回车,进入vim
  2. i 键,进入编辑模式(左下角显示 -- INSERT --
  3. 输入以下内容:
<?php
phpinfo();
?>
  1. Esc 键,退出编辑模式
  2. 输入 :wq 回车,保存并退出

💡 Vim 常用快捷键

按键功能
i进入编辑模式
Esc退出编辑模式
:wq保存并退出(write quit)
:q!不保存强制退出
dd删除当前行
yy复制当前行
p粘贴

💡 如果觉得 Vim 太难,可以用更简单的编辑器:

nano index.php

nano 更像 Windows 记事本,底部有操作提示。


步骤 4:保存文件内容

输入以下内容:

<?php
phpinfo();
?>

💡 这段代码的意思是:

  • <?php = PHP代码开始标签
  • phpinfo(); = 调用phpinfo函数,显示PHP配置信息
  • ?> = PHP代码结束标签

✅ 预期结果

文件创建完成后,验证一下:

cat index.php

应该显示:

<?php
phpinfo();
?>

4.2 测试 Nginx + PHP

🎯 目标:通过浏览器访问测试页面,验证整个网站环境是否正常。

📝 操作步骤

步骤 1:查看服务器IP

hostname -I

✅ 预期结果

显示类似 192.168.1.100 的IP地址。


步骤 2:浏览器访问

打开电脑浏览器(Chrome、Edge、Firefox等),在地址栏输入:

http://192.168.1.100/index.php

(把 192.168.1.100 换成你的实际IP)

✅ 预期结果

✅ 应该看到一个很长的页面,显示"PHP Version 8.x.x"
✅ 页面中包含大量表格:PHP Core、apache2handler、bcmath 等

📊 如果成功,说明:

  • ✅ Nginx 正常工作,能接收请求
  • ✅ PHP 正常工作,能处理PHP代码
  • ✅ 两者连接正常

❌ 如果显示 “502 Bad Gateway”

说明 Nginx 无法连接到 PHP-FPM,解决方案:

systemctl restart nginx php-fpm

❌ 如果显示 “403 Forbidden”

说明没有权限,解决方案:

chmod 755 /usr/share/nginx/html/
ls -la /usr/share/nginx/html/index.php

4.3 创建 MySQL 测试页

🎯 目标:创建一个测试页面,验证 PHP 能否连接 MySQL 数据库。

📝 操作步骤

步骤 1:启动 MySQL 服务

systemctl start mysqld

📖 这条命令的意思是…

命令部分含义
systemctl start启动服务
mysqldMySQL数据库服务(d=daemon,守护进程)

步骤 2:创建 MySQL 连接测试文件

vim /usr/share/nginx/html/mysql_con.php

步骤 3:输入以下内容

<?php
// 数据库连接配置
$servername = "localhost";      // 服务器地址(本地)
$username = "root";             // 用户名
$password = "";                // 密码(测试环境默认空)

// 创建数据库连接
$conn = new mysqli($servername, $username, $password);

// 检查连接是否成功
if ($conn->connect_error) {
    // 连接失败,显示错误信息
    die("连接失败: " . $conn->connect_error);
}

// 连接成功!
echo "MySQL 连接成功!";
echo "<br>MySQL 版本: " . mysqli_get_server_info($conn);
?>

📖 这段代码的意思是…

代码部分通俗解释
$servername = "localhost"服务器地址是"本地"
$username = "root"用户名是root(管理员)
$password = ""密码是空的
new mysqli(...)创建数据库连接对象
$conn->connect_error检查连接是否有错误
die("...")如果有错,停止并显示错误
mysqli_get_server_info($conn)获取MySQL版本信息

步骤 4:浏览器访问测试

在浏览器中输入:

http://192.168.1.100/mysql_con.php

✅ 预期结果

✅ 应该显示:

MySQL 连接成功!
MySQL 版本: 8.0.x

📊 如果成功,说明:

  • ✅ MySQL 数据库已启动
  • ✅ PHP 能成功连接 MySQL
  • ✅ PHP-MySQL 驱动已安装

❌ 如果显示 “连接失败”

检查MySQL是否启动:

systemctl status mysqld

如果没启动,先启动:

systemctl start mysqld

4.4 测试数据库连接

🎯 目标:学会在命令行直接操作 MySQL 数据库。

📝 操作步骤

步骤 1:登录 MySQL

mysql -u root -p

📖 这条命令的意思是…

命令部分含义
mysqlMySQL客户端工具
-u root用户名是 root
-p需要输入密码(password)

✅ 预期结果

Enter password: 

💡 直接按回车即可(测试环境root默认无密码)

✅ 登录成功后显示

Welcome to MySQL Monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.x MySQL Community Server

mysql> 

💡 注意:看到 mysql> 提示符就说明登录成功了!


步骤 2:查看所有数据库

SHOW DATABASES;

📖 这条命令的意思是…

命令部分含义
SHOW显示
DATABASES数据库
;SQL语句结束符(必须加!)

✅ 预期结果

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)

📊 结果解读

数据库名用途
information_schemaMySQL系统信息(自动创建)
mysql用户和权限信息(自动创建)
performance_schema性能监控数据(自动创建)
sys系统数据(自动创建)

💡 这些数据库都是 MySQL 自动创建的,你不需要管它们。


步骤 3:退出 MySQL

EXIT;

或者

QUIT;

或者直接按 Ctrl + D

✅ 预期结果

Bye

然后回到普通命令提示符。


🚀 第五章:部署 Discuz 论坛

现在开始正式部署 Discuz!这是一切的高潮部分!

5.1 上传安装包

🎯 目标:把 Discuz 安装包上传到服务器。

📝 方法一:使用 rz 命令(推荐)

步骤 1:确认 lrzsz 已安装

rpm -qa | grep lrzsz

如果没有任何输出,先安装:

yum install -y lrzsz

步骤 2:切换到网站目录

cd /usr/share/nginx/html/

步骤 3:执行上传命令

rz

📖 这条命令的意思是…

命令含义
rz接收文件(receive Zmodem)

✅ 预期结果

会弹出一个文件选择对话框,选择你下载的 upload.zip 文件。

💡 什么是 Zmodem?
一种古老的文件传输协议,现在被包装成简单的 rz/sz 命令使用。


📝 方法二:使用拖拽上传(如果你的SSH工具支持)

如果你用的是 MobaXterm,可以直接把文件拖拽到终端窗口,会自动上传到当前目录。


📝 方法三:使用 scp 命令

如果你在本地电脑上,可以打开一个新的终端窗口:

Windows (PowerShell) / Mac / Linux:

scp /本地/路径/upload.zip root@服务器IP:/usr/share/nginx/html/

📖 这条命令的意思是…

命令部分含义
scp安全复制(secure copy)
/本地/路径/upload.zip本地文件路径
root@服务器IP服务器用户和地址
/usr/share/nginx/html/目标目录

⚠️ 输入后会提示输入服务器密码


5.2 解压文件

🎯 目标:把压缩包解压,获取 Discuz 程序文件。

📝 操作步骤

步骤 1:查看上传的文件

ls -la

📖 这条命令的意思是…

命令部分含义
ls列出文件(list)
-l详细列表(long format)
-a显示隐藏文件(all)

✅ 预期结果

应该看到类似:

-rw-r--r--  1 root root  8.5M  upload.zip

步骤 2:解压安装包

unzip upload.zip

📖 这条命令的意思是…

命令部分含义
unzip解压ZIP文件
upload.zip要解压的文件名

✅ 预期结果

会显示解压过程:

Archive:  upload.zip
   creating: upload/
  extracting: upload/readme.html
  extracting: upload/forum.php
  ...

步骤 3:查看解压后的内容

ls -la

✅ 预期结果

应该看到:

drwxr-xr-x 3 root root  upload/
-rw-r--r-- 1 root root  upload.zip

💡 小技巧:一步到位

💡 如果你想解压到指定目录:

unzip upload.zip -d /目标目录/

💡 如果你的系统没有 unzip,先安装:

yum install -y unzip

5.3 设置权限

🎯 目标:让 PHP-FPM 能够读写 Discuz 文件。

📝 背景知识

为什么需要设置权限?
Linux 是一个多用户系统,每个文件和文件夹都有"主人"和"权限"。

想象一栋公寓:

  • 每个房间都有主人
  • 主人可以决定谁能进出
  • PHP-FPM 就像一个"租客",需要主人授权才能使用房间

📝 操作步骤

步骤 1:查看 PHP-FPM 运行用户

ps aux | grep php-fpm

✅ 预期结果

root      1234  ...  php-fpm: master process
apache    1235  ...  php-fpm: pool www
apache    1236  ...  php-fpm: pool www

💡 可以看到 PHP-FPM 的工作进程是用 apache 用户运行的!


步骤 2:设置文件所有者

chown apache:apache /usr/share/nginx/html/upload/ -R

📖 这条命令的意思是…

命令部分含义
chown改变所有者(change owner)
apache新所有者(用户)
apache新所有者(组)
/usr/share/nginx/html/upload/目标目录
-R递归,包括所有子文件和文件夹

💡 什么是 chown apache:apache?

部分含义说明
apache:apache用户:用户组把文件主人改成apache用户和apache组

✅ 预期结果

没有任何输出表示成功!


步骤 3:验证权限设置

ls -la /usr/share/nginx/html/upload/

✅ 预期结果

drwxr-xr-x  2 apache apache   ...  .
drwxr-xr-x  6 apache apache   ...  ..
drwxr-xr-x  5 apache apache   ...  admin.php ...

✅ 如果看到 apache apache,说明权限设置正确!


步骤 4:设置目录和文件权限(可选但推荐)

# 设置目录权限为755(drwxr-xr-x)
find /usr/share/nginx/html/upload/ -type d -exec chmod 755 {} \;

# 设置文件权限为644(-rw-r--r--)
find /usr/share/nginx/html/upload/ -type f -exec chmod 644 {} \;

📖 这条命令的意思是…

命令部分含义
find ... -type d找出所有目录
-exec chmod 755 {} \;对每个结果执行 chmod 755
type f找出所有文件

💡 755 和 644 是什么意思?

所有者(Owner)  群组(Group)  其他用户
rwx             r-x          r-x
421             421          421
= 7             = 5          = 5

7 = 可读可写可执行,5 = 可读可执行


5.4 Web 安装向导

🎯 目标:通过浏览器完成 Discuz 的在线安装。

📝 操作步骤

步骤 1:确认服务全部启动

systemctl status nginx php-fpm mysqld

确保显示 active (running)


步骤 2:打开浏览器访问安装向导

在浏览器地址栏输入:

http://192.168.1.100/upload/install/

⚠️ 把 192.168.1.100 换成你的服务器IP!

✅ 预期结果

✅ 应该看到 Discuz 安装向导页面!
✅ 如果显示 “403 Forbidden”,检查目录权限
✅ 如果显示 “404 Not Found”,检查URL是否正确


5.5 安装向导详解(每一步都有)

🎯 第一步:阅读许可协议

📱 页面显示:Discuz! X 安装协议

💡 解释:这是一个法律协议,说明你有权使用这个软件。一般直接点"我同意"就行。

✅ 操作:点击"我同意"按钮


🎯 第二步:环境检测

📱 页面显示:一套检测表格,显示各项指标

📊 检测项目说明

检测项要求说明
操作系统类Unix✅ 通过
PHP 版本PHP 8.0+⚠️ 如果低于8.0可能有问题
MySQL支持✅ 通过
目录权限可写⚠️ 如果红叉,返回检查权限
PHP 扩展xml、mysqlnd、gd等✅ 通过

✅ 预期结果

✅ 看到类似 “您的服务器配置符合要求” 或所有项都是绿色/对勾

💡 如果有红叉怎么办?

⚠️ 目录不可写:检查权限

chown apache:apache /usr/share/nginx/html/upload/ -R
chmod 755 /usr/share/nginx/html/upload/ -R

⚠️ 缺少PHP扩展:安装扩展

yum install -y php-gd php-json php-mbstring
systemctl restart php-fpm

✅ 操作:点击"下一步"


🎯 第三步:选择安装方式

📱 页面显示:全新安装 / 覆盖安装

💡 解释

  • 全新安装:从零开始创建论坛(第一次安装选这个)
  • 覆盖安装:保留数据,只更新程序(升级时用)

✅ 操作:选择"全新安装",点击"下一步"


🎯 第四步:配置数据库

📱 页面显示:数据库配置表单

📋 填写说明

字段示例值说明
数据库服务器localhost本机安装不用改
数据库端口3306MySQL默认端口,不用改
数据库名称cz任意英文名,建议简短
数据库用户名root测试环境用root
数据库密码(空)测试环境root无密码
表前缀pre_建议保持默认,可区分多个论坛

💡 数据库名是什么?

💡 就像不同的仓库放不同的货物,你的论坛需要一个"专属仓库"。
数据库名称就是给这个仓库起的名字,比如 czforumbbs 都可以。

✅ 预期填写结果

数据库服务器: localhost
数据库端口: 3306
数据库名: cz
数据库用户名: root
数据库密码: (留空)
表前缀: pre_

✅ 操作:填写完成后,点击"下一步"


🎯 第五步:设置管理员账号

📱 页面显示:管理员设置表单

📋 填写说明

字段示例值说明
管理员账号admin123论坛管理员用户名
管理员密码Admin@123建议大小写+数字+符号
确认密码Admin@123再输一遍确认
管理员邮箱admin@example.com用于找回密码等

⚠️ 重要提醒

⚠️ 管理员账号不要用 admin!黑客第一个试的就是admin,很容易被破解!

⚠️ 密码一定要强!建议包含:

  • 大写字母(A-Z)
  • 小写字母(a-z)
  • 数字(0-9)
  • 特殊符号(!@#$%)

✅ 操作:填写完成后,点击"下一步"


🎯 第六步:安装完成

📱 页面显示:恭喜!Discuz! X 安装完成!

✅ 预期结果

✅ 看到"安装成功"提示!
✅ 显示论坛访问地址和管理后台地址

📋 显示的信息

地址用途
http://你的IP/upload/论坛首页
http://你的IP/upload/admin.php管理后台

⚠️ 安装后必做

⚠️ 删除安装目录(安全起见):

rm -rf /usr/share/nginx/html/upload/install/

🔧 第六章:配置 Redis 缓存

这一章让你的论坛跑得更快!

6.1 什么是 Redis 缓存?

🌟 一句话解释:Redis 就像餐厅的"备餐台",把常用的东西提前准备好,客人要的时候马上给,不用每次都去厨房现做。

📊 没有缓存 vs 有缓存

场景无缓存有Redis缓存
用户打开论坛查数据库,2秒直接读缓存,0.1秒
查看热门帖子列表每次都计算排序直接返回缓存结果
同时1000人在线数据库压力山大Redis分担大部分请求

6.2 修改 Redis 配置

🎯 目标:配置 Redis 允许远程连接(测试环境需要)。

📝 操作步骤

步骤 1:备份原配置文件

cp /etc/redis.conf /etc/redis.conf.bak

📖 这条命令的意思是…

命令部分含义
cp复制(copy)
/etc/redis.conf原文件
/etc/redis.conf.bak备份文件

💡 为什么要备份?
就像打游戏前先存档,备份让你改错了还能还原!


步骤 2:修改配置

sed -i 's/^protected-mode yes/protected-mode no/' /etc/redis.conf

📖 这条命令的意思是…

命令部分含义
sed流编辑器(stream editor)
-i直接修改文件(in-place)
's/old/new/'把 old 替换成 new
^protected-mode yes以 protected-mode yes 开头的行
protected-mode no替换成 protected-mode no

💡 protected-mode 是什么?

💡 protected-mode 是 Redis 的保护开关:

  • yes = 只允许本地连接(127.0.0.1)
  • no = 允许任何地址连接

⚠️ 测试环境可以关闭,生产环境建议保持开启并设置密码!


步骤 3:验证修改

grep "protected-mode" /etc/redis.conf

✅ 预期结果

protected-mode no

✅ 显示 no 表示修改成功!


6.3 启动 Redis 服务

🎯 目标:让 Redis 服务运行起来。

📝 操作步骤

步骤 1:启动 Redis

systemctl start redis

✅ 预期结果

没有任何输出表示启动成功!


步骤 2:检查 Redis 状态

systemctl status redis

✅ 预期结果

● redis.service - Redis...
   Active: active (running)   ← 绿色,表示正在运行!

步骤 3:测试 Redis 连接

redis-cli ping

📖 这条命令的意思是…

命令部分含义
redis-cliRedis命令行客户端
ping心跳测试命令

✅ 预期结果

PONG

✅ 返回 PONG 表示 Redis 正常工作!

💡 ping-pong 是什么?

💡 就像小时候玩的"ping-pong",你喊"ping",对方回"pong"。
计算机也用这种方式测试连接是否正常!


步骤 4:查看 Redis 详细信息

redis-cli info

✅ 预期结果

显示 Redis 的详细信息,包括:

redis_version:7.x.x
uptime_in_seconds:12345
connected_clients:1
...

💡 可以看到 Redis 版本、运行时间等信息


6.4 配置 Discuz 连接 Redis

🎯 目标:让 Discuz 论坛使用 Redis 作为缓存。

📝 操作步骤

步骤 1:打开 Discuz 配置文件

vim /usr/share/nginx/html/upload/config/config_global.php

步骤 2:找到 memory 配置段

在 vim 中按 / 然后输入 memory,按回车搜索

📖 vim 搜索命令

命令功能
/keyword搜索 keyword
n下一个匹配
N上一个匹配
Esc退出搜索

步骤 3:修改配置文件

找到 $_config['memory'] 配置段,添加或修改为:

$_config['memory']['redis']['server'] = '127.0.0.1';
$_config['memory']['redis']['port'] = 6379;
$_config['memory']['redis']['pconnect'] = 0;
$_config['memory']['redis']['timeout'] = 1;
$_config['memory']['redis']['password'] = '';
$_config['memory']['redis']['serializer'] = 1;

📖 配置项解释

配置项含义说明
redis']['serverRedis服务器地址127.0.0.1 = 本机
redis']['portRedis端口6379 是默认端口
redis']['pconnect长连接0=关闭,1=开启
redis']['timeout连接超时时间1秒足够
redis']['password连接密码空=无密码
redis']['serializer序列化方式1=PHP序列化

步骤 4:设置内存驱动为 Redis

在同一文件中找到或添加:

$_config['memory']['driver'] = 'redis';

💡 这行配置告诉 Discuz:“用 Redis 来做缓存!”


步骤 5:保存并退出

Esc,然后输入 :wq,回车


✅ 验证配置

grep -A 10 "memory" /usr/share/nginx/html/upload/config/config_global.php

✅ 预期结果

应该看到 memory 相关的配置:

$_config['memory']['driver'] = 'redis';
$_config['memory']['redis']['server'] = '127.0.0.1';
...

📦 第七章:安装 PHP Redis 扩展

让 PHP 能够"说话" Redis!

7.1 什么是 PECL?

🌟 一句话解释:PECL 是 PHP 的"应用商店",专门提供 PHP 扩展。

📊 类比理解

概念说明
PHP基础程序(手机)
PECL扩展商店(应用市场)
Redis 扩展PECL 上的一个应用(微信App)

💡 就像微信让手机能聊天,Redis扩展让PHP能连接Redis!

7.2 安装编译工具

🎯 目标:安装编译 Redis 扩展需要的工具。

📝 操作步骤

yum install -y php-devel php-pear gcc make

📖 安装包说明

包名作用
php-develPHP开发工具(编译扩展需要)
php-pearPECL的包管理器
gccC语言编译器(编译Redis扩展需要)
make构建工具(组织编译过程)

💡 编译就像"组装",gcc是螺丝刀,make是说明书!


7.3 安装 Redis 扩展

🎯 目标:安装 PHP Redis 扩展。

📝 操作步骤

步骤 1:使用 PECL 安装

pecl install redis

📖 这条命令的意思是…

命令部分含义
peclPHP扩展库管理工具
install redis安装redis扩展

✅ 安装过程

安装过程中会提示几个问题,直接按回车使用默认值即可(共4-5个选项)。

💡 预计需要等待1-3分钟,取决于网络速度!


💡 如果不想手动按回车(自动安装)

yes "" | pecl install redis

📖 这条命令的意思是…

命令部分含义
yes ""连续输出空行(模拟回车)
|管道,把输出传给 pecl

💡 这样所有问题都自动按回车,使用默认值!


步骤 2:启用 Redis 扩展

echo "extension=redis.so" >> /etc/php.ini

📖 这条命令的意思是…

命令部分含义
echo输出文本
extension=redis.so启用redis扩展的指令
>>追加写入(不覆盖原有内容)
/etc/php.iniPHP配置文件

步骤 3:验证扩展已添加

grep "redis.so" /etc/php.ini

✅ 预期结果

extension=redis.so

✅ 表示扩展已启用!


7.4 重启 PHP-FPM

🎯 目标:让新安装的扩展生效。

📝 操作步骤

systemctl restart php-fpm

💡 就像重新开手机让新安装的App生效一样!


7.5 验证 Redis 扩展

🎯 目标:确认 PHP 能识别 Redis 扩展。

📝 操作步骤

步骤 1:命令行检查

php -m | grep redis

📖 这条命令的意思是…

命令部分含义
php -m列出所有已加载的PHP模块
grep redis过滤包含 redis 的行

✅ 预期结果

redis

✅ 看到 redis 表示扩展安装成功!


步骤 2:通过 phpinfo 检查

浏览器访问:

http://192.168.1.100/index.php

Ctrl + F(或页面内搜索),搜索 “redis”

✅ 预期结果

✅ 应该看到 “redis” 扩展的信息,包括版本号


⚠️ 如果验证失败

❌ 如果 php -m | grep redis 没有输出:

检查1:扩展是否写入正确位置

grep "extension=redis.so" /etc/php.ini

检查2:看看是否有语法错误

php -m

看有没有报错


🔍 第八章:最终验证

所有安装完成后,做一个全面检查!

8.1 完整验证清单

📋 系统服务检查

检查项命令预期结果
Nginx 运行systemctl status nginxactive (running) ✅
PHP-FPM 运行systemctl status php-fpmactive (running) ✅
MySQL 运行systemctl status mysqldactive (running) ✅
Redis 运行systemctl status redisactive (running) ✅

📋 服务连接检查

检查项命令预期结果
Redis 连接redis-cli pingPONG ✅
MySQL 连接mysql -u root -e "SELECT 1;"显示1行 ✅
PHP 版本php -vPHP 8.x.x ✅
Nginx 版本nginx -vnginx version ✅

📋 浏览器访问检查

检查项访问地址预期结果
PHP 信息http://IP/index.phpPHP信息页面 ✅
MySQL 测试http://IP/mysql_con.phpMySQL连接成功 ✅
论坛首页http://IP/upload/Discuz论坛首页 ✅
管理后台http://IP/upload/admin.php登录页面 ✅

📋 Redis 功能检查

检查项命令预期结果
Redis 扩展php -m | grep redisredis ✅
Redis 键redis-cli keys '*'显示缓存键 ✅

8.2 常见问题排查

❌ 问题:502 Bad Gateway

原因:Nginx 无法连接到 PHP-FPM

排查步骤

# 1. 检查 PHP-FPM 是否运行
ps aux | grep php-fpm

# 2. 检查 Nginx 错误日志
tail -30 /var/log/nginx/error.log

# 3. 重启两个服务
systemctl restart nginx php-fpm

💡 解决方案:重启 PHP-FPM 和 Nginx


❌ 问题:连接数据库失败

原因:MySQL 没有启动或密码错误

排查步骤

# 1. 检查 MySQL 状态
systemctl status mysqld

# 2. 启动 MySQL
systemctl start mysqld

# 3. 测试连接
mysql -u root -p

💡 解决方案:启动 MySQL 服务


❌ 问题:页面显示白屏

原因:PHP 错误或文件权限问题

排查步骤

# 1. 检查 PHP 错误日志
tail -30 /var/log/php-fpm/www-error.log

# 2. 检查文件权限
ls -la /usr/share/nginx/html/upload/

💡 解决方案:修复权限或查看错误日志


❌ 问题:Redis 连接失败

原因:Redis 没有启动或配置错误

排查步骤

# 1. 检查 Redis 状态
systemctl status redis

# 2. 测试 Redis
redis-cli ping

# 3. 检查 Discuz 配置
grep redis /usr/share/nginx/html/upload/config/config_global.php

💡 解决方案:启动 Redis 或检查配置


8.3 快速命令参考

💡 一键启动所有服务

systemctl start nginx php-fpm mysqld redis

💡 一键重启所有服务

systemctl restart nginx php-fpm mysqld redis

💡 一键查看所有服务状态

systemctl status nginx php-fpm mysqld redis

💡 一键测试所有连接

echo "=== Redis ===" && redis-cli ping && \
echo "=== MySQL ===" && mysql -u root -e "SELECT 'OK';" && \
echo "=== PHP ===" && php -r "echo 'PHP OK';" && \
echo "=== Redis Extension ===" && php -m | grep redis

📚 附录

附录 A:常用命令速查表

🔧 服务管理命令

命令作用示例
systemctl start 服务名启动服务systemctl start nginx
systemctl stop 服务名停止服务systemctl stop nginx
systemctl restart 服务名重启服务systemctl restart nginx
systemctl status 服务名查看状态systemctl status nginx
systemctl enable 服务名开机自启systemctl enable nginx

📁 文件操作命令

命令作用示例
cd 目录切换目录cd /usr/share/nginx/html/
ls -la列出文件ls -la
cp 源 目标复制文件cp a.txt b.txt
mv 源 目标移动/重命名mv a.txt b.txt
rm -rf 文件删除文件rm -rf upload/
cat 文件查看文件内容cat index.php
chmod 权限 文件修改权限chmod 755 index.php
chown 用户:组 文件修改所有者chown apache:apache upload/

💻 压缩解压命令

命令作用示例
zip -r 压缩包.zip 目录压缩zip -r backup.zip upload/
unzip 压缩包.zip解压unzip upload.zip
tar -cvf 包.tar 目录打包tar -cvf backup.tar upload/
tar -xvf 包.tar解包tar -xvf backup.tar

🔍 搜索查看命令

命令作用示例
grep 关键词 文件搜索内容grep redis config.php
find 目录 -name 文件搜索文件find / -name "*.php"
head -n 数字 文件查看前几行head -10 index.php
tail -n 数字 文件查看后几行tail -20 error.log

附录 B:关键文件路径

📂 网站相关

用途路径
网站根目录/usr/share/nginx/html/
Discuz 程序目录/usr/share/nginx/html/upload/
Discuz 配置目录/usr/share/nginx/html/upload/config/
Discuz 全局配置/usr/share/nginx/html/upload/config/config_global.php
Discuz 数据库配置/usr/share/nginx/html/upload/config/config_ucenter.php

⚙️ 软件配置

软件配置文件路径
Nginx/etc/nginx/nginx.conf
PHP/etc/php.ini
PHP-FPM/etc/php-fpm.d/www.conf
MySQL/etc/my.cnf
Redis/etc/redis.conf

📋 日志文件

软件日志路径
Nginx 错误日志/var/log/nginx/error.log
Nginx 访问日志/var/log/nginx/access.log
MySQL 日志/var/log/mysqld.log
PHP-FPM 日志/var/log/php-fpm/
Redis 日志/var/log/redis/redis.log

附录 C:服务端口速查

服务默认端口说明
HTTP80网页访问端口
HTTPS443加密网页端口
MySQL3306数据库端口
Redis6379缓存端口
SSH22远程连接端口

附录 D:技术名词解释

💻 系统相关

名词解释
Linux一种开源操作系统,稳定安全,常用于服务器
Shell命令行解释器,让用户与系统交互
SSH加密的远程连接协议,安全远程控制电脑
rootLinux系统的超级管理员,拥有最高权限

🌐 网站相关

名词解释
Web服务器响应网页请求的程序,Nginx/Apache
数据库存储和管理数据的软件,类似Excel但更强大
缓存临时存储常用数据,加速访问
IP网络地址,每台电脑的唯一标识
端口电脑上的"门牌号",不同服务开不同的门
域名网站的"名字",如 example.com

🐘 PHP相关

名词解释
PHP一种网页编程语言
PHP-FPMPHP的进程管理器,提高处理效率
扩展给PHP添加额外功能的插件
phpinfo()显示PHP所有配置的函数

📦 软件相关

名词解释
Nginx高性能Web服务器,特点是高并发低内存
MySQL流行的开源关系型数据库
Redis内存数据库,常用于缓存
Discuz著名的开源论坛系统

附录 E:Discuz 目录结构说明

upload/                          # Discuz程序根目录
├── admin.php                   # 后台管理入口
├── api.php                     # API接口文件
├── api/                        # API扩展目录
├── archiver/                   # 论坛Archiver(纯文本版)
├── connect.php                 # QQ互联入口
├── crossdomain.xml             # Flash跨域配置文件
├── favicon.ico                 # 网站图标
├── forum.php                   # 论坛首页入口
├── group.php                   # 群组入口
├── home.php                    # 空间/个人主页入口
├── index.php                   # 网站首页
├── member.php                  # 会员入口
├── portal.php                  # 门户入口
├── search.php                  # 搜索入口
├── static/                     # 静态资源目录(CSS/JS/图片)
├── template/                   # 模板目录
├── uc_server/                  # UCenter用户中心
├── config/                     # 配置文件目录
│   ├── config_global.php       # 全局配置文件
│   └── config_ucenter.php      # UCenter配置文件
├── data/                       # 数据目录(缓存、上传文件等)
│   ├── avatar/                # 用户头像
│   ├── cache/                 # 系统缓存
│   └── plugindata/            # 插件数据
└── install/                   # 安装目录(安装后建议删除)

附录 F:Discuz 常用链接

页面地址说明
论坛首页/upload/论坛主页
论坛后台/upload/admin.php管理员控制台
用户注册/upload/member.php?mod=register新用户注册
用户登录/upload/member.php?mod=logging&action=login用户登录

附录 G:一键部署脚本

🎯 目标:用脚本自动完成 LNMP 环境的安装和 Discuz 论坛的部署。

💡 适合场景:新服务器快速部署,无需手动一步步执行命令。


脚本一:LNMP 环境一键部署脚本

📝 脚本内容

#!/bin/bash
#===============================================================================
# 脚本名称:deploy_lnmp.sh
# 脚本功能:一键部署 LNMP + Redis 环境(测试环境)
# 适用系统:openEuler 24.03
# 使用方法:
#   chmod +x deploy_lnmp.sh && ./deploy_lnmp.sh
#===============================================================================

set -e  # 遇到错误立即停止

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 打印函数
print_step() {
    echo ""
    echo -e "${GREEN}========================================${NC}"
    echo -e "${GREEN}  $1${NC}"
    echo -e "${GREEN}========================================${NC}"
}

print_info() {
    echo -e "${YELLOW}[INFO]${NC} $1"
}

print_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 开始
clear
echo ""
echo "╔══════════════════════════════════════════════════════════╗"
echo "║                                                          ║"
echo "║        LNMP + Redis 一键部署脚本(测试环境)             ║"
echo "║                                                          ║"
echo "║        适用于 openEuler 24.03                            ║"
echo "║                                                          ║"
echo "╚══════════════════════════════════════════════════════════╝"
echo ""

# 检查 root 权限
if [ "$EUID" -ne 0 ]; then
    print_error "请使用 root 用户运行此脚本!"
    exit 1
fi

# 获取服务器 IP
SERVER_IP=$(hostname -I | awk '{print $1}')
print_info "检测到服务器 IP: $SERVER_IP"

#===============================================================================
# 第一步:设置主机名
#===============================================================================
print_step "第一步:设置主机名"

hostnamectl set-hostname lnmp
print_success "主机名已设置为: lnmp"

#===============================================================================
# 第二步:安装软件包
#===============================================================================
print_step "第二步:安装 LNMP 软件包"

print_info "正在安装软件包,请耐心等待..."

yum install -y \
    lrzsz \
    mysql-server \
    nginx \
    redis \
    php \
    php-fpm \
    php-mysqlnd \
    php-xml \
    php-gd \
    php-mbstring \
    php-json \
    wget \
    unzip

print_success "软件包安装完成!"

# 显示版本信息
echo ""
print_info "已安装软件版本:"
echo "  - Nginx:  $(nginx -v 2>&1 | cut -d'/' -f2)"
echo "  - PHP:    $(php -v | head -1 | cut -d' ' -f2)"
echo "  - MySQL:  $(mysql --version | awk '{print $5}' | tr -d ',')"
echo "  - Redis:  $(redis-server --version | awk '{print $3}' | cut -d'=' -f2)"

#===============================================================================
# 第三步:启动所有服务
#===============================================================================
print_step "第三步:启动所有服务"

systemctl start nginx
print_success "Nginx 已启动"

systemctl start php-fpm
print_success "PHP-FPM 已启动"

systemctl start mysqld
print_success "MySQL 已启动"

systemctl start redis
print_success "Redis 已启动"

# 设置开机自启
systemctl enable nginx php-fpm mysqld redis 2>/dev/null
print_info "已设置服务开机自启"

#===============================================================================
# 第四步:创建测试页面
#===============================================================================
print_step "第四步:创建 PHP 测试页面"

# 清空网站目录
rm -rf /usr/share/nginx/html/*

# 创建 PHP 信息页
cat > /usr/share/nginx/html/index.php << 'EOF'
<?php
phpinfo();
?>
EOF

# 创建 MySQL 连接测试页
cat > /usr/share/nginx/html/mysql_con.php << 'EOF'
<?php
$conn = new mysqli("localhost", "root", "");
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}
echo "MySQL 连接成功!<br>版本: " . mysqli_get_server_info($conn);
?>
EOF

print_success "测试页面创建完成!"
print_info "  - PHP 信息页: /usr/share/nginx/html/index.php"
print_info "  - MySQL 测试页: /usr/share/nginx/html/mysql_con.php"

#===============================================================================
# 第五步:配置 Redis
#===============================================================================
print_step "第五步:配置 Redis"

# 备份原配置
cp /etc/redis.conf /etc/redis.conf.bak

# 修改配置
sed -i 's/^protected-mode yes/protected-mode no/' /etc/redis.conf

# 重启 Redis
systemctl restart redis

print_success "Redis 配置完成!"
print_info "  - protected-mode: no"
print_info "  - 配置已备份到: /etc/redis.conf.bak"

#===============================================================================
# 第六步:安装 PHP Redis 扩展
#===============================================================================
print_step "第六步:安装 PHP Redis 扩展"

print_info "正在安装编译工具..."
yum install -y php-devel php-pear gcc make > /dev/null 2>&1

print_info "正在编译安装 Redis 扩展(需要 1-3 分钟)..."
yes "" | pecl install redis > /dev/null 2>&1

# 启用扩展
echo "extension=redis.so" >> /etc/php.ini

# 重启 PHP-FPM
systemctl restart php-fpm

print_success "PHP Redis 扩展安装完成!"

#===============================================================================
# 验证部署结果
#===============================================================================
print_step "验证部署结果"

# 检查服务状态
echo ""
print_info "服务状态检查:"

services=("nginx" "php-fpm" "mysqld" "redis")
all_ok=true

for svc in "${services[@]}"; do
    if systemctl is-active --quiet $svc; then
        echo "  ✅ $svc: 运行中"
    else
        echo "  ❌ $svc: 未运行"
        all_ok=false
    fi
done

# 检查 Redis 连接
echo ""
print_info "Redis 连接测试:"
if redis-cli ping | grep -q "PONG"; then
    echo "  ✅ Redis 连接正常 (PONG)"
else
    echo "  ❌ Redis 连接失败"
    all_ok=false
fi

# 检查 PHP Redis 扩展
echo ""
print_info "PHP Redis 扩展检查:"
if php -m | grep -q "redis"; then
    echo "  ✅ PHP Redis 扩展已加载"
else
    echo "  ❌ PHP Redis 扩展未加载"
    all_ok=false
fi

#===============================================================================
# 完成
#===============================================================================
echo ""
echo "╔══════════════════════════════════════════════════════════╗"
echo "║                                                          ║"
if [ "$all_ok" = true ]; then
    echo "║            ✅ LNMP 环境部署成功!                        ║"
else
    echo "║            ⚠️  部署完成,部分检查未通过                  ║"
fi
echo "║                                                          ║"
echo "╚══════════════════════════════════════════════════════════╝"
echo ""
echo "📋 验证命令:"
echo "   systemctl status nginx php-fpm mysqld redis"
echo "   redis-cli ping"
echo "   php -m | grep redis"
echo ""
echo "🌐 访问地址:"
echo "   http://${SERVER_IP}/index.php"
echo "   http://${SERVER_IP}/mysql_con.php"
echo ""
echo "📁 网站目录:"
echo "   /usr/share/nginx/html/"
echo ""
echo "⚠️  下一步 - 部署 Discuz:"
echo "   方法一:手动上传"
echo "     1. 上传 upload.zip 到 /usr/share/nginx/html/"
echo "     2. 执行: unzip upload.zip"
echo "     3. 执行: chown apache:apache upload/ -R"
echo "     4. 访问: http://${SERVER_IP}/upload/install/"
echo ""
echo "   方法二:使用完整部署脚本"
echo "     运行: ./deploy_discuz_full.sh"
echo ""

脚本二:Discuz 完整一键部署脚本(包含 Discuz 安装)

📝 脚本内容

#!/bin/bash
#===============================================================================
# 脚本名称:deploy_discuz_full.sh
# 脚本功能:一键部署 LNMP + Redis + Discuz 论坛(完整版)
# 适用系统:openEuler 24.03
# 使用方法:
#   chmod +x deploy_discuz_full.sh && ./deploy_discuz_full.sh
#
# 注意事项:
#   - 此脚本会自动下载 Discuz X3.5 安装包
#   - 如需安装 Discuz 5.0,请修改 DOWNLOAD_URL 变量
#===============================================================================

set -e  # 遇到错误立即停止

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# 打印函数
print_step() {
    echo ""
    echo -e "${GREEN}========================================${NC}"
    echo -e "${GREEN}  $1${NC}"
    echo -e "${GREEN}========================================${NC}"
}

print_info() {
    echo -e "${YELLOW}[INFO]${NC} $1"
}

print_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 配置变量(可自定义)
DISCUZ_VERSION="X3.5"
DOWNLOAD_URL="https://download.comsenz.com/DiscuzX/Discuz_X3.5_SC_UTF8.zip"
WEB_ROOT="/usr/share/nginx/html"
DISCUZ_DIR="$WEB_ROOT/upload"
DB_NAME="cz"
DB_USER="root"
DB_PASS=""

#===============================================================================
# 开始
#===============================================================================
clear
echo ""
echo "╔══════════════════════════════════════════════════════════╗"
echo "║                                                          ║"
echo "║     LNMP + Redis + Discuz 一键部署脚本(完整版)         ║"
echo "║                                                          ║"
echo "║     适用于 openEuler 24.03 测试环境                      ║"
echo "║                                                          ║"
echo "╚══════════════════════════════════════════════════════════╝"
echo ""

# 检查 root 权限
if [ "$EUID" -ne 0 ]; then
    print_error "请使用 root 用户运行此脚本!"
    exit 1
fi

# 获取服务器 IP
SERVER_IP=$(hostname -I | awk '{print $1}')
print_info "检测到服务器 IP: $SERVER_IP"

#===============================================================================
# 第一步:设置主机名
#===============================================================================
print_step "第一步:设置主机名"

hostnamectl set-hostname lnmp
print_success "主机名已设置为: lnmp"

#===============================================================================
# 第二步:安装软件包
#===============================================================================
print_step "第二步:安装 LNMP 软件包"

print_info "正在安装软件包..."

yum install -y \
    lrzsz \
    mysql-server \
    nginx \
    redis \
    php \
    php-fpm \
    php-mysqlnd \
    php-xml \
    php-gd \
    php-mbstring \
    php-json \
    wget \
    unzip \
    php-devel \
    php-pear \
    gcc \
    make

print_success "软件包安装完成!"

#===============================================================================
# 第三步:启动所有服务
#===============================================================================
print_step "第三步:启动所有服务"

systemctl start nginx php-fpm mysqld redis
systemctl enable nginx php-fpm mysqld redis 2>/dev/null

print_success "所有服务已启动并设置开机自启"

#===============================================================================
# 第四步:配置 Redis
#===============================================================================
print_step "第四步:配置 Redis"

cp /etc/redis.conf /etc/redis.conf.bak
sed -i 's/^protected-mode yes/protected-mode no/' /etc/redis.conf
systemctl restart redis

print_success "Redis 配置完成"

#===============================================================================
# 第五步:安装 PHP Redis 扩展
#===============================================================================
print_step "第五步:安装 PHP Redis 扩展"

print_info "正在编译安装 Redis 扩展(需要 1-3 分钟)..."
yes "" | pecl install redis > /dev/null 2>&1
echo "extension=redis.so" >> /etc/php.ini
systemctl restart php-fpm

print_success "PHP Redis 扩展安装完成"

#===============================================================================
# 第六步:下载并部署 Discuz
#===============================================================================
print_step "第六步:下载 Discuz $DISCUZ_VERSION"

cd $WEB_ROOT

# 清空网站目录
print_info "清空网站目录..."
rm -rf *

# 下载 Discuz
print_info "正在下载 Discuz $DISCUZ_VERSION 安装包..."
if wget -q "$DOWNLOAD_URL" -O discuz.zip; then
    print_success "Discuz 安装包下载完成"
else
    print_error "下载失败!请检查网络或手动上传安装包"
    print_info "手动上传方法:"
    print_info "  1. 下载地址: https://www.discuz.vip/download"
    print_info "  2. 上传到: $WEB_ROOT"
    print_info "  3. 解压: unzip discuz.zip"
    exit 1
fi

# 解压
print_info "正在解压安装包..."
unzip -q discuz.zip
rm -f discuz.zip

print_success "Discuz 文件解压完成"

#===============================================================================
# 第七步:设置权限
#===============================================================================
print_step "第七步:设置文件权限"

# 查找 PHP-FPM 运行用户
PHP_USER=$(ps aux | grep "php-fpm: pool" | grep -v grep | awk '{print $1}' | head -1)
if [ -z "$PHP_USER" ]; then
    PHP_USER="apache"
fi

print_info "PHP-FPM 运行用户: $PHP_USER"

# 设置权限
chown $PHP_USER:$PHP_USER $DISCUZ_DIR -R
find $DISCUZ_DIR -type d -exec chmod 755 {} \;
find $DISCUZ_DIR -type f -exec chmod 644 {} \;

print_success "文件权限设置完成"

#===============================================================================
# 第八步:创建测试页面
#===============================================================================
print_step "第八步:创建测试页面"

# 创建 PHP 信息页
cat > $WEB_ROOT/index.php << 'EOF'
<?php
phpinfo();
?>
EOF

# 创建 MySQL 测试页
cat > $WEB_ROOT/mysql_con.php << 'EOF'
<?php
$conn = new mysqli("localhost", "root", "");
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}
echo "MySQL 连接成功!<br>版本: " . mysqli_get_server_info($conn);
?>
EOF

print_success "测试页面创建完成"

#===============================================================================
# 第九步:配置 Discuz Redis
#===============================================================================
print_step "第九步:配置 Discuz Redis 连接"

# 创建配置文件(如果不存在)
if [ ! -f "$DISCUZ_DIR/config/config_global.php" ]; then
    # 复制默认配置
    if [ -f "$DISCUZ_DIR/config/config_global_default.php" ]; then
        cp $DISCUZ_DIR/config/config_global_default.php $DISCUZ_DIR/config/config_global.php
    fi
fi

# 如果配置文件存在,添加 Redis 配置
if [ -f "$DISCUZ_DIR/config/config_global.php" ]; then
    # 备份原配置
    cp $DISCUZ_DIR/config/config_global.php $DISCUZ_DIR/config/config_global.php.bak
    
    # 添加 Redis 配置(在文件末尾添加)
    cat >> $DISCUZ_DIR/config/config_global.php << 'REDIS_CONFIG'

// Redis 缓存配置
$_config['memory']['redis']['server'] = '127.0.0.1';
$_config['memory']['redis']['port'] = 6379;
$_config['memory']['redis']['pconnect'] = 0;
$_config['memory']['redis']['timeout'] = 1;
$_config['memory']['redis']['password'] = '';
$_config['memory']['redis']['serializer'] = 1;
$_config['memory']['driver'] = 'redis';
REDIS_CONFIG

    chown $PHP_USER:$PHP_USER $DISCUZ_DIR/config/config_global.php
    print_success "Discuz Redis 配置完成"
fi

#===============================================================================
# 验证
#===============================================================================
print_step "验证部署结果"

all_ok=true

# 检查服务
echo ""
print_info "服务状态:"
for svc in nginx php-fpm mysqld redis; do
    if systemctl is-active --quiet $svc; then
        echo "  ✅ $svc: 运行中"
    else
        echo "  ❌ $svc: 未运行"
        all_ok=false
    fi
done

# 检查 Redis
echo ""
print_info "Redis 测试:"
if redis-cli ping | grep -q "PONG"; then
    echo "  ✅ Redis 连接正常"
else
    echo "  ❌ Redis 连接失败"
    all_ok=false
fi

# 检查 PHP 扩展
echo ""
print_info "PHP 扩展:"
if php -m | grep -q "redis"; then
    echo "  ✅ PHP Redis 扩展已加载"
else
    echo "  ❌ PHP Redis 扩展未加载"
    all_ok=false
fi

# 检查 Discuz 文件
echo ""
print_info "Discuz 文件:"
if [ -f "$DISCUZ_DIR/index.php" ]; then
    echo "  ✅ Discuz 文件已部署"
else
    echo "  ❌ Discuz 文件未找到"
    all_ok=false
fi

#===============================================================================
# 完成
#===============================================================================
echo ""
echo "╔══════════════════════════════════════════════════════════╗"
echo "║                                                          ║"
if [ "$all_ok" = true ]; then
    echo "║          ✅ Discuz 论坛部署成功!                        ║"
else
    echo "║          ⚠️  部署完成,部分检查未通过                    ║"
fi
echo "║                                                          ║"
echo "╚══════════════════════════════════════════════════════════╝"
echo ""
echo "🌐 访问地址:"
echo ""
echo "   测试页面:"
echo "   - PHP 信息:    http://${SERVER_IP}/index.php"
echo "   - MySQL 测试:  http://${SERVER_IP}/mysql_con.php"
echo ""
echo "   Discuz 论坛:"
echo "   - 安装向导:    http://${SERVER_IP}/upload/install/"
echo "   - 论坛首页:    http://${SERVER_IP}/upload/"
echo "   - 管理后台:    http://${SERVER_IP}/upload/admin.php"
echo ""
echo "📋 安装向导填写参考:"
echo ""
echo "   数据库配置:"
echo "   - 数据库服务器:localhost"
echo "   - 数据库端口:  3306"
echo "   - 数据库名:    $DB_NAME(建议填写)"
echo "   - 数据库用户:  root"
echo "   - 数据库密码:  (留空)"
echo "   - 表前缀:      pre_"
echo ""
echo "📁 重要文件路径:"
echo "   - 网站目录:    $WEB_ROOT"
echo "   - Discuz 目录: $DISCUZ_DIR"
echo "   - 配置文件:    $DISCUZ_DIR/config/config_global.php"
echo ""
echo "🔧 常用命令:"
echo "   - 启动服务:    systemctl start nginx php-fpm mysqld redis"
echo "   - 重启服务:    systemctl restart nginx php-fpm mysqld redis"
echo "   - 查看状态:    systemctl status nginx php-fpm mysqld redis"
echo "   - 测试 Redis:  redis-cli ping"
echo "   - 查看 Redis:  redis-cli keys '*'"
echo ""
echo "⚠️  安装完成后,建议删除 install 目录:"
echo "   rm -rf $DISCUZ_DIR/install/"
echo ""

使用方法

方法一:在线下载脚本

# 下载 LNMP 环境部署脚本
wget https://your-server/deploy_lnmp.sh
chmod +x deploy_lnmp.sh
./deploy_lnmp.sh

# 或下载完整部署脚本
wget https://your-server/deploy_discuz_full.sh
chmod +x deploy_discuz_full.sh
./deploy_discuz_full.sh

方法二:手动创建脚本

# 创建脚本文件
vim deploy_discuz_full.sh

# 粘贴上面的脚本内容,保存退出

# 添加执行权限
chmod +x deploy_discuz_full.sh

# 执行脚本
./deploy_discuz_full.sh

# 执行完成后刷新 shell
bash

方法三:一行命令执行

# 直接复制粘贴执行(完整部署)
bash -c "$(curl -fsSL https://your-server/deploy_discuz_full.sh)"

📋 脚本执行流程对比

步骤deploy_lnmp.shdeploy_discuz_full.sh
设置主机名
安装 LNMP
启动服务
配置 Redis
安装 Redis 扩展
创建测试页
下载 Discuz
解压部署
设置权限
配置 Discuz Redis
执行时间约 5-8 分钟约 8-15 分钟

📝 文档信息

项目内容
文档类型小白详细版部署指南
操作系统openEuler 24.03
论坛系统Discuz! X 5.0
核心技术LNMP + Redis
目标读者零基础用户
最后更新2026年4月

🎉 恭喜你完成了 Discuz 论坛的部署!

如果遇到问题,请参考"第八章:最终验证"中的排查指南。

祝你玩得开心!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值