news 2026/9/28 8:18:07

从零搭建Discuz论坛:RHCSA综合实战项目全记录

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零搭建Discuz论坛:RHCSA综合实战项目全记录

1. 为什么期末项目选了"搭个论坛":一张RHCSA考点覆盖图

前阵子准备RHCSA认证的期末实践项目,我反复纠结了很久到底做什么。身边同学有的选配NFS服务器,有的做Samba文件共享,也有人只写了个自动化部署脚本。说实话,这些题目都不难,基本上把平时练习题换个皮交上去就完事了。但我当时的目标不只是"交个能跑的作业",而是希望这个项目做完之后,能让我把整个学期学的东西串成一条线——将来面试的时候,别人问我"Linux你熟吗",我能有个真正拿得出手的完整案例。最终我选定了:在一台裸机RHEL 9/CentOS Stream系统上,从零搭建一个可访问的Discuz!论坛。

选"搭建论坛"当RHCSA期末项目,大多数人第一反应是"这不就是个LAMP环境吗,装完就能跑,有什么含金量?"。但真正动手之后你会发现,它几乎是把RHCSA考试的核心模块全部踩了一遍。你在整个部署链条里遇到的每一个坑,其实都对应着考纲里的某个考点:

RHCSA核心模块论坛项目中的具体体现
网络与主机名配置静态IP设置、hostnamectl 设置主机名
用户与权限管理创建论坛运行用户、目录属主和权限修正
软件包管理dnf/yum 安装依赖包、启用CRB / EPEL源
存储与文件系统/var/www/html 分区空间检查、目录挂载验证
systemd服务管理管理 httpd、mariadb 服务,设置开机自启
SELinux安全修改 httpd 对论坛目录的写权限布尔值
防火墙管理firewalld 放行 HTTP/HTTPS 端口
日志与排障根据 httpd 错误日志定位PHP模块问题
进程与资源管理调整 PHP-FPM 进程参数、查看服务资源占用

我建议所有正在准备RHCSA认证的朋友,期末项目别去挑那些"五分钟就能跑通"的小实验。像搭建论坛这种综合项目,虽然要多花不少时间,但做完之后你对整个系统的理解是完全不一样的。下面我会把整个搭建过程完整记录下来,包括每一步背后的原因、我踩过的坑、以及考试角度的对应思考,希望能给你做个参考。

2. 开局基础:先把一台裸系统调成"可用服务器"

很多人上来就装Apache、装数据库,结果装到一半发现IP不对、软件源不可用、根分区空间不够,回头还得返工。我这里的建议是:在动手装任何论坛组件之前,先把系统基础环境过一遍,这个过程本身就是RHCSA的考点。

2.1 网络配置:别等装完数据库才发现连不上网

我用的是一台虚拟机,最小化安装的RHEL 9,网卡是ens160。装完之后第一件事就是确认IP能通。最小化安装默认可能是有DHCP的,但作为服务器,DHCP拿到的地址随时可能漂移,这绝对要改掉。

直接使用nmcli命令调整连接配置,比改配置文件更符合RHCSA考试习惯,也更快:

sudo nmcli connection modify ens160 ipv4.addresses 192.168.10.66/24 sudo nmcli connection modify ens160 ipv4.gateway 192.168.10.1 sudo nmcli connection modify ens160 ipv4.dns "223.5.5.5 192.168.10.1" sudo nmcli connection modify ens160 ipv4.method manual sudo nmcli connection up ens160

为什么要手动指定DNS和网关?因为后面dnf install需要访问软件源,防火墙也需要连通网络。很多同学装到一半发现dnf特别慢或者直接解析不了域名,十有八九是这里没配干净。验证也很简单:ip addr show确认地址生效,ping -c 3 www.redhat.com验证外网连通。

2.2 主机名与SELinux基础设定

RHCSA考试考纲里明确要求会设置主机名。我给它起了一个有意义的名字,而不是默认的localhost:

sudo hostnamectl set-hostname forum-server.lan

