RHCSA备考实战:从零搭建论坛,一次串起Linux核心运维考点

发布时间:2026/9/28 12:27:34
RHCSA备考实战:从零搭建论坛,一次串起Linux核心运维考点 RHCSA备考最磨人的不是单个命令记不住而是学完一堆命令不知道怎么组合起来用。我第一次刷完用户管理、权限、systemd之后感觉自己啥都会一上手做综合任务就发懵。后来我找了一个特别合适的练手项目——搭建论坛。论坛是典型的Web应用几乎所有互联网产品都能拆成“Web服务器 后端语言 数据库”这套三层结构把它完整跑起来你遇到的大部分问题都是运维日常工作会遇到的端口不通、解析失败、权限不对、SELinux拦截、服务重启后失效。做完这个项目等于把RHCSA考纲从头到尾过了一遍。这篇文章会完整记录我如何在一台RHEL 9系虚拟机上用命令行把论坛从零搭起来。全程不碰图形界面最后你会得到一个能用浏览器访问、能注册发帖回帖的论坛以及一份可以反复练习的运维排错清单。适合正在备考RHCSA的人也适合刚学完Linux基础、想做点真实项目的人。顺带说一句论坛程序本身不重要重要的是整个搭建过程中涉及的Linux技能。哪怕你后面不搭论坛改成搭博客、搭企业内部知识库这套思路和方法完全一样。1. 项目拆解为什么论坛能把RHCSA考点全串起来1.1 一个论坛背后藏着哪些RHCSA考点先说结论论坛这种技术栈极简的项目恰好命中RHCSA考试覆盖率最高的几个模块。论坛技术组件实际作用对应的RHCSA考点用户与组创建管理员账号、部署账号、设置目录属主用户和组管理、sudo授权、目录权限OpenSSH服务远程登录服务器改配置SSH配置、密钥认证、端口修改MariaDB数据库存放帖子、用户、板块数据dnf软件管理、systemd服务管理、数据库用户授权Apache PHP接收请求、生成动态页面Web服务管理、网络端口、目录权限SELinux firewalld安全访问控制SELinux上下文与布尔值、防火墙规则chronyd journald时间同步、错误日志查看时间同步、日志定位cron mysqldump定时备份数据库定时任务、Shell脚本、数据库备份你发现没有这些不是“额外加的活”每一条都是RHCSA考试里会出现的独立题目类型。把论坛项目做完一遍相当于把这些知识点按照真实生产环境的逻辑串了一遍。这也是为什么我建议备考的人不要只刷题一定要找一个综合项目练手。1.2 架构选型LAMP对备考者更友好论坛常见的架构有两种LAMP和LNMP。LAMP指的是Linux Apache MariaDB/MySQL PHPLNMP则是把Apache换成Nginx。我建议备考RHCSA的人选LAMP理由很实际Apache是Red Hat系系统里最经典的Web服务RHCSA考纲里出现的httpd配置、DocumentRoot、虚拟主机这些概念在Apache上学习路径最顺。Apache和SELinux的配合关系在考试里是重点Nginx的SELinux策略虽然也存在但考题出现频率低。论坛程序对Apache兼容性普遍好配置起来不容易被奇怪的问题卡住。至于论坛程序本身我推荐下面这几款论坛程序语言适合场景备注phpBBPHP最推荐练手开源老牌安装简单文档全RHCSA项目用起来心智负担最小Discuz!PHP想模拟国内论坛环境功能多但版本停滞新环境偶尔有兼容问题FlarumPHP想体验轻量现代界面好看但部署依赖Composer稍微多一步我的建议是备考阶段用phpBB它几乎不挑环境PHP装上就能跑你不需要为了论坛本身浪费精力。用Discuz! 也不是不行只是PHP新版本下偶尔要改配置没必要在考试前去碰这些。1.3 把项目拆成里程碑任何综合项目最怕一口气做完。我当时的拆分方案是这样的基础系统配置主机名、时区、普通用户、SSH密钥登录。数据库层安装MariaDB、安全初始化、创建论坛数据库和专用账号。Web服务层安装httpd和PHP相关模块、放行防火墙、确认PHP解析正常。论坛程序部署下载解压、设置目录所有权和SELinux上下文、通过Web安装向导完成配置。加固与备份服务设置开机自启、验证防火墙永久规则、配置cron定时备份、用日志验证一切正常。每个里程碑单独看都是RHCSA里的一道题连在一起就是一个完整项目。你甚至可以规定自己每个里程碑必须在30分钟内完成这非常接近真实的RHCSA考试节奏。2. 环境准备与用户权限先把地基打牢2.1 主机名、时区与普通用户我在虚拟机里装好最小化RHEL 9/CentOS Stream 9之后第一件事不是急着装软件而是把系统基础信息配置好。这一步看起来简单但RHCSA考试里经常单独出题考主机名和时区。hostnamectl set-hostname forum-server timedatectl set-timezone Asia/Shanghai timedatectl status紧接着创建一个普通用户并加入wheel组。原因很简单后面所有操作都需要sudo而且真实运维环境里没人直接用root干活RHCSA考试也默认你要会用sudo。useradd -m -G wheel forumadmin passwd forumadmin这里有个考试常踩的坑我先创建普通用户并测试sudo能正常切换然后才去sshd配置里关掉root远程登录。顺序反了的话万一普通用户sudo配置有问题你就会被锁在门外。vim /etc/ssh/sshd_config # 修改 PermitRootLogin no systemctl restart sshdPermitRootLogin no这个设置对考试很重要它能防止有人用root密码暴力破解也是真实服务器上最常见的安全加固手段。2.2 用SSH密钥代替密码登录RHCSA考纲里有“配置SSH密钥认证”这个明确考点我当时在项目里把它直接做成日常操作。生成密钥对用的是本机把公钥推送到服务器ssh-keygen -t rsa -b 4096 -C forum deploy key ssh-copy-id forumadmin192.168.31.10 ssh forumadmin192.168.31.10以后每次连接服务器都不用输密码而且比密码登录安全得多。这个操作还有个好处后续部署论坛时需要反复SSH到服务器改配置省掉输密码的功夫体验提升明显。有两点要特别提醒~/.ssh目录权限必须是700authorized_keys文件权限必须是600权限太宽SSH会拒绝使用密钥。我见过多次因为chmod 777导致密钥失效的情况。如果ssh-copy-id不可用可以手动把公钥追加到服务器的~/.ssh/authorized_keys里效果一样。2.3 目录与权限设计论坛文件最终会放在/var/www/html下这是Apache默认的网页根目录。部署前先把这个目录的权限理清楚mkdir -p /var/www/html chown root:root /var/www/html chmod 755 /var/www/html目录属主是root权限755意味着普通用户能读能进但只有root能写。这样做符合权限最小化的思路。等后面论坛程序部署完我会把/var/www/html/forum整个目录的属主改成Apache运行用户因为phpBB安装时要写缓存目录上传附件也要有写权限。这里顺带提一个RHCSA考纲里的ACL内容。如果某个目录既要给Apache写权限又不想改动整体属主关系可以用ACLsetfacl -m u:apache:rwx /srv/forum-upload getfacl /srv/forum-uploadACL的好处是不改变原有属主属组只额外给指定用户增加权限。考试中可能会出类似的题目我在项目里刻意练习了一次。3. 数据库与Web服务部署论坛的技术核心3.1 用dnf安装软件包别装错扩展论坛依赖一大堆PHP扩展最小化安装的系统默认一个都没有。我当时用了一条命令全部装齐dnf install -y httpd mariadb-server php php-mysqlnd php-gd php-mbstring php-xml解释一下每个包是干嘛的httpdApache Web服务主程序。mariadb-server数据库服务端。phpPHP解释器。php-mysqlndPHP连MariaDB的驱动没有它PHP代码里所有mysqli_connect都会报“undefined function”。php-gd生成验证码图片论坛注册页会用到。php-mbstring处理中文和字符编码不装的话phpBB安装向导可能直接报编码错误。php-xml解析XML和RSS论坛的订阅功能依赖它。安装完成后启动服务并检查端口systemctl enable --now httpd mariadb ss -tlnp | grep -E :(80|3306)ss -tlnp是检查端口监听状态的利器HTTP应该监听80端口MariaDB监听3306端口。如果某个端口没出现说明对应服务启动失败马上用systemctl status查看原因。这里有个坑必须先说RHEL 9上PHP和Apache的整合方式有讲究。如果后面访问论坛页面时浏览器直接下载.php文件而不是显示页面说明Apache没有把.php交给PHP解释器处理。解决办法是检查/etc/httpd/conf.modules.d/目录下有没有php相关模块配置或者安装php-fpm并启动dnf install -y php-fpm systemctl enable --now php-fpm systemctl restart httpd不过多数情况下RHEL 9安装php包后httpd的conf.modules.d/10-php.conf会自动配置好mod_php服务重启后就能正常解析PHP。3.2 MariaDB安全初始化与建库授权MariaDB装好后第一步是运行安全初始化脚本mariadb-secure-installation这个交互脚本会问你要不要设置root密码、删除匿名用户、禁止root远程登录、删除test数据库。测试环境里我一般保留默认推荐操作除了root密码那一步因为RHEL 9的MariaDB默认root走unix_socket认证本地sudo就能进不需要传统密码。进入数据库创建论坛专用的库和账号CREATE DATABASE forum CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER forumlocalhost IDENTIFIED BY StrongPass123; GRANT ALL PRIVILEGES ON forum.* TO forumlocalhost; FLUSH PRIVILEGES;为什么不用root直接给论坛用因为最小权限原则论坛程序只需要操作它自己的数据库给了root权限万一程序有漏洞整个数据库都会被拖走。考试不会直接考这个但面试和实际工作里一定会问。utf8mb4字符集要重点记住。早期MySQL的utf8字符集无法存emoji和部分生僻字utf8mb4是完整版UTF-8论坛用户昵称在移动端会输入emoji不选这个字符集后面写库会报错。账号这里我限制为forumlocalhost意思是只有数据库本机的连接才有效。如果以后论坛和数据库分开放需要改成forum192.168.1.%这种网段写法但单机部署用localhost最安全。而且localhost连接走Unix socket速度比TCP快SELinux也基本不会拦。3.3 部署phpBB论坛程序数据库准备好了接下来把论坛程序文件放到Web目录。我是在服务器上下载phpBB的压缩包再解压cd /tmp wget https://www.phpbb.com/files/release/phpBB-3.3.11.tar.bz2 tar xf phpBB-3.3.11.tar.bz2 mkdir -p /var/www/html/forum cp -a /tmp/phpBB3/* /var/www/html/forum/ chown -R apache:apache /var/www/html/forum这里有一个我在第一次做项目时踩过的坑压缩包是在/tmp目录解压的cp之后文件的所有权还是root而且SELinux上下文也不对。如果直接访问大概率会遇到403。所以chown一定要做后面SELinux那节会专门讲上下文问题。然后配置PHP处理。因为上面已经装好php和httpd访问http://服务器IP/forum/时phpBB的安装向导会自动跳转。安装向导里需要填数据库类型MySQL with mysqli。数据库主机localhost。数据库名forum。数据库用户名forum。数据库密码之前建账号时设置的。管理员账号自己设置一个。数据库主机填localhost而不是127.0.0.1这一点值得说明localhost会让PHP通过Unix socket连接MariaDB速度快也不会触发SELinux里httpd连数据库的网络布尔值填127.0.0.1则走TCP在多一层网络栈的同时SELinux可能还需要额外放行。单机部署统一用localhost是省心方案。4. SELinux、防火墙和服务加固RHCSA的高频坑4.1 先把防火墙端口放行服务装好了但在浏览器里访问http://服务器IP/时如果发现一直转圈或者连接超时你先别怀疑Apache先检查防火墙。RHEL系默认firewalld开启了80端口默认不放行。firewall-cmd --permanent --add-servicehttp firewall-cmd --permanent --add-servicehttps firewall-cmd --reload firewall-cmd --list-all--permanent的含义是持久化规则很多新手只执行firewall-cmd --add-servicehttp当时确实能访问但一重启防火墙全部回到初始状态端口又被封了。RHCSA考试里经常在这个地方设陷阱务必记住加--permanent然后--reload。还有一个安全常识不要顺手给数据库3306端口做防火墙放行。MariaDB的安全初始化里已经设置了root禁止远程登录论坛账号也绑定在localhost上。3306端口暴露给外部只会增加被爆破的风险远程管理数据库应该用SSH隧道。4.2 SELinux上下文才是403的元凶论坛部署完之后我遇到过最典型的情况浏览器访问http://IP/forum/结果Apache已经启动端口也通了但页面显示403 Forbidden。这时候别急着怀疑权限先看SELinux。SELinux给每个文件都打了一个“上下文标签”Apache进程只能读取特定标签的文件。我把论坛文件放在/tmp解压再复制到/var/www/html文件的标签很可能还是admin_home_t这种Apache认为这些文件不属于它可以读的范围所以直接403。用命令验证ls -Z /var/www/html/ ls -Z /var/www/html/forum/正常情况下/var/www/html/下的目录标签应该是httpd_sys_content_t如果你看到user_home_t或者admin_home_t那就破案了。解决方案是用semanage添加默认规则再用restorecon恢复标签semanage fcontext -a -t httpd_sys_content_t /var/www/html/forum(/.*)? restorecon -Rv /var/www/html/forum注意命令里(/.*)?这个正则不能丢它的意思是目录本身和里面的所有子文件、子目录都应用这个规则。我见过有人只写/var/www/html/forum结果只有顶层目录标签变了子目录还是错的页面依然403。如果论坛目录需要写入缓存和上传文件还要再加一条可写标签semanage fcontext -a -t httpd_sys_rw_content_t /var/www/html/forum(/.*)? restorecon -Rv /var/www/html/forum什么时候用httpd_sys_content_t什么时候用httpd_sys_rw_content_t记住这个规则只读的网页用content需要Apache写入的目录用rw_content。phpBB的cache/、files/、store/目录必须有写权限你可以在整个目录上直接用rw_content省事且正确。排查时可以用一个临时手段辅助判断问题是不是SELinux引起的执行setenforce 0临时切到permissive模式如果页面立刻能打开基本确定是SELinux策略问题。定位完之后马上setenforce 1恢复enforcing千万不要长期关闭SELinuxRHCSA考试里有明确要求SELinux不能disabled真实生产环境更是不可能关的。4.3 SELinux布尔值httpd能不能连数据库SELinux除了管文件标签还管进程的“网络访问能力”。如果论坛安装向导填好数据库信息后页面提示无法连接数据库而数据库本身运行正常、账号密码也正确那很可能是SELinux布尔值拦住了httpd的网络连接。排查步骤grep httpd /var/log/audit/audit.log | tail -20 getsebool -a | grep httpdgetsebool -a | grep httpd会列出和httpd相关的布尔值。如果看到httpd_can_network_connect -- off而你的PHP又要通过TCP方式连数据库那就需要打开它setsebool -P httpd_can_network_connect on-P表示持久化重启后依然生效。打开后不需要重启httpd立即生效。这里多说一句如果你严格按照上面数据库主机填localhost的方案PHP走的是Unix socket实际上不一定需要开这个布尔值。但如果后面你改用IP连接或者论坛需要访问外部图片、调用外部APIhttpd_can_network_connect就派得上用场了。考试里这个布尔值出现过不少次建议亲手开一次再关一次体验一下区别。5. 服务自启、日志排查与定时备份运维收尾5.1 服务开机自启论坛已经能正常访问了但在重启虚拟机之前先确认所有服务都设置了开机自启systemctl enable --now httpd mariadb systemctl is-enabled httpd mariadbenable和start是两个概念start只是现在运行enable是把服务写进开机启动链。很多人考试时只start忘了enable重启后服务全没了。RHCSA特别爱考这个题目会直接写着“确保服务在系统重启后自动启动”。重启一次系统做验证reboot # 重新登录后执行 systemctl list-units --failed systemctl status httpd mariadbsystemctl list-units --failed如果不是空列表说明有服务启动失败赶紧查看对应的journal日志。5.2 用journalctl做故障定位论坛出问题的时候日志是最好的老师。我的排查习惯是先看服务状态再看日志全链路拉通。实时跟踪httpd日志journalctl -u httpd -f只看今天的错误信息journalctl -u httpd --since today -p errMariaDB的日志也类似journalctl -u mariadb -p err除了journalctl传统日志文件也要知道位置Apache错误日志/var/log/httpd/error_logApache访问日志/var/log/httpd/access_logcron执行日志/var/log/cron我遇到过论坛后台卡顿的问题就是通过tail -f /var/log/httpd/error_log发现一堆PHP Fatal error: Allowed memory size exhausted后来调高PHP的memory_limit解决。这种问题在RHCSA考试里可能不会直接考但“通过日志定位问题”是比任何单独考点都重要的实战能力。5.3 cron定时备份数据库论坛跑起来之后数据全在数据库里不备份等于裸奔。我用cron做了一个每天凌晨自动备份的方案。先创建一个备份脚本mkdir -p /backup/forum cat /usr/local/bin/backup_forum.sh EOF #!/bin/bash BACKUP_DIR/backup/forum DB_NAMEforum mkdir -p $BACKUP_DIR mysqldump $DB_NAME | gzip $BACKUP_DIR/forum_$(date %F_%H%M).sql.gz find $BACKUP_DIR -name *.sql.gz -mtime 7 -delete EOF chmod x /usr/local/bin/backup_forum.sh为了让mysqldump能免密码运行在root用户的配置文件里添加数据库凭据cat /root/.my.cnf EOF [client] userroot EOF chmod 600 /root/.my.cnf注意我在本地测试时MariaDB root用的是unix_socket认证userroot就够了不需要明文密码。如果你开头设置了root密码也可以把这个配置文件里的password补上。chmod 600是必须的不然MySQL客户端会警告配置文件权限不安全。然后添加定时任务crontab -e # 每天凌晨2点执行 0 2 * * * /usr/local/bin/backup_forum.shcron的五个字段分别对应分钟、小时、日、月、星期0 2 * * *就是每天2点整执行。脚本里的find ... -mtime 7 -delete会自动删除7天前的备份防止磁盘被备份文件堆满。测试脚本能不能跑/usr/local/bin/backup_forum.sh ls -lh /backup/forum/然后查看cron日志确认任务真的有在执行grep backup_forum /var/log/cron这里还有一个容易忽略的点脚本里最好都写绝对路径。cron执行时的PATH非常精简直接写mysqldump有时会因为找不到命令而失败用/usr/bin/mysqldump或者先用which mysqldump确认路径再写进脚本。5.4 时间同步别忽略RHCSA考纲里有timedatectl也有时间同步。论坛的日志时间如果不对排错时会非常痛苦证书校验也可能失败。检查当前时间状态timedatectl status如果NTP没开启执行timedatectl set-ntp yes systemctl enable --now chronyd chronyc sources -vchronyc sources -v会显示当前同步的时间源如果列表里没有内容说明同步失败检查网络到时间服务器的连通性。时间同步虽然不起眼但日志审计、备份恢复、证书验证全都依赖它属于那种“不出问题时没人记得、一出问题就是大坑”的基础设施。6. 踩坑实录与快速排查手册6.1 常见问题速查表我把整个项目过程中遇到的典型问题整理成了一张速查表按“现象 → 可能原因 → 排查命令 → 解决方案”排列现象可能原因排查命令解决方案浏览器访问IP超时防火墙80端口未放行firewall-cmd --list-allfirewall-cmd --permanent --add-servicehttp firewall-cmd --reload页面显示403 ForbiddenSELinux上下文错误ls -Z /var/www/html/forumsemanage fcontext -a -t httpd_sys_content_t /var/www/html/forum(/.*)?restorecon -Rv访问.php文件变成下载PHP未配置给Apache解析systemctl status php-fpm安装php-fpm并启动或检查/etc/httpd/conf.modules.d/10-php.conf安装向导连不上数据库httpd_SELinux布尔值拦截网络连接getsebool -agrep httpd安装向导连不上数据库数据库服务没启动systemctl status mariadbsystemctl enable --now mariadb安装向导连不上数据库账号密码错误mysql -u forum -p重新CREATE USER并授权重启后网站无法访问服务没有enablesystemctl is-enabled httpdsystemctl enable httpd mariadbSSH登录被拒绝密钥文件权限太宽ls -l ~/.ssh/authorized_keyschmod 600 ~/.ssh/authorized_keysMariaDB root登录拒绝默认unix_socket认证sudo mysql使用sudo mysql进入再用ALTER USER改认证方式HTTP服务启动失败80端口被占用ss -tlnp找到占用进程处理或修改httpd监听端口cron备份没执行脚本路径或权限问题grep backup_forum /var/log/cron确认脚本绝对路径、chmod x脚本内命令全写绝对路径这张表我后来打印出来贴在显示器旁边每次遇到问题先查表再上网搜效率高很多。RHCsa考试时很多“服务起不来”的故障场景本质上就是上面某一条。6.2 我踩过的三个大坑第一个坑是SELinux子目录正则没写全。我一开始用的restorecon -Rv /var/www/html/forum当时页面能开但论坛后台一提交内容就报500错误。后来才发现我从/tmp复制过去时子目录标签全是user_home_t而我的semanage fcontext规则只匹配了顶层目录子目录根本没被覆盖到。加上(/.*)?重新restorecon之后一切恢复正常。第二个坑是防火墙规则没加--permanent。我测试的时候打开80端口页面正常访问第二天开机发现又连不上。当时我一直怀疑是Apache服务问题折腾半天才想起来防火墙规则重启后丢了。从那以后我每次改防火墙都默念--permanent--reload一条都不能少。第三个坑是关于数据库连接方式的。我在项目后期想模拟“数据库和应用分离”的场景把论坛连接地址从localhost改成192.168.31.10结果立即出现连接超时。排查时发现SELinux布尔值httpd_can_network_connect是off打开后问题解决。这个坑让我彻底理解了“localhost走socket、IP走TCP”在SELinux眼里是两码事也顺便把考试里SELinux布尔值这个考点学透了。6.3 备份恢复演练验证备份真的能用备份脚本写完只是开始我强烈建议你亲手做一次恢复演练。因为备份文件躺在磁盘上如果恢复不了跟没备份一个样。模拟故障直接删掉论坛数据库mysql -e DROP DATABASE forum;然后从备份恢复mysql -e CREATE DATABASE forum CHARACTER SET utf8mb4; gunzip -c /backup/forum/forum_20250101_0200.sql.gz | mysql forum恢复完成后浏览器访问论坛帖子、用户、板块应该全部还在。这一步做完你才算是真正把“备份”这个考点落地了。RHCSA考试不会让你完整恢复数据库但面试时说出“我备份完会做恢复演练”这句话立刻能拉开和普通备考者的差距。我个人做完这个项目最大的感受是RHCSA考的不是你会多少命令而是能不能在限定时间内完成一个真实任务。搭论坛这套流程练完后你看到任何一个Web应用都能按这个思路拆解用户权限、软件安装、服务管理、端口放行、SELinux、日志、备份。最后分享一个小技巧每次给虚拟机关机之前先重启一次然后跑一遍systemctl list-units --failed确认没有服务失败——这一步我每次考试前都会做能救命。