
备考RHCSA最怕的不是某个命令记不住而是所有命令都会背了合在一起却不知道从哪下手。我整理的这个RHCSA综合项目核心思路很简单用一台RHEL虚拟机亲手把一套论坛应用从零跑起来让用户权限、存储管理、systemd、SELinux、防火墙、日志排障这些考点全部串在一条线上。这篇文章就是你照着做就能复现的完整实战记录尤其是那些文档里不会写的坑我会全部摊开讲。不用“刷完题库就算复习完”这种自欺欺人的方式。真正的RHCSA考试并不考“你背了多少命令”而是给你一台机器、一堆任务看你能不能按需求完成配置。论坛项目恰好是一整套标准化系统你会在里面反复碰到“为什么权限不对”“为什么服务起不来”“为什么数据库连不上”这类真实问题。把这些问题的排查思路吃透考试里任何一题都不会让你手足无措。1. 思路拆解为什么论坛项目能把RHCSA考点全串起来1.1 明明考的是单点命令为什么要搭一个完整应用RHCSA考纲看着很散用户与组、文件权限、LVM、systemd服务、SELinux、防火墙、网络配置、日志归档、软件包管理每一块像是独立的知识岛。但实际工作里没有哪个任务是“只单独用一个技能”的。论坛应用恰恰是一台典型业务服务器的最小样例它需要Web服务、数据库、PHP运行环境、存储空间、网络端口、安全上下文和日志审计基础设施层面的几乎所有Linux技能它都要吃一遍。我选“论坛”而不是“博客”或“CMS”是因为论坛的交互场景更丰富用户注册登录、帖子写入、附件上传、后台管理这些操作会真实触发文件写权限、SELinux读写冲突、Web服务与数据库联动等一系列问题。你光用博客模板跑通一次可能根本遇不到附件目录写不进去的报错跑论坛一次部署下来基本把该踩的坑全踩了。另一个重要的理由是“可验证”。论坛跑没跑起来一眼就能看出来。你部署完有没有成功不是自己说了算而是打开浏览器注册一个账号、发一个帖子全部链路验证通过才算。这种“可验证性”对学习特别重要它逼着你不能只做到“命令敲完了”而是必须做到“服务真的可用”。1.2 技术选型和实验环境规划论坛程序我选了Flarum。原因很直接它轻量、现代对服务器资源要求低2核4G的虚拟机跑起来毫无压力安装流程里涉及PHP扩展、数据库初始化、Web虚拟主机配置考试需要的那些基础操作它全被覆盖到。没选Discourse因为那东西动不动要Docker和Redis对RHCSA阶段来说太重反而把学习焦点带偏了也没选Discuz这类老牌程序它虽然安装简单但目录结构和权限模型太老跑在RHEL 9上意义不大。环境规划上我不搞花里胡哨的多台机器就一台虚拟机但是硬件配置和磁盘分区刻意按“考试难度”设置项目配置备注操作系统RHEL 9 / Rocky Linux 9保持SELinux enforcing不许关CPU/内存2核 / 4GB跑FlarumMariadb够用系统盘20GB装系统和软件包第二块盘 /dev/sdb10GB练习分区、PV/VG/LV、挂载网卡NAT模式方便宿主机浏览器访问软件栈是经典的 Apache MariaDB PHP-FPM。RHEL 9默认的PHP运行方式是php-fpm不再是以前的mod_php这一点很多人不知道后面部署时会专门讲。整个项目我会按“基础系统配置 → 存储 → 部署论坛 → 安全加固 → 备份 → 对照考纲复盘”的顺序走每一步都保留实际执行过的命令和结果。2. 基础系统配置先把地基打牢再碰论坛2.1 用户与sudo别一上来就用root操作很多新手做项目喜欢全程root理由是不用担心权限报错。真这么干那是把RHCSA考试里最值钱的用户管理考点扔掉了。我给虚拟机专门建了一个运维账号整个论坛部署过程全部用它操作该sudo的时候sudo该切root的时候切root把权限切换练成肌肉记忆。# 创建运维账号 forumop加入wheel组获得sudo权限 useradd -G wheel forumop passwd forumop # 最好进一步配置sudo免密考试环境里频繁输密码很折磨 echo forumop ALL(ALL) NOPASSWD: ALL /etc/sudoers.d/forumop chmod 440 /etc/sudoers.d/forumop关于sudo配置我要强调一个坑修改 /etc/sudoers 必须用visudo命令它会做语法检查。我见过有人直接 vim 改完写错一行然后sudo直接崩掉整台机器变成“只能看不能用”。用 /etc/sudoers.d 单独文件也是推荐做法但写完记得chmod 440权限不对系统会拒绝读取。另外既然是备考RHCSA密码策略这一节也不能跳过去。给forumop设置密码的时候顺手练习一下chage -M 90 forumop这类密码老化配置考试时遇到“给某用户设置90天密码过期”的题你就不会临时去找选项了。2.2 存储规划把数据库目录和备份目录放到独立LVM很多人的实验环境一路装完就直接用一个根分区这样LVM的知识点永远是纸上谈兵。我故意把第二块盘 /dev/sdb 做成逻辑卷一部分给MariaDB数据目录一部分做备份目录。这一步不光是考试知识点也是生产习惯——数据库和数据备份不应该和系统挤在同一块盘上。我是这么分区的# 1. 用fdisk把 /dev/sdb 分成一个LVM分区 fdisk /dev/sdb # 交互操作n - p - 1 - 回车 - 回车 - t - 8e - w # 2. 创建物理卷、卷组、逻辑卷 pvcreate /dev/sdb1 vgcreate app_vg /dev/sdb1 lvcreate -L 8G -n db_lv app_vg # 数据库目录8G lvcreate -l 100%FREE -n backup_lv app_vg # 剩余空间给备份 # 3. 格式化并挂载 mkfs.xfs /dev/app_vg/db_lv mkfs.xfs /dev/app_vg/backup_lv mkdir -p /var/lib/mysql /backup mount /dev/app_vg/db_lv /var/lib/mysql mount /dev/app_vg/backup_lv /backup挂载这里有一个真实教训RHEL 9里 /var/lib/mysql 在安装MariaDB之前可能不存在你要先 mkdir 建出来如果安装之后才挂载原有的数据文件会被新文件系统遮住到时候你在 /var/lib/mysql 里看到是空的实际上是挂载点把原目录盖住了。顺序很重要先挂载再装MariaDB让数据库初始化的文件直接写进新逻辑卷。最后一步也是最容易丢分的写入 /etc/fstab 实现永久挂载。fstab里不能用设备名因为设备顺序可能变要用blkid查到的UUID。blkid /dev/app_vg/db_lv # 得到 UUIDxxxx-xxxx echo UUIDxxxx-xxxx /var/lib/mysql xfs defaults 0 0 /etc/fstab echo UUIDxxxx-xxxx /backup xfs defaults 0 0 /etc/fstab # 验证fstab没写错直接 mount -a mount -a df -h我做实验时吃过一次大亏fstab写完之后忘了执行mount -a验证以为已经挂好了结果重启后起不来。所以请记住一个黄金习惯凡是改完fstab当场执行mount -a再顺手重启一次确认系统起得来。考试最狠的就是让你修复一个“因为fstab写错导致无法开机”的服务端场景。2.3 主机名与网络给论坛一个固定“门牌号”论坛部署后要用浏览器访问绑定一个规范的主机名很重要后面配置Apache虚拟主机也会用到。我通常把机器设置成 forum.example.com这个名称会在虚拟主机配置、本地hosts解析和日志里反复出现比裸IP直观得多。hostnamectl set-hostname forum.example.com # 如果宿主机想直接用域名访问就在虚拟机内追加hosts解析 echo 127.0.0.1 forum.example.com /etc/hostsRHCSA考试里网络配置也是高频考点所以这里顺手练了nmcli配置静态IP的方法。注意RHEL 9里NetworkManager是标配网络接口的管理基本都通过nmcli直接改 /etc/sysconfig/network-scripts 里的ifcfg文件已经过时了。# 查看当前连接名和状态 nmcli con show # 把网卡改成静态IP假设当前连接名是 ens160 nmcli con mod ens160 ipv4.addresses 192.168.100.10/24 nmcli con mod ens160 ipv4.gateway 192.168.100.2 nmcli con mod ens160 ipv4.dns 192.168.100.2 nmcli con mod ens160 ipv4.method manual nmcli con up ens160有一个细节值得注意每次用nmcli改完配置最好nmcli con up ens160主动重连一次不然配置不生效而你又正在用SSH连接搞不好断线之后发现IP没变服务端配置和实际网络状态对不上排查起来非常浪费时间。3. 论坛部署一条命令一条命令把应用跑起来3.1 软件包管理与PHP版本切换Flarum对PHP版本有明确要求至少要8.1以上。RHEL 9默认仓库提供的PHP版本不一定满足这时就用到RHCSA考纲里的软件模块module功能了。AppStream仓库里的软件不是按传统方式安装的而是按模块流来管理你可以理解成“同一软件的不同版本通道”。# 先看看可用的PHP模块和版本 dnf module list php # 切换到 php:8.2 模块流 dnf module reset php -y dnf module enable php:8.2 -y这里我要特别提醒dnf module reset php和dnf module enable php是两回事。前者是清理当前激活的版本后者是选定目标版本。如果你不reset直接enable系统会提示冲突。实际环境里如果找不到8.2切到8.1也能满足Flarum 1.x的要求关键是学会这个切换逻辑而不是死记某个版本号。定好模块流之后一次性装齐Web服务和全部PHP扩展dnf install -y httpd mariadb-server php php-fpm \ php-mysqlnd php-xml php-mbstring php-json php-curl \ php-zip php-gd php-intl php-common装php扩展这个环节新手常犯的错是漏装。Flarum安装时对扩展的检查很严格缺一个就会在浏览器里直接报“缺少XX扩展”的红色提示。与其到时候一个一个补不如一开始就把常见扩展装齐。3.2 数据库初始化别把root密码想得太复杂装上MariaDB后先启动服务并设为开机自启这是RHCSA的必考基本操作systemctl enable --now mariadbRHEL 9默认MariaDB的root用户走unix_socket认证意思是只有系统root用户能直接进数据库不需要密码。这个机制很多人不熟悉老是折腾“root密码怎么设置”其实没必要。我建议项目里单独建一个应用账号给Flarum用权限只限定在论坛库范围内这样更安全也更贴近生产实践。# 进入数据库交互环境 mysql EOF CREATE DATABASE forum_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER forum_userlocalhost IDENTIFIED BY ForumPass2024; GRANT ALL PRIVILEGES ON forum_db.* TO forum_userlocalhost; FLUSH PRIVILEGES; EOF字符集这里我栽过一次如果用默认latin1建库中文帖子存进去之后页面里全部是“???”排查到最后才发现是库的字符集问题。utf8mb4才是现代Web应用的标准选择能存emoji也能完整覆盖中文字符集。3.3 部署Flarum下载、解压、权限一步都不能漏Flarum官方提供了release安装包你只需要把它下到服务器上解压。因为实验环境不一定能访问外网我习惯提前在本地把zip包下载好再通过sftp或scp传到虚拟机这样整个过程不依赖网络波动。# 解压到 /var/www/html 下的 forum 目录 mkdir -p /var/www/html/forum unzip flarum.zip -d /var/www/html/forum # 设置属主为apache因为php-fpm进程以apache身份运行必须让它有写权限 chown -R apache:apache /var/www/html/forum权限这一步是整个项目最容易出问题的地方。Flarum运行时要写storage日志目录、缓存目录用户上传头像附件要在public/assets里写文件。如果目录属主不对安装界面可能正常但一发帖、一上传就报500。所以记住先chown再进行下一步不要等到出问题了才回来补权限。我给一个合理的目录结构参考路径作用建议权限/var/www/html/forum/publicWeb入口和静态资源apache:apache, 755/var/www/html/forum/storage日志、缓存、会话apache:apache, 755/var/www/html/forum/public/assets附件、头像上传目录apache:apache, 775/var/www/html/forum/config.php数据库等敏感配置apache:apache, 6003.4 Apache虚拟主机与PHP-FPM衔接安装好Flarum文件后配置Apache把流量引向Flarum的public目录。我在 /etc/httpd/conf.d/ 下新建了 forum.conf避免直接改动主配置文件。VirtualHost *:80 ServerName forum.example.com DocumentRoot /var/www/html/forum/public Directory /var/www/html/forum/public AllowOverride All Require all granted /Directory ErrorLog /var/log/httpd/flarum-error.log CustomLog /var/log/httpd/flarum-access.log combined /VirtualHost这里有个RHEL 9的特别之处默认情况下PHP的处理方式是通过php-fpm的Unix Socket代理而不是以前直接作为Apache模块加载。你安装完php-fpm后系统会在 /etc/httpd/conf.d/php.conf 里自动配置好SetHandler proxy:unix:/run/php-fpm/www.sock|fcgi://localhost。如果你发现PHP页面一直变成下载文件或者直接显示源码八成是php-fpm没启动。启动服务顺序很关键systemctl enable --now php-fpm systemctl enable --now httpd systemctl restart httpd我习惯把php-fpm先启用再动httpd这样Apache启动时就能立刻连上后端的PHP处理器。如果顺序反了第一次访问时经常出现502 Bad Gateway。最后浏览器访问http://forum.example.com或你配好的虚拟机IP就会进入Flarum安装向导。填数据库名、数据库用户名密码、管理员邮箱和账号点安装论坛就跑起来了。安装完成后我还会顺手验证整条链路注册一个测试账号、发一帖、上传一张图确认没有隐藏问题。4. SELinux、防火墙、systemdRHCSA最容易丢分的三座山4.1 SELinux不是让你关掉而是让你学会看日志很多教程第一句话就是“测试环境直接setenforce 0”这种思路带到考试里必死。RHCSA考的就是你能否在SELinux enforcing模式下解决访问问题。关SELinux相当于把送分题变成送命题。论坛部署完成后我第一次访问时页面403Apache错误日志里写的是Permission denied。因为我的Flarum文件是从/home目录拷贝过来的SELinux上下文还是user_home_tApache根本无法读取。用ls -Z一看就暴露了ls -Zd /var/www/html/forum # 如果显示 user_home_t说明类型完全不对正确的修法是用semanage配置永久规则再加上restorecon应用# 给论坛目录设置httpd内容类型 semanage fcontext -a -t httpd_sys_content_t /var/www/html/forum(/.*)? # 给需要写入的目录设置可读写类型 semanage fcontext -a -t httpd_sys_rw_content_t /var/www/html/forum/(storage|public/assets)(/.*)? restorecon -Rv /var/www/html/forum这里必须解释清楚为什么用httpd_sys_rw_content_t而不是只给httpd_sys_content_t前者允许Apache读写后者只允许读取。如果论坛只有读取需求用只读类型就够了但Flarum要写日志、写附件只读类型会导致页面能开、登录失败、发帖失败各种诡异问题。实际排障时不要瞎猜要用审计日志定位。SELinux被拒绝的每条记录都会写进 /var/log/audit/audit.logausearch -m avc -ts recent # 或者 grep denied /var/log/audit/audit.log | tail -20看到denied关键字后可以用audit2why或sealert查看系统给出的修复建议。有一次我的Flarum后台想调用外部接口下载扩展一直超时查日志发现是SELinux阻止了Apache向外发起网络连接执行setsebool -P httpd_can_network_connect on后问题解决。这就是考试里常说的“根据SELinux提示调整布尔值”会看日志真的能省下一半排障时间。4.2 防火墙只放行需要的端口防火墙是RHCSA必考项而论坛项目里能把它练得非常具体Web服务要监听80端口但默认firewalld里80端口不一定开放。正确操作是添加http服务而不是简单粗暴地关闭防火墙。firewall-cmd --state firewall-cmd --permanent --add-servicehttp firewall-cmd --reload firewall-cmd --list-all为什么用--add-servicehttp而不是--add-port80/tcp前者会匹配服务名后续如果你把HTTP改成HTTPS管理上会更清晰。考试里两种写法都可能考你知道区别就行。另一个实用技巧是如果改了SSH端口一定要把新端口放进防火墙否则重启网络后你直接被锁在外面。这类“把自己锁在门外”的问题我身边不少人都在真实环境里遇到过。4.3 systemd管理开机自启与服务自愈RHCSA对systemd的考核核心是“服务管理”不是背一堆命令而是理解Unit的工作方式。论坛项目里httpd、php-fpm、mariadb三个服务都需要开机自启一条enable命令就能搞定systemctl enable --now httpd php-fpm mariadb systemctl is-enabled httpd php-fpm mariadb项目过程中我遇到过php-fpm进程莫名其妙退出导致502的情况。手动重启能解决但总不能天天盯着。给服务加上自动重启策略是更合理的方案这里用到了systemd的drop-in覆盖机制systemctl edit php-fpm在打开的覆盖文件里写[Service] Restarton-failure RestartSec5然后执行systemctl daemon-reload让改动生效。之后再遇到进程异常退出systemd会在5秒后自动拉起服务。很多人不知道RHCSA会考“给服务配置资源限制”或“设置重启策略”这类题其实就是考你能否用systemctl edit或直接修改Unit文件。这个技能在论坛项目里练过一次考试遇到就非常顺畅。系统日志也是这里要练的重点。查看服务状态和实时日志用好journalctljournalctl -u httpd -u php-fpm -f journalctl -u mariadb --since 1 hour ago遇到“服务启动失败”大多数人第一反应是看status的输出。但status只显示最后几行真正的报错细节往往要往上翻几十行。我习惯直接journalctl -u 服务名 -x最后的-x参数就是展开日志能看到更完整的上下文。5. 备份、日志审计与收尾验证5.1 写一个能用的备份脚本而不是手工敲命令论坛上线后备份脚本就是RHCSA里面“计划任务”和“shell脚本”的综合应用。我写了一个简单的脚本放在 /usr/local/bin/backup_forum.sh#!/bin/bash BACKUP_DIR/backup DATE$(date \%F) # 备份数据库 mysqldump --single-transaction -u root forum_db $BACKUP_DIR/forum_db_$DATE.sql # 备份论坛文件 tar czf $BACKUP_DIR/forum_files_$DATE.tar.gz -C /var/www/html/forum . # 只保留最近7天的备份 find $BACKUP_DIR -name forum_* -mtime 7 -delete # 记录日志 echo [$DATE] forum backup completed /var/log/forum-backup.log用cron添加定时执行crontab -e # 每天凌晨2点执行 0 2 * * * /usr/local/bin/backup_forum.sh写cron时有个经典的坑cron执行环境里PATH非常精简可能找不到mysqldump和tar。所以在脚本里要么写绝对路径要么开头加一行export PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin。我第一版脚本没注意这个测试时手动执行正常定时执行后一直没产生备份文件查了很久才发现是PATH问题。备份脚本写完我还会顺手练习“还原流程”把论坛目录删掉再把tar包解压回去把数据库drop掉再把sql重新导入。别怕麻烦V档“备份与恢复”经常考的就是这个能力你亲手还原过一次考场上就不会心慌。5.2 日志查看与分析把每一次报错变成复习素材论坛项目跑起来之后有一个很值得养成的习惯出了报错先看日志而不是先猜原因。我整理过自己踩过的几种典型报错全部都是从日志反推出来的日志出现位置关键词通常原因/var/log/httpd/flarum-error.logPermission denied目录权限不对或SELinux类型不对/var/log/audit/audit.logdeniedSELinux阻止了某个操作/var/log/messagesNo space left磁盘写满了journalctl -u php-fpmlisten failedphp-fpm的socket路径或权限不对storage/logs里的Flarum日志SQLSTATE数据库连接信息或服务有问题每次报错我都会按照“看状态 → 看日志 → 列可能原因 → 逐个验证”的顺序来。这个方法看着笨但它是真实生产中排查问题的主干道。考试里遇到服务起不来它的排查流程一模一样你先看systemd status再看journal日志再根据报错定位配置一步一个脚印完全不需要“背答案”。6. 把项目复盘成一张RHCSA考点对照表6.1 项目步骤与考纲考点映射论坛项目做完最后一步是回到考纲看看自己到底练过哪些东西。我做了一个对照表方便你在考前快速自查RHCSA考点论坛项目中的应用位置关键命令用户与组管理创建forumop、加入wheel组useradd、usermod、groupaddsudo权限配置/etc/sudoers.d 里的提权设置visudo、chmod 440文件权限与属主Flarum目录的apache属主和写权限chown、chmod、ls -Z存储/LVM第二块盘做pv/vg/lv并挂载fdisk、pvcreate、vgcreate、lvcreate、mkfs.xfsfstab永久挂载数据库目录、备份目录每次开机挂载blkid、mount -asystemd服务管理httpd/php-fpm/mariadb开机自启和重启策略systemctl enable --nowSELinux排障Forum文件上下文修复、网络布尔值调整semanage fcontext、restorecon、ausearch防火墙放行http服务firewall-cmd --add-servicehttp网络配置设置静态IP、主机名nmcli、hostnamectl计划任务每天备份论坛数据crontab、mysqldump、tar日志审计journalctl查看服务日志、排障journalctl、tail软件包与模块切换PHP模块流、安装扩展dnf module list enable这张表不是让你背的而是让你在考前检查表里的每一行你是不是都能独立完成如果哪一行还需要看文档那它就是你的薄弱点重点补。6.2 常见报错速查与自我“刁难”练习综合项目做完不代表结束我还会故意做一轮“破坏性练习”把服务关掉把权限改错把SELinux类型改乱然后要求自己限时修复。这么做的原因很简单考试环境里那些“坑”就是这样埋好的你得练到看见报错就知道往哪个方向查。以下是频率最高的几种故障场景也可以当速查表用现象第一条排查命令大概率原因修复方式浏览器403ls -ldZ /var/www/html/forum属主不对或SELinux类型不对chown apache:apache restorecon浏览器500tail /var/log/httpd/flarum-error.logPHP扩展缺失或storage写权限不足补装扩展或chmod storage页面502systemctl status php-fpmphp-fpm没启或进程挂了systemctl start php-fpm网页源码直接显示curl -I 看Content-Typephp-fpm代理没配置检查php.conf与php-fpm状态数据库连接失败mysql -u forum_user -p 测试登录用户授权错误或服务没启重跑授权SQL并启动mariadb帖子发完页面空白tail storage/logs/flarum.log字符集不对或缓存目录不可写检查库字符集和storage权限上传附件失败grep denied /var/log/audit/audit.logSELinux没给rw类型semanage fcontext改为rw类型每次破坏性练习我还会给自己计时。有一次我把SELinux类型全部改成user_home_t论坛页面立刻403从现象到日志再到修复全程花了11分钟。考试里的排障题时限也差不多是这个量级用这种高强度方式练几轮真正进考场就会从容很多。再分享一个小细节我给每个服务都养成了“curl验证”的习惯。不管改了什么配置最后一定要用curl -I http://localhost/看返回码。200可能不代表页面完全正常但如果返回403或5xx问题一定还在。把这条验证动作当成每次操作的收尾比盯着屏幕看什么都强。这个论坛项目我前后完整跑过三遍每一遍都能发现新的知识盲区第一遍卡在SELinux第二遍卡在PHP-FPM配置第三遍反而在备份脚本的cron PATH上栽了跟头。所以我想说光看这篇复盘文章是没有意义的一定要亲手把环境搭起来、亲手把故障排除掉。RHCSA考的不是智商是你在有限资源下一次次解决真实问题的熟练度。等你哪天能把这套论坛从无到有、从跑到修都走一遍你再来做考试真题会发现那些题目全都似曾相识。