但这里要提醒一句:Hostname变化之后,/etc/hosts里的映射不一定能对上,后面Apache或MariaDB在做域名解析的时候可能会异常。我踩过一次坑,明明服务都起来了,页面访问一直报错,最后发现是hosts文件里还是localhost,服务启动时的日志看起来"一切正常",这个问题在.5 节 排错思路里我会细讲。

另外,SELinux在RHEL 9中是默认开启的,不要一上来就想把它关掉。后面配置Apache目录权限时,我们需要的是让SELinux正确放行 httpd 进程对论坛目录的写操作,而不是粗暴地setenforce 0——这个操作在考试中极容易扣分,在实际生产环境里更是禁忌。后面我会单独给一节讲SELinux该怎么做。

2.3 软件源与系统更新:先保证dnf能干活

RHEL 9 的最小化安装,默认带的软件源可能不完整,比如PHP需要的某些扩展包,可能在标准的AppStream源里找不到。我当时的做法是:

sudo dnf install -y epel-release sudo dnf config-manager --set-enabled crb sudo dnf clean all sudo dnf update -y

EPEL是红帽系的社区扩展源,CRB是构建依赖源。没有这两个源,后面装PHP扩展时会非常痛苦。dnf update这一步建议在项目最开始做,如果你装了大量软件包之后再系统升级,偶尔会冒出版本冲突的问题。

2.4 用户与目录规划:给论坛一个独立的运行账户

很多新手图省事,直接用root去启动Apache或者给整个网站目录授权为root。说实话,在自己虚拟机里怎么弄都行,但这不符合实际生产习惯,也偏离RHCSA强调的用户与权限管理考点。我会单独创建一个系统用户来跑论坛相关服务:

sudo useradd -r -s /sbin/nologin forum

-r表示创建系统账户,-s /sbin/nologin表示不允许登录。虽然最后真正跑服务的还是apache用户和mysql用户,但论坛数据目录需要明确的属主规划。我的做法是:网站代码归属为apache:apache,单独的数据目录(比如forum_upload、forum_data)授权给apache,避免所有文件一股脑全是 root,导致后面权限校验出问题。

3. 数据库与网站的准备工作:Apache、PHP、MariaDB如何搭成一套

很多人会把搭建LAMP理解为"把Apache装上、把PHP装上、把MySQL装上",其实这三者之间的协作关系才是最需要理解的部分。简单来说:Apache是一个接待员,它接收浏览器的HTTP请求;PHP是一个"动态内容生成器",当请求的页面需要动态计算时,Apache把这个任务交给PHP来处理;MariaDB是后台记账本,负责存储论坛的用户、帖子、主题等数据。三者通过标准协议协作,缺失任何一环,论坛都跑不起来。

3.1 安装Apache httpd并调整关键配置

RHEL 9 上安装Apache非常直接:

sudo dnf install -y httpd

安装后立刻启动并设为开机自启:

sudo systemctl start httpd sudo systemctl enable httpd systemctl status httpd --no-pager -l

Apache的配置文件在/etc/httpd/conf/httpd.conf,但我不会直接改主配置,而是习惯在/etc/httpd/conf.d/下新建一个forum.conf,专门放论坛站点相关的配置。这样做的好处是主配置保持干净,将来排查问题时不用在一堆注释里找自己的配置。

论坛场景下最常见的配置项是DocumentRoot修改。默认的网站根目录是/var/www/html,但我想把Discuz!放到单独的目录,比如/var/www/html/discuz,所以需要确认或者创建对应的Location配置。对于这个项目,我会直接使用默认根目录,然后在下面建子目录,减少配置复杂度。

还有一个特别容易忽略的点:SELinux对Apache默认只允许读取/var/www/html下的内容,如果要让Apache写入该目录(比如上传头像、生成缓存),就要设置对应的SELinux布尔值。这一点我单独放在第4节讲。

3.2 PHP安装:选对版本比"能跑"更重要

RHEL 9 自带的PHP版本是8.0,Discuz!官方虽然对PHP 8的兼容性一直有争议,但实际测试下来,X3.5及以上版本跑PHP 8整体是没问题的。安装PHP时最忌讳只装php一个包,后续经常会出现"页面能打开但显示一片空白"的情况,原因就是缺少某个扩展。

