☰
RHCSA实战:基于LAMP搭建Discuz!论坛,解析SELinux与LVM关键配置
2026/10/22 14:36:21 网站建设 项目流程

做项目最怕的就是考完证就忘,RHCSA 的考点本来就杂,今天 bash 明天 SELinux 后天网络配置,东西学了一堆,但出了考场很少有机会把它们串起来用。所以结课时的综合项目我选了 Discuz! 论坛搭建——不为别的,就因为它最能“逼”你把这些零散知识点串成一条线。

先说这个项目到底考你什么:你得管理磁盘分区和逻辑卷,得配静态 IP 和主机名,得会配 YUM 仓库、用 systemctl 管理服务,得装 Apache、MariaDB、PHP 这组 LAMP 黄金搭档,还得处理 MariaDB 的初始化、建库授权、Discuz 的安装向导、文件权限、SELinux 上下文这些细枝末节。一步错,页面就给你颜色看。整个过程做完,等于把 RHCSA 的核心考点活生生过了一遍。

这篇文章我就按我当时一步步操作的顺序来写,环境用的是虚拟机装 CentOS Stream 9,IP 规划、分区方案、配置代码、踩过的坑都会展开说清楚,想复现的同学可以直接照抄。

1. 项目解剖:为什么 Discuz! 是 RHCSA 结课项目的绝佳试炼场

选 Discuz! 做结课项目不是拍脑袋,市面上能选的论坛 / CMS 程序其实不少,像 WordPress、织梦、phpBB 都有,但综合 RHCSA 的考点覆盖面来看,Discuz! 是最合适的一个。原因有三:

第一,Discuz! 对运行环境的要求完美契合考纲。它需要 PHP 5.3 以上(实际上当今版本要求更高)、MySQL / MariaDB、Apache 或 Nginx,这直接覆盖了“安装并管理 Web 服务”“配置数据库服务器”“处理 PHP 应用”三大类考点。而 WordPress 虽然也走 LAMP 路线,但安装向导太傻瓜化,很多环节系统自动完成,根本显不出水平。

第二,Discuz! 的安装过程含金量高。它不会像某些程序一样一键完成,从解压源码、设置目录权限、修改配置文件、导入 SQL 到浏览器端完成安装向导,每一环都暴露在明面上,任何一个环节出错都能成为排查问题练手的好素材。

第三,Discuz! 在中国互联网技术圈有历史沉淀,论坛模板和插件生态成熟,后期扩展空间大,做完基础搭建还能往 OSS 直传、Redis 缓存、负载均衡方向延伸做加分项。

再说这个项目的技术覆盖面。我把它拆成了六个知识模块:

  • 系统基础:静态 IP、主机名解析、时区设置、字符集
  • 存储与软件管理:LVM 分区、YUM 仓库配置、软件包安装
  • 服务管理:Apache、MariaDB、PHP-FPM 的安装、启停、开机自启
  • 数据库操作:初始化、建库建用户、授权、导入导出
  • 文件系统与权限:属主属组、目录可写、SELinux 上下文
  • 故障排查:看日志、查端口、理清 PHP 模块加载关系

这六块全是 RHCSA 考试高频考点,项目做完后我自己的感受是——当年背得迷迷糊糊的知识点,全都有了“用武之地”,记牢靠了。

2. 环境规划:虚拟机配置、网络规划与主机名解析

动手之前先把环境规划好,这一步千万别省。我见过不止一个同学做到一半 IP 冲突或主机名没配,导致浏览器访问不到页面,一查就是半天,纯属人为事故。

2.1 虚拟机与系统安装时的硬件分配

因为 Discuz! 本身性能要求不高,我用的虚拟机配置是 2 核 CPU、4GB 内存、40GB 虚拟磁盘。如果你宿主机性能紧张,2GB 内存也够用,但建议不要低于 1.5GB,否则编译 PHP 或跑数据库时可能卡。

磁盘分区方面,我特意用了 LVM 而不是默认自动分区,这是一个很刻意的选择——RHCSA 考纲里有 LVM 相关考点,项目里不用一下等于白学。分区方案如下:

  • /boot:1GB,ext4
  • /:10GB,xfs
  • /data:剩余空间全部给 /dev/vg_data/lv_data,挂载点为 /data,ext4
  • swap:2GB

这个方案的核心思路是把论坛的站点文件放在独立逻辑卷上,后期如果数据膨胀或者要迁移,用 pvresize、lvextend 就能在线扩容,也可以直接做快照备份,非常方便。

系统装的是 CentOS Stream 9,最小化安装。注意最小化安装默认没有图形界面也没有文本浏览器,后续操作全靠 SSH,这样也顺便练习了远程管理和 sshd 配置。

