1. 这道题真正在考什么:先看懂题目背后的知识点版图
先说个很多人容易踩的误区。RHCSA期末让你“搭建论坛”,乍一看是个Web应用部署题,实际上它考的是Linux基础服务管理的综合串联能力。论坛本身只是载体,评分点往往分散在系统配置、服务部署、SELinux策略、防火墙放行、数据库初始化、目录权限等一系列基础操作上。
从考试角度拆解,一道论坛搭建题通常覆盖以下几个知识模块:
- 网络与主机名配置(静态IP、主机名解析)
- 软件仓库配置(本地仓库或网络仓库)
- Web服务部署(Apache或Nginx)
- 数据库服务部署与初始化(MariaDB/MySQL)
- PHP环境配置(PHP及常用扩展)
- SELinux上下文与布尔值调整
- firewalld防火墙策略配置
- 目录权限、开机自启、服务状态验证
这几个模块恰好是RHCSA考纲里最高频的几大块。期末把论坛作为题目载体,本质上就是让你在一台几乎裸奔的服务器上,从零把一套完整业务跑起来。所以准备这道题,不是在“学搭论坛”,而是在“学Linux服务运维的标准流程”。
我见过不少同学的顺序是错的:一上来就下载Discuz压缩包,解压、丢到/var/www/html里,然后开始配数据库。结果卡在数据库连不上、页面打不开、图片不显示等各种问题上,最后连哪里出错都定位不了。正确的做法恰恰相反——先把地基打好,再谈论坛程序本身。
这篇文章我会按照我实际部署时走的完整链路来写:从系统初始化到论坛跑通,每一步都说明为什么这么做、考试时哪些点最容易丢分、生产环境中又有哪些地方需要额外注意。整套流程在RHEL/CentOS系系统上全部适用,Rocky Linux、AlmaLinux也基本一致。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备:虚拟机网卡、主机名与仓库配置,少一步后面全白搭
2.1 静态IP与主机名:最不起眼却最容易被扣分的基础项
很多同学的考试环境是虚拟机,默认使用DHCP获取IP。但RHCSA的评分脚本或人工检查时,通常会验证主机名是否符合特定格式,以及IP地址是否在指定网段内。
先看当前主机名:
bash复制hostnamectl set-hostname server.example.com
这里有个细节:主机名设置后,一定要同步确认/etc/hosts的内容。比如你的主机名是server.example.com,那就应该在hosts文件里加上:
bash复制192.168.122.100 server.example.com
为什么这一步重要?因为论坛程序在安装过程中,很多PHP脚本会依赖主机名进行URL拼接。如果主机名解析不到本地IP,安装完论坛后访问后台可能出现“服务器错误”或登录跳转异常。另外,数据库连接时如果使用localhost走的是socket,使用实际主机名走的是TCP,hosts解析不干净会导致连接超时。
再配置静态IP。这里我习惯用nmtui图形化工具,对考试来说比手改配置文件更不容易出错:
bash复制nmtui edit ens160
填入IP地址、网关、DNS后,记得重启网络服务:
bash复制systemctl restart NetworkManager
ip addr show ens160
生产环境里我通常会通过/etc/NetworkManager/system-connections/ens160.nmconnection这个文件来确认配置,但考试场景还是nmtui最快最稳。
2.2 软件仓库:本地光盘仓库是考场最靠谱的选择
搭建论坛需要安装httpd、mariadb-server、php及一批扩展包。如果考试机器无法访问外网,而你又没提前配好本地仓库,那基本可以宣告这一题凉了一半。
我推荐优先使用本地光盘仓库。挂载光盘:
bash复制mkdir -p /mnt/cdrom
mount -o loop /dev/cdrom /mnt/cdrom
然后创建仓库文件:
bash复制vim /etc/yum.repos.d/local.repo
写入以下内容:
ini复制[local-base]
name=Local CDROM Base
baseurl=file:///mnt/cdrom/BaseOS
gpgcheck=0
enabled=1
[local-appstream]
name=Local CDROM AppStream
baseurl=file:///mnt/cdrom/AppStream
gpgcheck=0
enabled=1
注意:RHEL 8/9系的光盘挂载路径下有两个目录,BaseOS和AppStream必须都配好,否则php和php-mysqlnd这类包会装不上。
我遇到过一个很典型的坑:用file:///mnt/cdrom之后,执行dnf install httpd提示找不到包,排查半天才发现是光盘挂载时没有加-o loop参数,导致/run/media/root路径下才是真实内容,而/mnt/cdrom是空的。所以挂载后第一件事,应该是检查目录内容:
bash复制ls /mnt/cdrom/AppStream/Packages/ | head
如果能看到rpm包文件,仓库才是真正可用的。顺便提醒一句,考试时如果重启了系统,光盘挂载会丢,需要重新挂载。所以更稳妥的做法是把挂载写入/etc/fstab:
bash复制echo "/dev/cdrom /mnt/cdrom iso9660 loop,ro 0 0" >> /etc/fstab
2.3 安全上下文:SELinux不处理,后面论坛会以最诡异的方式挂掉
RHCSA考试环境里SELinux默认是Enforcing状态,这是很多人栽跟头的地方。论坛文件明明放到/var/www/html了,权限也给了777,但浏览器访问就是403或者图片裂了。
问题的根源在于SELinux上下文标签。Apache的默认网页目录被标记为httpd_sys_content_t,你通过wget或U盘拷贝进去的论坛文件,很可能带的是default_t或usr_t上下文,Apache自然没权限读取。
我验证过,只要执行下面这条命令就能解决:
bash复制restorecon -Rv /var/www/html/forum
当然,我强烈建议在把论坛压缩包解压之后、还没开始配置之前,就先对整个目录做一次restorecon。原因是后面涉及的文件操作越多,上下文被改乱的可能性越大。
另一种情况是论坛需要写入文件,比如安装时生成配置文件、上传附件、生成缓存。这类写入操作还会触发SELinux的httpd_sys_rw_content_t需求。如果只是普通访问,httpd_sys_content_t就够了;但Discuz等论坛程序安装时会在根目录写入config文件,所以推荐使用更加宽松的httpd_sys_rw_content_t标签:
bash复制semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/forum(/.*)?"
restorecon -Rv /var/www/html/forum
这条命令的意义是“告诉SELinux,这些目录打算用来读写”,如果没装semanage工具,需要先安装policycoreutils-python-utils:
bash复制dnf install -y policycoreutils-python-utils
关于SELinux的调试技巧,我后面专门写一节来演示怎么用sealert快速定位问题。这里先记住结论:遇到网页访问异常,先看SELinux,再看权限。
3. 基础服务搭建:Apache、MariaDB、PHP三者依赖关系与配置细节
3.1 Web服务:Apache的安装、启动与开机自启
bash复制dnf install -y httpd
systemctl enable --now httpd
安装和启动本身很简单,但这里有几个细节比命令本身更重要。
第一,防火墙要放行http和https服务:
bash复制firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
第二,启动后立刻验证服务真正在监听端口:
bash复制ss -tlnp | grep :80
第三,确认SELinux的httpd服务相关布尔值允许网络访问。如果你后面打算让论坛连接远程数据库(虽然本场景不太可能),需要打开httpd_can_network_connect_db;如果连不上外部网络,可能还需要httpd_can_network_connect。我平时测试时配套检查这三条:
bash复制getsebool -a | grep httpd
第四,默认的/var/www/html下有个index.html测试页,如果没删掉它,Apache会优先显示这个静态页面,导致你访问IP时看到“Red Hat Enterprise Linux Test Page”而不是你的论坛。很多同学看到测试页就慌了,以为服务挂了,其实服务好着呢,是文件优先级的问题。
3.2 数据库:MariaDB的初始化、建库建用户
RHCSA和多数企业环境默认使用MariaDB作为MySQL的替代品。安装:
bash复制dnf install -y mariadb-server
systemctl enable --now mariadb
MariaDB装完后默认root密码是空的,直接执行安全初始化脚本:
bash复制mysql_secure_installation
过程会依次问你设置root密码、移除匿名用户、禁止root远程登录、删除test数据库等。按照提示把安全性拉满:
- 设置root密码:设置一个你记得住的复杂密码,比如
Admin@123456,但注意考试时如果配置文件、代码里要反复引用这个密码,拼写错误是很多人翻车的原因。 - 移除匿名用户:选Y
- 禁止root远程登录:选Y
- 删除test数据库:选Y
然后登录数据库,创建论坛专用的数据库和用户:
bash复制mysql -u root -p
进入MySQL命令行后执行:
sql复制CREATE DATABASE forum_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'forum_user'@'localhost' IDENTIFIED BY 'Forum@2024';
GRANT ALL PRIVILEGES ON forum_db.* TO 'forum_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
utf8mb4这个字符集很关键。老教程会用utf8,但对中文内容支持不彻底,某些生僻字或特殊符号会导致插入失败。如果你的论坛程序支持,首选utf8mb4,它能完整兼容所有Unicode字符。
我之前生产环境遇到过一个问题:用户发帖时输入了一个emoji表情,直接导致数据库报错“Incorrect string value”。排查半天发现就是字符集不对,后来把库表全部转换为utf8mb4才解决。在这里提前踩掉这个坑,能省后面很多麻烦。
3.3 PHP:不止装php包,php-mysqlnd这个扩展最容易遗漏
bash复制dnf install -y php php-mysqlnd php-fpm php-gd php-xml php-mbstring
PHP环境里最常用的组合是这些。其中php-mysqlnd是PHP连接MariaDB/MySQL的驱动,不装它的话,论坛安装程序会一直提示“数据库连接失败”或“未找到PDO_MYSQL驱动”。
php-gd用于图片处理,Discuz生成验证码时必须用到;php-mbstring是多字节字符串扩展,中文论坛不装它的话,字符截断会出现半个汉字导致的乱码或“Malformed UTF-8 characters”错误。
装完后可以创建一个探针页面确认PHP是否正常:
bash复制echo "<?php phpinfo(); ?>" > /var/www/html/info.php
然后在浏览器访问http://你的IP/info.php,能看到PHP配置页就说明Web+P