我安装的包列表如下:

sudo dnf install -y php php-cli php-fpm php-mysqlnd php-gd php-xml php-mbstring

逐一说下作用:php-mysqlnd是让PHP连接MariaDB的驱动;php-gd负责生成验证码图片和缩略图;php-xml提供对XML文档的处理能力;php-mbstring处理多字节字符串,论坛的关键功能——搜索、发帖、编码转换——都依赖它;php-fpm如果你打算用Nginx才需要,用Apache时可以不需要,但装了也无妨。

安装完成后验证PHP解析是否正常是最基本的操作:

sudo systemctl restart httpd echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php

然后浏览器访问http://192.168.10.66/info.php,能看到PHP信息页就是正常。但是展示PHP探针是暴露安全风险的,验证完记得把info.php删掉。

3.3 MariaDB:建库建用户,权限精确到这台论坛

MariaDB在RHEL 9上同样直接通过dnf安装:

sudo dnf install -y mariadb-server sudo systemctl start mariadb sudo systemctl enable mariadb

RHCSA考纲里有一个必测点:mysql_secure_installation,也就是数据库安全初始化。这里我不展开每一步,但必须强调:这个步骤要求你设置root密码、移除匿名用户、禁止root远程登录、删除测试数据库。在一个真实服务器上,不跑这个步骤等于把数据库大门敞开。

我专门为Discuz!创建了一个独立数据库和数据库用户:

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

数据库密码我特意选了包含大小写字母和数字的长密码。为什么'discuz_user'@'localhost'只能限定localhost?因为论坛程序和数据库肯定在同一台机器上,没必要也没理由让数据库接受远程连接。如果你后续遇到"数据库连接失败",第一步就检查是不是用root密码连了,第二步检查用户和主机匹配是否严格对应。

4. 论坛程序部署:从下载到安装向导走完的完整链路

论坛软件我选的是Discuz!,一方面是国内资料多,遇到问题容易搜到解决方案;另一方面它的架构相对传统,对系统底层的考察更全面。X3.5版本官方要求PHP >= 7.2,同时也支持PHP 8,正好覆盖我们的环境。如果你手里是X3.4甚至更老的版本,在PHP 8环境下大概率会跑不起来。

4.1 下载与放置:小心的不是下载,而是目录权限

Discuz!的安装包是zip压缩包,系统里得先有unzip工具:

sudo dnf install -y unzip cd /tmp wget https://xxx/discuz_x3.5_release.zip sudo mkdir -p /var/www/html/discuz sudo unzip discuz_x3.5_release.zip -d /var/www/html/discuz/

下载完成后,最关键的其实是目录授权。Discuz!在安装阶段会写入config/、data/、uc_server/等目录,如果这些目录的属主不是Apache运行用户,安装向导会非常直白地报"目录不可写"。

我觉得这一步特别能体现RHCSA考点里的权限管理。很多同学不管三七二十一直接chmod -R 777 /var/www/html/discuz,当时确实是解决了问题,但留下了巨大的安全隐患。正确做法是:

sudo chown -R apache:apache /var/www/html/discuz sudo find /var/www/html/discuz -type d -exec chmod 755 {} \; sudo find /var/www/html/discuz -type f -exec chmod 644 {} \;

目录755、文件644,这在生产环境才是合理的授权粒度。同时,因为Apache进程本身就属于apache用户,设置apache为属主已经能保证写入操作不受阻碍。

4.2 SELinux:这一步做错,前面全部白搭

在RHEL系系统上搭Web服务,SELinux是绕不开的坎。Discuz!安装向导里让你填网站目录,如果SELinux没有放行,你会看到一种很诡异的现象:页面能打开,但程序无法在目录里写任何文件,报错千奇百怪。

我为这个项目专门检查了SELinux的文件类型标签:

ls -Z /var/www/html/discuz

正常来说,/var/www/html下的内容都应该是httpd_sys_content_t类型,这样httpd进程才可以读取。但Discuz!需要写入数据,所以还需要开启httpd_unified或者更精确地授权写权限。我用的命令是:

sudo setsebool -P httpd_unified on

-P参数表示持久化,重启后依然生效。这条命令的作用是允许httpd进程写SELinux标记为httpd_sys_content_t的目录。

但是只开unified还不够保险,因为Discuz!的uc_server还会对/var/www/html/discuz/uc_server/data/做很多读写操作。这里我额外用了更稳妥的官方推荐方式,给data目录单独设置写权限标签:

sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/discuz/data(/.*)?" sudo restorecon -Rv /var/www/html/discuz/data

这里要解释一下原理:SELinux给文件系统里的每个文件/目录定义了一个"安全上下文标签"(fcontext),httpd进程能否读/写某个文件,取决于该文件的标签是否匹配。上面第一行命令,就是告诉SELinux的规则库:这个目录及其子目录,全部标记为"允许Apache读写的内容文件类型"。第二行restorecon作用是把这条新加的规则立即应用到目录上,否则要等到下一次自动重标或重启才生效。

如果跳过这两步,安装向导跑到第二步就卡住,提示某些目录没有写权限。很多教程直接教你setenforce 0,这不是解决问题,这是绕过问题。考试的时候,评卷人可能就盯着你是不是正确处理了SELinux。无论从考试立场还是实际工作立场,都应该用setsebool和semanage fcontext来解决。

4.3 防火墙:服务都启动了,外面访问不了,先查它

Apache和数据库都装好以后,访问论坛页面最典型的报错是"连接超时"或"无法访问此网站"。第一反应往往是"服务挂了?",但systemctl status httpd一看是 running,那就查防火墙:

sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload sudo firewall-cmd --list-all

--list-all里能看到services: http https就表示放行了。RHEL 9默认防火墙是firewalld,不开80/443端口,外部就不可能访问到Web服务。这一点也是RHCSA考试的热门操作,别忽略。

4.4 浏览器安装向导:填写数据库时最容易被绕进去的坑

部署完文件,设置好权限,浏览器访问http://192.168.10.66/discuz/install/,会进入Discuz!的安装界面。

这个安装向导里有一个很经典的问题:它让你填写数据库用户名和密码,如果你填root和root密码,确实最保险,因为root对discuz库有全权限。但实际项目里不建议这样配置,我会填之前创建的discuz_user。

另外一个非常容易踩坑的是"数据库服务器地址"。很多学员填localhost没问题,填127.0.0.1反而连不上。原因是MariaDB默认监听的是Unix Socket(本地套接字),MySQL客户端用localhost会走socket连接,而用127.0.0.1走TCP连接。某些系统配置没有打开TCP监听3306端口,导致TCP方式连接失败。从安全角度讲,只监听本机socket是好实践,所以看到"数据库连接失败"先不要慌,换成 localhost 试试。

安装过程大概几分钟,看到"安装成功"的提示页,说明基础流程已经走通了。接下来是登录后台、修改管理密码、设置论坛名称,这些操作跟着提示走就行,不需要额外讲解。

4.5 一条典型的排错链路:安装向导能打开,但无限报权限错误

我在最初部署时,卡在最闹心的一个问题:安装向导能打开,但进入第二步后总是提示某个目录不可写。你按它的提示用chmod 777授权,它换一个目录继续报;你把整个目录都777了,它还是报。

排查链路是这样的:

先确认SELinux状态,因为很多权限报错其实是被SELinux拦截的,而普通ls -ld看不到任何痕迹:

getenforce sudo dnf install -y setroubleshoot-server sudo sealert -a /var/log/audit/audit.log

sealert 会给出比较清晰的解释:SELinux is preventing httpd from write access on the directory。看到这行,说明确实是SELinux拦截,而不是Unix权限问题。再用之前讲的setsebool -P httpd_unified on和semanage fcontext打上rw标签,问题就能解决。

如果sealert没有给出诊断,那么下一步就看Apache错误日志:

sudo tail -f /var/log/httpd/error_log