2.2 静态 IP、主机名与 hosts 映射

装完系统第一件事配置固定 IP。默认 DHCP 会导致重启后 IP 漂移,项目没法稳定复现。我用的网卡名称是 ens160,用 nmcli 命令配置如下:

nmcli con mod ens160 ipv4.addresses 192.168.10.10/24 nmcli con mod ens160 ipv4.gateway 192.168.10.1 nmcli con mod ens160 ipv4.dns 192.168.10.1 nmcli con mod ens160 ipv4.method manual nmcli con up ens160

这些操作在考试时会做,但很多人从来没想过为什么生产环境不用 DHCP——因为服务器服务的别人,IP 一变化,所有用户就找不到你了。

然后设置主机名和 hosts 映射:

hostnamectl set-hostname bbs.lab.example.com echo "192.168.10.10 bbs.lab.example.com bbs" >> /etc/hosts

用域名而不是 IP 访问论坛,一方面是为了贴近真实生产环境,另一方面也给后面配置 Apache ServerName、数据库授权时的主机限定留伏笔。浏览器访问 http://bbs.lab.example.com 时能直接解析到本机,这个细节很有用。

2.3 时间、字符集与基线软件安装

时区统一改成上海:

timedatectl set-timezone Asia/Shanghai timedatectl set-local-rtc 0

RHCSA 考纲里不直接考时区,但论坛的发帖时间如果显示 UTC,跟本地差 8 小时,排查起来非常困惑。项目环境下能提前规避就提前规避。

随后升级系统并安装常用工具:

dnf update -y dnf install -y vim wget tar bash-completion net-tools lsof unzip

bash-completion 强烈推荐装上,敲命令按 Tab 补全不香吗?这个经验是我踩坑换来的——在没装 bash-completion 的系统上敲 systemctl 的子命令,简直折磨。

3. 基础环境配置:关闭防火墙生成规则还是配例外?

这是个老生常谈但必须说清楚的问题。网上很多教程直接教你 systemctl stop firewalld,考试也确实允许这么干,但真实场景下这样干会被骂。作为一个结课项目,正确姿势是学会配置例外规则,这也是 RHCSA 里 FirewallD 考点的意义。

我只放行了 SSH 和 HTTP/HTTPS:

systemctl start firewalld firewall-cmd --permanent --add-service=ssh firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https firewall-cmd --reload firewall-cmd --list-all

这样即使是全新环境,别人通过浏览器访问论坛没问题,但想偷偷扫你的端口基本没戏。这一步能让你在写结课文档时多说一句:生产环境永远遵循最小开放原则。这是加分项,真的。

SELinux 同理,不建议直接 setenforce 0 然后一关了之。我的做法是保持 enforcing,等到具体部署时遇到问题再针对性调整布尔值或上下文,这部分放在后面专门讲。考试是考试,真实服务器上关 SELinux 在多数安全基线里都是不允许的。

4. 搭建 LAMP 环境:Apache、MariaDB、PHP 的安装与联动

LAMP 的搭建是这个项目的核心骨架。需要说明的是,CentOS Stream 9 的默认 Apache 版本是 2.4,PHP 版本是 8.0,MariaDB 版本是 10.5,这套组合跑 Discuz! X3.5 没问题,不用额外折腾第三方仓库。

4.1 安装软件包

dnf install -y httpd mariadb-server php php-mysqlnd php-gd php-xml php-mbstring php-json

PHP 相关扩展是我提前装好的,没有等到 Discuz 安装向导报错才补齐。按我的经验,Discuz 安装时最常检查的扩展就这几个:mysqlnd(连数据库)、gd(图片验证码)、xml(模板解析)、mbstring(中文处理)、json(接口数据)。如果漏装,安装向导会直接红字提示,然后再回头补装也行,但中间会浪费不少时间。

安装完后顺手把三个服务设为开机自启:

systemctl enable --now httpd mariadb systemctl enable php-fpm # 如果用的是 php-fpm 模式

4.2 确认 PHP 与 Apache 的协作方式

这里强调一个容易踩的坑:CentOS Stream 9 中 php 默认以 php-fpm 方式与 Apache 配合,而不是古老的 mod_php 方式。也就是说,Apache 需要通过代理把 PHP 请求转发给 php-fpm 处理。

如果安装完 httpd 和 php 后直接启动,你写一个 phpinfo 页面会发现浏览器直接下载文件而不是执行。原因就是没启动 php-fpm,或者 Apache 里没有 php-fpm 的代理配置。

