
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考试考纲里明确要求会设置主机名。我给它起了一个有意义的名字而不是默认的localhostsudo 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 -yEPEL是红帽系的社区扩展源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 -lApache的配置文件在/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.0Discuz!官方虽然对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 mariadbRHCSA考纲里有一个必测点mysql_secure_installation也就是数据库安全初始化。这里我不展开每一步但必须强调这个步骤要求你设置root密码、移除匿名用户、禁止root远程登录、删除测试数据库。在一个真实服务器上不跑这个步骤等于把数据库大门敞开。我专门为Discuz!创建了一个独立数据库和数据库用户CREATE DATABASE discuz DEFAULT CHARACTER SET utf8mb4; CREATE USER discuz_userlocalhost IDENTIFIED BY YourStrongPass123; GRANT ALL PRIVILEGES ON discuz.* TO discuz_userlocalhost; FLUSH PRIVILEGES;数据库密码我特意选了包含大小写字母和数字的长密码。为什么discuz_userlocalhost只能限定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给文件系统里的每个文件/目录定义了一个安全上下文标签fcontexthttpd进程能否读/写某个文件取决于该文件的标签是否匹配。上面第一行命令就是告诉SELinux的规则库这个目录及其子目录全部标记为允许Apache读写的内容文件类型。第二行restorecon作用是把这条新加的规则立即应用到目录上否则要等到下一次自动重标或重启才生效。如果跳过这两步安装向导跑到第二步就卡住提示某些目录没有写权限。很多教程直接教你setenforce 0这不是解决问题这是绕过问题。考试的时候评卷人可能就盯着你是不是正确处理了SELinux。无论从考试立场还是实际工作立场都应该用setsebool和semanage fcontext来解决。4.3 防火墙服务都启动了外面访问不了先查它Apache和数据库都装好以后访问论坛页面最典型的报错是连接超时或无法访问此网站。第一反应往往是服务挂了但systemctl status httpd一看是 running那就查防火墙sudo firewall-cmd --permanent --add-servicehttp sudo firewall-cmd --permanent --add-servicehttps 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.logsealert 会给出比较清晰的解释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期末项目真心建议你别满足于能跑就行试着把每一步背后的考试考点都整理成一份笔记——你已经不是在交作业而是在帮未来的自己复习。