如果日志里出现Permission denied且与/var/www/html/discuz相关,大概率还是SELinux;如果报的是PHP Fatal error,那基本锁定是PHP扩展缺失或版本兼容问题。我亲测过一种情况:PHP模板块没装,Discuz!显示一片空白,查日志也看不出来问题,最后是php -m对比了可用模块列表才定位到缺fileinfo扩展。所以安装完PHP后别急着往下走,先用php -m把mysqli、curl、fileinfo都列出来过一遍,有缺就补。

5. 收尾验证与复习对照:把项目经验还原成考点能力

论坛跑通后,整个期末项目的最核心部分已经结束,但我不想就这么提交作业。前面铺垫了这么多,真正拉开差距的是最后的系统验证和运维基本功。这些内容也恰好是RHCSA考试最常考的细节点。

5.1 服务单元管理:不只是在安装时装一遍

考试和项目里,systemctl系列命令都是最高频操作。但要注意,RHCSA考察的不只是start/stop/restart/status,还会考察systemctl enable和systemctl mask的区别。我的笔记里特意写过:enable是设置开机启动,mask是彻底屏蔽服务,即使手动启动也会被拒绝。

论坛涉及的两个服务,我专门在项目里验证了开机自启状态:

sudo systemctl is-enabled httpd sudo systemctl is-enabled mariadb

输出是enabled才算正常。如果之前用systemctl disable或者手动启动没设为自启,重启虚拟机后论坛必然无法访问,这种低级错误最影响期末评分。

5.2 日志与排障能力:考试最容易丢分,但最值得掌握

RHCSA考试范围里虽然没有把"查看日志"单列为一道题,但几乎所有排错题都需要靠日志判断。我在这个项目里反复用到的几个日志路径:

日志文件用途
/var/log/httpd/error_logApache错误日志,权限问题、PHP语法错误都会记录
/var/log/httpd/access_log访问日志,哪台机器什么时间访问了什么页面
/var/log/mariadb/mariadb.log数据库日志,连接失败、SQL错误在这里留下痕迹
/var/log/audit/audit.logSELinux拦截日志,排SELinux相关问题时必须查

遇到问题最忌讳的是"猜原因然后换配置再试"。正确打开方式应该是:先看服务状态,再查对应日志,最后根据日志内容倒推验证。比如我之前遇到安装向导能打开但提交表单后页面404,查了access_log发现请求的URL带了一长串参数,而Apache的某些rewrite规则没开,导致路径解析失败——这类问题如果不去看日志,靠猜可能一晚上都找不出来。

5.3 系统安全检查:期末项目里的"加分项"

做完整个论坛部署之后,我顺手做了一轮安全基线检查。这部分不是RHCSA必考,但作为期末项目展示很有价值,能体现你有一个运维工程师的完整视角:

检查SSH的root登录是否被允许。默认情况下RHEL 9允许root通过密码登录,但生产环境更推荐关闭:

sudo grep "^PermitRootLogin" /etc/ssh/sshd_config

检查/etc/passwd中哪些账号没有密码锁:

sudo awk -F: '($2=="!!"){print $1 " is locked"}' /etc/shadow

检查对外开放的服务端口,确认除了22、80、443、3306(本机)之外没有意外暴露:

sudo ss -tlnp

这些动作和命令本身就是把RHCSA考点里的用户管理、进程管理、安全配置进行了一次综合应用。你做完了,评卷老师看得见,面试官也问不倒。

6. 考试视角的复盘总结:这个项目到底帮你练熟了什么

如果让我把整个搭建论坛项目浓缩成一段经验,那就是:RHCSA考的不是你会不会执行某一条命令,而是你遇到问题的时候能不能顺着系统给出的线索找到答案。这个项目里最典型的三次"被坑",恰恰是最有价值的复习素材。

第一个坑是Apache启动正常但页面打不开,通过ss -tlnp发现80端口根本没监听,因为httpd服务其实没起来,而systemctl start httpd的时候也没有任何报错——后来发现是PHP模块配置里有非法参数,导致Apache启动时静默失败,看/var/log/httpd/error_log才找到问题。第二个坑是Discuz!安装向导显示数据库无法连接,我先查了MariaDB是否正常运行,再检查discuz_user的权限和主机绑定的场景,最后发现是localhost和127.0.0.1的连接方式差异。第三个坑就在SELinux,如果你对semanage fcontext和restorecon不够熟悉,很可能浪费大量时间在chmod 777上,最后还被安全策略毒打。