用官方包安装的话,其实这些配置是自动完成的。装完后可以通过以下命令验证:

rpm -ql php-fpm | grep www.conf systemctl status php-fpm

如果 php-fpm 没启动,Discuz 首页能打开,但所有动态请求都会变成白屏或下载。这一点我记在最前面,因为你后面如果碰到“静态文件正常、动态页面打不开”,第一个就该查 php-fpm。

4.3 MariaDB 安全初始化与基础配置

MariaDB 装完直接启动是不行的,要先跑安全初始化脚本:

systemctl start mariadb mysql_secure_installation

这个脚本会问你 root 密码、是否删除匿名用户、是否禁止 root 远程登录、是否删除 test 库、是否刷新权限表。结课环境建议全部选 y,实际生产要斟酌的只是 root 远程登录那条,其他基本都该做。

初始化完成后建库建账号:

CREATE DATABASE discuz DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'discuz'@'localhost' IDENTIFIED BY 'YourStrongPass123'; GRANT ALL PRIVILEGES ON discuz.* TO 'discuz'@'localhost'; FLUSH PRIVILEGES;

有人偷懒直接用 root 当论坛数据库账号,短期没问题,但这是 RHCSA 的扣分点——最小权限原则讲过无数遍。单独建库建用户还有个好处:出问题删库重建不影响其他业务,备份恢复也简单。

字符集用 utf8mb4 而不是老的 utf8,原因很简单:Discuz 的帖子可能包含 emoji 或者生僻字,utf8(其实是 utf8mb3)存不了四个字节的字符,直接报错乱码。这个坑我当年踩得莫名其妙,后来才发现是字符集问题。

5. 部署 Discuz!:上传源码、设置目录权限与浏览器安装向导

环境就绪后进入部署阶段,这一步门道最多,也是最容易卡住新手的环节。

5.1 获取并解压源码

Discuz! X3.5 官方发布的是 zip 包,下载后把压缩包放到 /data 下的站点目录。我当时规划了独立的站点根目录 /data/wwwroot/bbs,原因前面提过,它挂在独立 LVM 逻辑卷上,方便扩容隔离。

mkdir -p /data/wwwroot cd /data/wwwroot wget 下载链接(此处以官方发布页为准) unzip Discuz_X3.5_SC_UTF8.zip

解压后你会看到 upload 目录,这个目录里才是真正的程序文件。把你的站点根目录指向 upload 目录的内容:

cp -a /data/wwwroot/upload/. /data/wwwroot/bbs/

这么做的目的是区分解压临时目录和正式运行目录,避免把官方包里的其他说明文档、升级工具暴露到 Web 根目录下,安全上也更干净。

5.2 Apache 虚拟主机配置

配置虚拟主机是 RHCSA 的必考内容,在这里自然要用上。编辑 /etc/httpd/conf.d/bbs.conf:

<VirtualHost *:80> ServerName bbs.lab.example.com DocumentRoot /data/wwwroot/bbs DirectoryIndex index.php index.html <Directory /data/wwwroot/bbs> Options FollowSymLinks AllowOverride All Require all granted </Directory> ErrorLog /var/log/httpd/bbs_error.log CustomLog /var/log/httpd/bbs_access.log common </VirtualHost>

AllowOverride All 很重要,Discuz 的伪静态规则依赖 .htaccess 文件,如果这行不设置,后台开启伪静态后会 404。

写完检查语法并重载:

httpd -t systemctl reload httpd

5.3 浏览器端安装向导

现在访问 http://bbs.lab.example.com 就能看到 Discuz 安装向导。如果之前没配静态 IP 和 hosts,这一步就可能在局域网里找不到服务器,然后就会开始怀疑人生。

安装向导分几个步骤:

  • 同意协议:点同意即可
  • 检查环境:会列出当前 PHP 版本、扩展加载情况、目录可写性。这一步如果有红色 X,上面 4.1 节装的那些扩展就是补丁
  • 选择安装方式:我选了“全新安装”
  • 填写数据库信息:数据库服务器填 localhost,数据库名、用户名、密码用前面创建好的 discuz 账号
  • 填写管理员信息:给论坛后台设置管理员账号密码,这个别设太简单,因为论坛后台权限很大
  • 确认安装:安装完成后会提示删除 install/index.php,这个提示一定要照做

管理员密码强度这个东西,在真实生产环境里会被很多人忽略,不过结课项目里还是养成好习惯,大小写字母加数字加符号的组合,别用 admin123 这种。

5.4 目录权限的细节控制

Discuz 安装完成提示删除安装脚本后,还要处理 config 和 data 目录的权限。官方建议是可写,但“可写”也分程度:

chown -R apache:apache /data/wwwroot/bbs chmod -R 755 /data/wwwroot/bbs chmod -R 777 /data/wwwroot/bbs/data chmod -R 777 /data/wwwroot/bbs/config chmod -R 777 /data/wwwroot/bbs/uc_server/data

这个方案能跑,但不够优雅——data、config 目录放开写权限后,如果 Web 服务被入侵,攻击者可以在这些目录里写任意文件。更稳妥的做法是:

chown -R apache:apache /data/wwwroot/bbs find /data/wwwroot/bbs -type d -exec chmod 755 {} \; find /data/wwwroot/bbs -type f -exec chmod 644 {} \; chmod -R 777 /data/wwwroot/bbs/data

仍然需要部分目录 777,Discuz 的缓存机制就是这么设计的,不需要 777 的目录不要给。如果你有洁癖想做得更细,可以研究一下把 config 里的数据库密码单独拆出去,但这就超出 RHCSA 范围了。

6. SELinux 上下文:论坛能跑但你动过目录位置时就会出幺蛾子

如果你一切照上面的做,SELinux 开启的状态下大概率会遇到一个问题——浏览器打不开(403)或页面能开但头像上传失败。原因很简单:你把 Discuz 放在 /data/wwwroot 下,而这个目录没有 httpd_sys_content_t 上下文,Apache 默认不允许访问非标准目录下标记错误的文件。

学会诊断先于修复:检查 SELinux 布尔值,查看 AVL 日志。CentOS Stream 9 的日志在 /var/log/audit/audit.log,你可以用 grep 过滤 httpd 和 denied:

grep "denied" /var/log/audit/audit.log | grep httpd | tail -20

如果没有安装 audit 工具,先补上:

dnf install -y setroubleshoot-server

看到明确报错后,正确解法是给目录打上正确的上下文标签:

semanage fcontext -a -t httpd_sys_content_t "/data/wwwroot/bbs(/.*)?" restorecon -Rv /data/wwwroot/bbs

打完后可以用 ls -Z 验证:

ls -Zd /data/wwwroot/bbs

输出能看到 httpd_sys_content_t 就对了。

为什么不能用 chcon 一锤子定音?因为 chcon 只改当前这层文件,后期再往目录里传文件或安装插件,新文件可能又变成 default_t,又要手动改。semanage fcontext 是持久化的规则,restorecon 则是按规则重打标签,两者配合才是正确姿势。

如果遇到回写类问题(比如 Discuz 上传附件失败但页面能打开),还可能涉及 httpd_sys_rw_content_t 或 allow_httpd_anon_write,以及 httpd_can_network_connect 布尔值(如果数据库在远程主机时)。这些属于进阶排查,结课项目里可以先记着,备不住答辩老师就喜欢问这个。

7. 最终验证:从浏览器到数据落库的全链路检查

部署完成后要验证,而且不能只验证“首页能打开”这一步。

7.1 功能抽检清单

我当时的验证顺序:

  • 打开首页,确认版块列表正常加载
  • 注册一个测试账号,走一遍注册流程
  • 发一个测试帖,能带图片附件最好
  • 后台更新缓存,刷新前台确认生效
  • 重启服务器,等 3 分钟再访问,确认服务开机自启正常

这五步走完,基本说明系统是稳的。

7.2 命令层验证

更底层的验证方式:

systemctl status httpd mariadb php-fpm ss -tlnp | grep -E ':80|:3306' mysql -udiscuz -p -e "SHOW DATABASES;" curl -I http://bbs.lab.example.com tail -f /var/log/httpd/bbs_access.log

一个细节:用 ss 看到 3306 监听在 127.0.0.1 上才算正常,如果你是 :3306 或者 0.0.0.0:3306,说明 MariaDB 允许外部连接,需要检查确认是否被防火墙挡住了。虽然 Discuz 和数据库在同一台机器上,数据库端口不对外暴露才是好习惯。

7.3 数据落库验证

有人说“论坛能发帖就行”,但严谨一点还应该去数据库里看一眼数据长什么样:

USE discuz; SHOW TABLES; SELECT COUNT(*) FROM pre_common_member;

能看到 pre_ 开头的表,并且 member 表有记录,说明应用层的数据确实写入到了 MySQL,而不是 PHP 进程里跑了个假内存版。有些项目做完发现重启后帖子没了,十有八九是数据没落盘或数据库没连对。

8. 故障排查手册:这些坑,基本上绕不过去

下面是我做这个项目时排过的几个典型故障,每一个都能单独写几百字。做成速查表供你参考:

现象排查方向解决办法
浏览器打不开页面,连接被拒绝服务是否启动、防火墙拦截systemctl status httpd;firewall-cmd --list-all
能打开 Apache 默认页,但访问 Discuz 目录 403SELinux 上下文semanage fcontext + restorecon,见第 6 节
首页能开但所有动态请求白屏php-fpm 未启动systemctl start php-fpm,确认代理配置
安装向导环境检查 GD 扩展红色 XPHP 扩展缺失dnf install php-gd,重启 php-fpm
数据库连接失败 Access denied授权用户、密码、主机限定检查 MySQL 用户 host 是否为 localhost
发帖时间差 8 小时时区未设置timedatectl set-timezone Asia/Shanghai
后台伪静态开启后帖子 404.htaccess 未生效检查 AllowOverride All
无法上传头像/附件data 目录可写权限 + SELinux检查目录属主属组,chmod 777 data;SELinux 用 httpd_sys_rw_content_t

有几个排查思路值得展开说:

先说 PHP-FPM 那个坑。那时候我用 curl http://127.0.0.1/index.php 测试,发现返回的是一大串 PHP 源代码。当时还以为是文件没配好,后来想到 Apache 和 PHP 之间是通过 FastCGI 协议通信的,php-fpm 没启动,等于叫了个空号,代码就原样吐出来了。启动 php-fpm 后一切恢复正常。这个经验让我记住了:排查问题时首先确认服务状态,再去看配置和日志,顺序不能乱。

再看数据库授权用户 host 那个坑。如果 MySQL 用户用的是 'discuz'@'localhost',但安装向导里数据库服务器填的是 127.0.0.1,有时候会因为连接方式走 TCP 而不是 socket,导致授权不匹配。稳妥做法是建两个用户:

CREATE USER 'discuz'@'localhost' IDENTIFIED BY 'YourStrongPass123'; CREATE USER 'discuz'@'127.0.0.1' IDENTIFIED BY 'YourStrongPass123'; GRANT ALL PRIVILEGES ON discuz.* TO 'discuz'@'localhost'; GRANT ALL PRIVILEGES ON discuz.* TO 'discuz'@'127.0.0.1'; FLUSH PRIVILEGES;

这个坑很经典,建议直接收藏。

还有乱码问题。如果你建库时用了 utf8,之后导入 Discuz 完整包里的 SQL 文件时非常容易出问题——Discuz X3.5 的表默认是 utf8mb4,而库是 utf8,这种情况下某些字符就直接变问号。所以建库语句务必用 utf8mb4,上面第 4.3 节里我已经写了,这里再强调一遍。

9. 再往前一步:结课项目还能怎么加分

如果你做完基础搭建后想让项目更有含金量,有几个方向可以选,每个方向都不难但呈现效果好。

  • 加分方向一:给 Apache 配一个自签名证书,把论坛改成 https 访问。涉及 mod_ssl、openssl、httpd 配置和防火墙放行 443,刚好把 RHCSA 里的加密和 Web 服务考点一并覆盖
  • 加分方向二:把数据库单独搬到一台服务器或者一个独立的 LXC 容器/虚拟机里,让 Discuz 通过网络访问远程 MariaDB。这就涉及数据库远程授权、SELinux 布尔值 httpd_can_network_connect 等考点,比单机部署高一个层级
  • 加分方向三:给 /data 逻辑卷做在线扩容演示,比如初始给 10GB,数据文件太多后在不停机情况下 lvextend 扩到 20GB,然后用 xfs_growfs 扩展文件系统。这个操作在结课答辩时演示非常出彩
  • 加分方向四:写一份一键部署脚本,把 LAMP 安装、源码解压、目录权限设置全部用 bash 脚本自动化。既锻炼脚本能力,也让你的项目能在新环境快速复现

我选了前两个都做了,用在结课报告里“生产环境高可用雏形”那一节。效果确实比单纯搭个论坛丰富很多。

10. 写在最后的实战体会

这个项目做完,我最直观的变化就是对系统管理有了整体性认识。以前看 SELinux 觉得是个没存在感的模块,考完就忘,直到被 403 教育和被 restorecon 拯救之后才真正理解它存在的意义。

如果你的 RHCSA 培训班也布置了综合项目,强烈建议不要为了糊弄过去选一个一键脚本能搞定的程序,Discuz! 搭建这种需要配置 LAMP、数据库、目录权限、防火墙、SELinux 的项目才是真的学到东西。最后再分享一个做项目的好习惯:每做完一个阶段就截个图、记录一条笔记。写结课报告时你就会有大量第一手材料,而且排查问题的思路也能完整地沉淀下来。这个习惯后来我工作后一直保留,受用无穷。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询