分布式(加一键部署脚本)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 是四个软件的首字母缩写,它们组合在一起,就能让你的服务器"跑起来"一个网站。

📦 四个组件分别是什么?

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

💡 形象的比喻

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

  • 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 地址

在终端中运行:

bash 复制代码
ip addr

📖 这条命令的意思是...

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

✅ 预期结果

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

复制代码
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:

bash 复制代码
hostname -I

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

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

📝 什么是 SSH?

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

💡 推荐使用的工具

工具 优点 适用系统
MobaXterm 功能强大,免费版够用,支持拖拽上传 Windows
FinalShell 国产软件,界面友好 Windows/Mac
Xshell 经典老牌,收费但稳定 Windows
系统自带Terminal Mac/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 或类似)

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

bash 复制代码
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:设置主机名

bash 复制代码
hostnamectl set-hostname lnmp && bash

📖 这条命令的意思是...

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

✅ 预期结果

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

bash 复制代码
hostname

应该显示 lnmp

⚠️ 注意事项

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

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

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


3.2 安装软件包

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

📝 背景知识

什么是 yum?

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

📝 操作步骤

步骤 1:执行安装命令

bash 复制代码
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-server MySQL数据库服务器
nginx Web服务器(读作"引擎X")
php PHP解释器
php-fpm PHP FastCGI进程管理器(让PHP跑得更快更稳定)
php-mysqlnd PHP连接MySQL的驱动程序
php-xml PHP处理XML的扩展(Discuz需要)
redis Redis缓存服务器

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

bash 复制代码
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

bash 复制代码
systemctl start nginx

📖 这条命令的意思是...

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

✅ 预期结果

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


步骤 2:启动 PHP-FPM

bash 复制代码
systemctl start php-fpm

✅ 预期结果

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


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

bash 复制代码
systemctl start nginx php-fpm

📖 这条命令的意思是...

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

💡 小技巧

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

bash 复制代码
systemctl start nginx php-fpm mysqld redis

这样 nginx、php-fpm、mysql、redis 四个服务同时启动!
💡 设置开机自启(可选):

bash 复制代码
systemctl enable nginx php-fpm mysqld redis

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


3.4 验证服务状态

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

📝 背景知识

什么是进程?

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

📝 操作步骤

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

bash 复制代码
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

📊 结果解读

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

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


步骤 2:检查 PHP-FPM 进程

bash 复制代码
ps aux | grep php-fpm

📖 这条命令的意思是...