RHCSA的考试环境和这个项目一样,不可能所有条件都顺顺当当。定期备份虚拟机的快照非常重要,万一配置搞坏了,一个恢复快照就能回到上一个正常点。我自己在这个项目里起码拍了五次快照:系统装完打一个,软件源配好打一个,Apache、PHP、MariaDB全部装完打一个,论坛代码放好打一个,安装向导跑通再打一个。每打一个快照,就可以放心折腾下一个环境,这种安全感在考试时同样适用。

搭论坛只是载体,底下的系统管理基本功才是核心。现在我可以很自信地说,考试里的网络配置题、SELinux题、服务管理题哪怕变着花样出,我也能顺着当时的排错链路找到正确做法。如果你也在准备RHCSA期末项目,真心建议你别满足于"能跑就行",试着把每一步背后的考试考点都整理成一份笔记——你已经不是在交作业,而是在帮未来的自己复习。

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

Codex实操指南:零代码用AI处理Excel和图片

1. 这不是编程课&#xff0c;是“用AI解决手头问题”的实操现场Codex这个词最近在各种技术社区、办公群、甚至高校教务通知里反复刷屏&#xff0c;但很多人点开官网第一眼就退了——满屏的API文档、token配置、endpoint地址、curl命令……仿佛在说&#xff1a;“请先学会写Pyth…

作者头像 李华
网站建设 2026/9/28 8:17:45

接口自动化测试框架实战:从pytest到持续集成

上个月我接了个小任务&#xff0c;给团队一个内部项目搭建接口自动化测试。说白了就是用脚本代替手工&#xff0c;把那些每天重复点的登录、注册、查询接口全部跑起来。当时热词里一堆人在搜"apifox接口测试教程"“postman接口测试教程”“pytest自动化测试框架”&am…

作者头像 李华
网站建设 2026/9/28 8:17:26

免费PCB封装库下载站横向评测:IPC合规与选型指南

1. 为什么封装库这件事值得单独拿出来聊画过板子的人都懂&#xff0c;原理图连线再漂亮&#xff0c;最后落到PCB上能不能一次成功&#xff0c;很大程度上取决于封装库靠不靠谱。我见过太多项目&#xff0c;原理图评审全票通过&#xff0c;结果板子回来发现某个QFN芯片的焊盘短了…

作者头像 李华
网站建设 2026/9/28 8:17:11

零代码用Codex:普通人任务翻译实战指南

1. 项目概述&#xff1a;一个非程序员的真实Codex使用手记“不会编程的人&#xff0c;到底能不能用 Codex&#xff1f;”——这个问题我问了自己整整三天。不是因为犹豫要不要试&#xff0c;而是因为身边太多人一听到“Codex”就自动划归到“程序员专属工具”的认知牢笼里&…

作者头像 李华
网站建设 2026/9/28 8:16:48

6个实战Agent练手项目:从单工具调用到多Agent协作

1. 这不是“玩具项目”&#xff0c;而是Agent技术的实战训练场“有哪些适合练手的 Agent 技术项目&#xff1f;”——这句话在2024年已经不是初学者的试探性提问&#xff0c;而是一线工程师、算法同学、甚至产品同学在技术选型会上脱口而出的真实需求。我带过三届校招新人&…

作者头像 李华
网站建设 2026/9/28 8:16:16

用Jev轻量推理模型重构Codex,打造可控可审计的本地AI编程Agent

1. 项目概述&#xff1a;这不是给Codex“装插件”&#xff0c;而是重构它的能力边界“给Codex装上Jev Skill&#xff0c;直接起飞&#xff01;”——这句话在最近两周的开发者社区里刷屏了。它不是一句营销口号&#xff0c;而是一次真实发生的、可复现的能力跃迁。我花了一周时…

作者头像 李华