命令部分 含义
ps 进程查看工具(process status)
aux 显示所有进程(a=all, u=详细信息, x=包括未终端的)
` grep 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 www www连接池 处理网页请求的进程

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


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

bash 复制代码
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:进入网站目录

bash 复制代码
cd /usr/share/nginx/html/

📖 这条命令的意思是...

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

💡 什么是网站根目录?

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


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

bash 复制代码
rm -rf *

📖 这条命令的意思是...

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

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


步骤 3:创建 PHP 测试文件

bash 复制代码
vim index.php

📖 这条命令的意思是...

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

📝 Vim 编辑器使用方法

Vim 有三种模式:

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

📝 详细操作步骤

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

💡 Vim 常用快捷键

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

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

bash 复制代码
nano index.php

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


步骤 4:保存文件内容

输入以下内容:

php 复制代码
<?php
phpinfo();
?>

💡 这段代码的意思是:

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

✅ 预期结果

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

bash 复制代码
cat index.php

应该显示:

复制代码
<?php
phpinfo();
?>

4.2 测试 Nginx + PHP

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

📝 操作步骤

步骤 1:查看服务器IP

bash 复制代码
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,解决方案:

bash 复制代码
systemctl restart nginx php-fpm

❌ 如果显示 "403 Forbidden"

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

bash 复制代码
chmod 755 /usr/share/nginx/html/
ls -la /usr/share/nginx/html/index.php

4.3 创建 MySQL 测试页

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

📝 操作步骤

步骤 1:启动 MySQL 服务

bash 复制代码
systemctl start mysqld

📖 这条命令的意思是...

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

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

bash 复制代码
vim /usr/share/nginx/html/mysql_con.php

步骤 3:输入以下内容

php 复制代码
<?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是否启动:

bash 复制代码
systemctl status mysqld

如果没启动,先启动:

bash 复制代码
systemctl start mysqld

4.4 测试数据库连接

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

📝 操作步骤

步骤 1:登录 MySQL

bash 复制代码
mysql -u root -p

📖 这条命令的意思是...

命令部分 含义
mysql MySQL客户端工具
-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:查看所有数据库

sql 复制代码
SHOW DATABASES;

📖 这条命令的意思是...

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

✅ 预期结果

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

📊 结果解读

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

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


步骤 3:退出 MySQL

sql 复制代码
EXIT;

或者

sql 复制代码
QUIT;

或者直接按 Ctrl + D

✅ 预期结果

复制代码
Bye

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


🚀 第五章:部署 Discuz 论坛

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

5.1 上传安装包

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

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

步骤 1:确认 lrzsz 已安装

bash 复制代码
rpm -qa | grep lrzsz

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

bash 复制代码
yum install -y lrzsz

步骤 2:切换到网站目录

bash 复制代码
cd /usr/share/nginx/html/

步骤 3:执行上传命令

bash 复制代码
rz

📖 这条命令的意思是...

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

✅ 预期结果

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

💡 什么是 Zmodem?

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


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

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


📝 方法三:使用 scp 命令

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

Windows (PowerShell) / Mac / Linux:

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

📖 这条命令的意思是...

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

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


5.2 解压文件

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

📝 操作步骤

步骤 1:查看上传的文件

bash 复制代码
ls -la

📖 这条命令的意思是...

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

✅ 预期结果

应该看到类似:

复制代码
-rw-r--r--  1 root root  8.5M  upload.zip

步骤 2:解压安装包

bash 复制代码
unzip upload.zip

📖 这条命令的意思是...

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

✅ 预期结果

会显示解压过程:

复制代码
Archive:  upload.zip
   creating: upload/
  extracting: upload/readme.html
  extracting: upload/forum.php
  ...

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

bash 复制代码
ls -la

✅ 预期结果

应该看到:

复制代码
drwxr-xr-x 3 root root  upload/
-rw-r--r-- 1 root root  upload.zip

💡 小技巧:一步到位

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

bash 复制代码
unzip upload.zip -d /目标目录/

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

bash 复制代码
yum install -y unzip

5.3 设置权限

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

📝 背景知识

为什么需要设置权限?

Linux 是一个多用户系统,每个文件和文件夹都有"主人"和"权限"。

想象一栋公寓:

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

📝 操作步骤

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

bash 复制代码
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:设置文件所有者

bash 复制代码
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:验证权限设置

bash 复制代码
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:设置目录和文件权限(可选但推荐)

bash 复制代码
# 设置目录权限为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:确认服务全部启动

bash 复制代码
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等 ✅ 通过

✅ 预期结果

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

💡 如果有红叉怎么办?

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

bash 复制代码
chown apache:apache /usr/share/nginx/html/upload/ -R
chmod 755 /usr/share/nginx/html/upload/ -R

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

bash 复制代码
yum install -y php-gd php-json php-mbstring
systemctl restart php-fpm

✅ 操作:点击"下一步"


🎯 第三步:选择安装方式

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

💡 解释

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

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


🎯 第四步:配置数据库

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

📋 填写说明

字段 示例值 说明
数据库服务器 localhost 本机安装不用改
数据库端口 3306 MySQL默认端口,不用改
数据库名称 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 管理后台

⚠️ 安装后必做

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

bash 复制代码
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:备份原配置文件

bash 复制代码
cp /etc/redis.conf /etc/redis.conf.bak

📖 这条命令的意思是...

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

💡 为什么要备份?

就像打游戏前先存档,备份让你改错了还能还原!


步骤 2:修改配置

bash 复制代码
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:验证修改

bash 复制代码
grep "protected-mode" /etc/redis.conf

✅ 预期结果

复制代码
protected-mode no

✅ 显示 no 表示修改成功!


6.3 启动 Redis 服务

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

📝 操作步骤

步骤 1:启动 Redis

bash 复制代码
systemctl start redis

✅ 预期结果

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


步骤 2:检查 Redis 状态

bash 复制代码
systemctl status redis

✅ 预期结果

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

步骤 3:测试 Redis 连接

bash 复制代码
redis-cli ping

📖 这条命令的意思是...

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

✅ 预期结果

复制代码
PONG

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

💡 ping-pong 是什么?

💡 就像小时候玩的"ping-pong",你喊"ping",对方回"pong"。

计算机也用这种方式测试连接是否正常!


步骤 4:查看 Redis 详细信息

bash 复制代码
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 配置文件

bash 复制代码
vim /usr/share/nginx/html/upload/config/config_global.php

步骤 2:找到 memory 配置段

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

📖 vim 搜索命令

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

步骤 3:修改配置文件

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

php 复制代码
$_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']['server Redis服务器地址 127.0.0.1 = 本机
redis']['port Redis端口 6379 是默认端口
redis']['pconnect 长连接 0=关闭,1=开启
redis']['timeout 连接超时时间 1秒足够
redis']['password 连接密码 空=无密码
redis']['serializer 序列化方式 1=PHP序列化

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

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

php 复制代码
$_config['memory']['driver'] = 'redis';

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


步骤 5:保存并退出

Esc,然后输入 :wq,回车


✅ 验证配置

bash 复制代码
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 扩展需要的工具。

📝 操作步骤

bash 复制代码
yum install -y php-devel php-pear gcc make

📖 安装包说明

包名 作用
php-devel PHP开发工具(编译扩展需要)
php-pear PECL的包管理器
gcc C语言编译器(编译Redis扩展需要)
make 构建工具(组织编译过程)

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


7.3 安装 Redis 扩展

🎯 目标:安装 PHP Redis 扩展。

📝 操作步骤

步骤 1:使用 PECL 安装

bash 复制代码
pecl install redis

📖 这条命令的意思是...

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

✅ 安装过程

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

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


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

bash 复制代码
yes "" | pecl install redis

📖 这条命令的意思是...

命令部分 含义
yes "" 连续输出空行(模拟回车)
` `

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


步骤 2:启用 Redis 扩展

bash 复制代码
echo "extension=redis.so" >> /etc/php.ini

📖 这条命令的意思是...

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

步骤 3:验证扩展已添加

bash 复制代码
grep "redis.so" /etc/php.ini

✅ 预期结果

复制代码
extension=redis.so

✅ 表示扩展已启用!


7.4 重启 PHP-FPM

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

📝 操作步骤

bash 复制代码
systemctl restart php-fpm

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


7.5 验证 Redis 扩展

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

📝 操作步骤

步骤 1:命令行检查

bash 复制代码
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:扩展是否写入正确位置

bash 复制代码
grep "extension=redis.so" /etc/php.ini

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

bash 复制代码
php -m

看有没有报错


🔍 第八章:最终验证

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

8.1 完整验证清单

📋 系统服务检查

检查项 命令 预期结果
Nginx 运行 systemctl status nginx active (running) ✅
PHP-FPM 运行 systemctl status php-fpm active (running) ✅
MySQL 运行 systemctl status mysqld active (running) ✅
Redis 运行 systemctl status redis active (running) ✅

📋 服务连接检查

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

📋 浏览器访问检查

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

📋 Redis 功能检查

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

8.2 常见问题排查

❌ 问题:502 Bad Gateway

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

排查步骤

bash 复制代码
# 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 没有启动或密码错误

排查步骤

bash 复制代码
# 1. 检查 MySQL 状态
systemctl status mysqld

# 2. 启动 MySQL
systemctl start mysqld

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

💡 解决方案:启动 MySQL 服务


❌ 问题:页面显示白屏

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

排查步骤

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

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

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


❌ 问题:Redis 连接失败

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

排查步骤

bash 复制代码
# 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 快速命令参考

💡 一键启动所有服务

bash 复制代码
systemctl start nginx php-fpm mysqld redis

💡 一键重启所有服务

bash 复制代码
systemctl restart nginx php-fpm mysqld redis

💡 一键查看所有服务状态

bash 复制代码
systemctl status nginx php-fpm mysqld redis

💡 一键测试所有连接

bash 复制代码
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:服务端口速查

服务 默认端口 说明
HTTP 80 网页访问端口
HTTPS 443 加密网页端口
MySQL 3306 数据库端口
Redis 6379 缓存端口
SSH 22 远程连接端口

附录 D:技术名词解释

💻 系统相关

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

🌐 网站相关

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

🐘 PHP相关

名词 解释
PHP 一种网页编程语言
PHP-FPM PHP的进程管理器,提高处理效率
扩展 给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 环境一键部署脚本

📝 脚本内容

bash 复制代码
#!/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 安装)

📝 脚本内容

bash 复制代码
#!/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 ""

使用方法

方法一:在线下载脚本

bash 复制代码
# 下载 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

方法二:手动创建脚本

bash 复制代码
# 创建脚本文件
vim deploy_discuz_full.sh

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

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

# 执行脚本
./deploy_discuz_full.sh

# 执行完成后刷新 shell
bash

方法三:一行命令执行

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

📋 脚本执行流程对比

步骤 deploy_lnmp.sh deploy_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 论坛的部署!

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

祝你玩得开心!

相关推荐
Cx330❀2 小时前
线程进阶实战:资源划分与线程控制核心指南
java·大数据·linux·运维·服务器·开发语言·搜索引擎
脑子加油站2 小时前
Redis数据库基础
数据库·redis·缓存
知识分享小能手2 小时前
MongoDB入门学习教程,从入门到精通,MongoDB监控完全指南(22)
数据库·学习·mongodb
铅笔小新z2 小时前
【Linux】进程控制(上)
linux·运维·服务器
liliangcsdn2 小时前
LLM上下文缓存与状态复用机制的分析和探索
缓存
AI周红伟2 小时前
Hermes Agent 工具-周红伟
linux·网络·人工智能·腾讯云·openclaw
大卡片2 小时前
linux和IO常见面试题
linux·运维·服务器
zzzyyy5382 小时前
Linux程序地址空间
linux·运维·服务器
RisunJan2 小时前
Linux命令-newusers(用于批处理的方式一次创建多个命令)
linux·运维·服务器