1. 项目概述与整体思路
老哥们,最近我在 RHEL9.3 上完整走了一遍 LNMP 环境搭建,并基于这套环境部署了一个轻量论坛系统,整个过程踩了不少坑,也积累了不少值得记录的经验。RHEL9.3 作为 Red Hat 当前主流的稳定版本,和 CentOS 7 那套老玩法差别不小,尤其是 dnf 包管理、SELinux 策略、防火墙规则这几个方面,都能让刚从旧系统迁过来的人头疼一阵。这篇博文就把整个过程拆开揉碎,从环境准备、组件编译安装、配置调优,到论坛系统的部署上线,每一步怎么做、为什么这么做,统统讲清楚。
LNMP 指的是 Linux + Nginx + MySQL/MariaDB + PHP 这套组合,和传统的 LAMP(Apache)相比,Nginx 在高并发静态资源处理上有天然优势,PHP-FPM 的进程管理模式也更灵活。RHEL9.3 自带的是 PHP 8.0、MariaDB 10.5,Nginx 则需要通过 EPEL 或官方源安装。这套环境适合个人站长、企业内部知识库、技术社区等中小规模场景,能承载几百到几千的日活用户,关键是把架构和权限梳理清楚,后续扩展也不会太痛苦。
说说这次部署的论坛选型。我最终选择了 Discuz! Q 的轻量版方案——不对,更准确地说,我使用的是 Discuz! X 3.5 的经典版本,因为它在 PHP 8.x 下兼容性比较好,安装向导完善,网上资料也多,遇到问题容易查到解决方案。Discuz! X 更适合那种希望开箱即用、后台管理功能完整的场景,而如果只是想要一个极简的留言板,也可以考虑自己做,但那个就偏离"论坛"的定位了。
整个项目的核心流程是:初始化 RHEL9.3 系统环境 -> 安装配置 Nginx -> 安装配置 PHP 和 PHP-FPM -> 安装配置 MariaDB -> 创建论坛数据库和账号 -> 下载部署 Discuz! X -> 通过 Web 安装向导完成初始化 -> 做安全加固和后续维护。这个过程看起来不复杂,但每一个环节都有很多容易忽略的细节,我后面会逐个展开。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与 LNMP 组件安装
2.1 RHEL9.3 系统初始化与软件源配置
拿到一台全新的 RHEL9.3 服务器,我一般先把系统更新到最新,然后确认主机名、时区、SELinux 状态这几个基础项。RHEL9.3 默认开启了 SELinux 强制模式,这个对新手来说是个大坑,很多权限问题都是它引起的。我个人的做法是先把 SELinux 理解清楚,而不是一上来就关掉,毕竟在真实生产环境里,关 SELinux 是会被运维老哥批评的。
bash复制# 更新系统
dnf update -y
# 检查 SELinux 状态
sestatus
# 查看系统版本
cat /etc/redhat-release
# 设置主机名(按实际域名或用途改)
hostnamectl set-hostname forum-server
软件源方面,RHEL9.3 默认的 BaseOS 和 AppStream 源已经包含 MariaDB、PHP 等组件,但版本可能不够新。我建议先安装 EPEL 源,再用 Remi 源来获取更新的 PHP 版本。Remi 源是 PHP 社区维护的第三方仓库,也是 RHEL/CentOS 系玩 LNMP 的首选。
bash复制# 安装 EPEL 源
dnf install -y epel-release
# 安装 Remi 源
dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm
# 查看可用的 PHP 模块
dnf module list php
这里要特别提醒一下:RHEL9 默认的 PHP 模块流是 8.0,如果你需要 8.1 或更高版本,要先重置模块流,再启用 Remi 里对应的版本。别直接装,否则后面装扩展的时候容易把系统搞乱。
2.2 Nginx 安装与基础配置
Nginx 在 RHEL9.3 里可以通过 EPEL 直接安装,也可以用 Nginx 官方源。我习惯用官方源,因为版本更新更快,而且对 RHEL 的支持标注得很清楚。
bash复制# 创建 nginx 官方源
vim /etc/yum.repos.d/nginx.repo
# 写入以下内容
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/rhel/9/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
# 安装
dnf install -y nginx
# 启动并设置开机自启
systemctl start nginx
systemctl enable nginx
Nginx 装完之后,先别急着配虚拟主机,我一般先把默认配置拿出来看一眼,确认 Nginx 用户、日志路径、PID 路径这些基础项。RHEL9.3 上 Nginx 的用户是 nginx,默认网页根目录是 /usr/share/nginx/html。不过论坛部署时我不建议放在这个目录下,而是单独建一个站点目录,比如 /data/wwwroot/forum,这样后续维护和备份都方便。
防火墙是 RHEL9 的另一个重点。默认情况下 firewalld 是启动的,不开放 80 和 443 端口的话,外部根本访问不到。
bash复制# 放行 HTTP 和 HTTPS
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
# 确认规则已生效
firewall-cmd --list-all
2.3 PHP 与 PHP-FPM 安装
PHP 是论坛系统的核心执行环境,本次部署选用 PHP 8.1,通过 Remi 源的模块流安装。Discuz! X 3.5 对 PHP 8.x 支持得不错,8.1 属于稳定又能充分发挥性能的版本。
bash复制# 重置 php 模块流
dnf module reset php -y
# 启用 remi 的 php 8.1 模块
dnf module enable php:remi-8.1 -y
# 安装 PHP 及常用扩展
dnf install -y php php-fpm php-mysqlnd php-gd php-xml php-mbstring php-json php-curl php-zip php-intl php-bcmath php-opcache
PHP 扩展里,php-mysqlnd 是连接 MariaDB 必需的,php-gd 用于图片验证码和头像处理,php-mbstring 是 Discuz! 处理多字节字符串的依赖,这几个缺一不可。装完之后检查版本和已加载的模块。
bash复制php -v
php -m | grep -E "mysqli|gd|mbstring|curl|zip"
PHP-FPM 的配置在 /etc/php-fpm.d/www.conf,默认配置有几个地方必须改。第一是监听方式,我改成 Unix Socket 形式,路径为 /run/php-fpm/www.sock,因为 Nginx 和 PHP-FPM 在同一台机器上,Socket 通信比 TCP 开销小、速度更快。第二是运行用户和用户组,改成 nginx,避免权限错乱。第三是调整 pm 参数,根据服务器内存来设定进程数。
bash复制# 编辑 /etc/php-fpm.d/www.conf
vim /etc/php-fpm.d/www.conf
# 关键修改项
listen = /run/php-fpm/www.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
user = nginx
group = nginx
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
进程参数的解释说一下。pm.max_children 是 PHP-FPM 最多同时处理的请求数,设置太大会撑爆内存,太小会导致高并发时请求排队。我一般按"每个 PHP-FPM 进程约 30MB 内存"来估算,比如服务器有 4GB 内存,理论上可以开 100 个,但要留出系统自身和数据库的内存余量,所以 50 是个比较稳当的数。
2.4 MariaDB 安装与初始化配置
RHEL9.3 自带的 MariaDB 10.5 完全满足 Discuz! X 的需求,没必要额外折腾。安装后第一件事就是跑安全初始化脚本,设置 root 密码、删除匿名用户、禁用 root 远程登录。
bash复制# 安装 MariaDB 客户端和服务端
dnf install -y mariadb-server mariadb
# 启动并设置开机自启
systemctl start mariadb
systemctl enable mariadb
# 安全初始化
mysql_secure_installation
安全初始化脚本会交互式地提问,依次是:设置 root 密码、是否移除匿名用户、是否禁止 root 远程登录、是否删除 test 数据库、是否刷新权限表。全部选 y 就行,这步是数据库安全的基本功。
数据库建库和账号分配这里有一个容易踩的坑:Discuz! X 安装的时候会要求输入数据库名、数据库用户和密码。很多新手直接拿 root 账号去填,这样虽然能装上,但后患无穷——网站程序一旦被注入,攻击者直接拿到数据库最高权限。正确做法是创建专用账号,只赋予它操作论坛数据库的权限。
bash复制# 进入 MySQL 命令行
mysql -u root -p
# 创建论坛专用数据库(字符集用 utf8mb4,支持表情符号)
CREATE DATABASE forum DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 创建专用用户,并限制只允许本机连接
CREATE USER 'forum_user'@'localhost' IDENTIFIED BY '这里填一个强密码';
# 授权
GRANT ALL PRIVILEGES ON forum.* TO 'forum_user'@'localhost';
# 刷新权限
FLUSH PRIVILEGES;
# 退出
EXIT;
字符集用 utf8mb4 很关键,因为 Discuz! X 的帖子内容可以包含 emoji 表情,而旧的 utf8mb3(也就是 utf8)存不了这些特殊字符。我从 utf8 迁到 utf8mb4 时踩过乱码的坑,这次从一开始就用对了。
3. LNMP 核心配置与论坛部署
3.1 Nginx 虚拟主机配置深度解析
Nginx 的站点配置是整个 LNMP 环境里最需要细抠的部分。Discuz! X 需要 Nginx 支持 pathinfo 模式,也就是 URL 形如 /forum.php?mod=viewthread&tid=1,但实际上 Discuz! 在 Nginx 下的伪静态规则有自己的特点。
我在 /etc/nginx/conf.d/ 下创建了 forum.conf,核心配置如下:
nginx复制server {
listen 80;
server_name forum.example.com;
# 论坛根目录
root /data/wwwroot/forum;
index index.php index.html;
# 上传文件大小限制,Discuz 默认允许 2M,这里放大一些
client_max_body_size 20m;
# 静态文件缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 7d;
access_log off;
}
# PHP 请求转发到 PHP-FPM
location ~ \.php$ {
root /data/wwwroot/forum;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 拒绝访问隐藏文件
location ~ /\. {
deny all;
}
# Discuz 伪静态规则(去掉 URL 中的 .php)
location / {
try_files $uri $uri/ @rewrite;
}
location @rewrite {
rewrite ^/(.*)$ /index.php?$1 last;
}
}
# 日志配置
access_log /var/log/nginx/forum_access.log;
error_log /var/log/nginx/forum_error.log;
}
这段配置里有几个关键点,我实际测试中反复验证过:
fastcgi_param SCRIPT_FILENAME 这一行必须手动指定,因为不同的 Nginx 版本对 $document_root 的处理有差异,不写的话容易出现"File not found"错误。fastcgi_pass 用的是 Unix Socket 而不是 TCP 的 127.0.0.1:9000,Socket 通信更高效,但前提是 PHP-FPM 的 listen 配置要对上。伪静态规则用了 try_files 加 @rewrite 的方式,比传统的 rewrite ^(.*)-([^-]+).html$ 这类规则更简洁,兼容性也更好。
配置文件写完后,用 nginx -t 测试语法,通过后重载服务。
bash复制nginx -t
systemctl reload nginx
3.2 论坛程序下载与文件权限设置
Discuz! X 3.5 的安装包可以从官方站点下载,我直接把文件放到 /data/wwwroot/ 目录下。
bash复制# 创建站点目录
mkdir -p /data/wwwroot/forum
# 下载并解压(这里用你获取到的实际下载地址)
cd /data/wwwroot
wget 下载地址 -O discuz.zip
unzip discuz.zip -d forum
# 删除安装包
rm -f discuz.zip
文件权限是一个极其关键的环节,不少人在这一步栽跟头。Nginx 和 PHP-FPM 都是以 nginx 用户运行的,如果论坛目录的所有者还是 root,那 PHP 进程就没法写入缓存目录和数据目录。
bash复制# 修改文件所有者为 nginx
chown -R nginx:nginx /data/wwwroot/forum
# 设置目录权限
find /data/wwwroot/forum -type d -exec chmod 755 {} \;
find /data/wwwroot/forum -type f -exec chmod 644 {} \;
# 需要可写的目录
chmod -R 775 /data/wwwroot/forum/data
chmod -R 775 /data/wwwroot/forum/config
这里我给初学者解释一下目录权限的含义。755 表示所有者可读写执行,组和其他人可读执行;644 表示所有者可读写,其他人只读。data 和 config 目录是 Discuz! 运行时要写入文件的,所以给了 775,也就是所有者(nginx)和同组用户都能写。如果你有多个账号在管理这台服务器,需要注意别把权限放开到 777,那样任何用户都能改文件,安全性大打折扣。
3.3 Web 安装向导实操记录
浏览器里输入 http://server_ip/,正常情况下会跳转到 Discuz! 的安装页面。如果这一步就报错,大概率是防火墙或者 SELinux 的问题,后面第 5 章我会专门讲排查方法。
安装向导第一步是检查环境,包括 PHP 版本、目录权限、扩展是否齐全。如果在第一步就出现红色警告,比如某个目录不可写,你需要回到终端重新确认权限设置。这里有个小技巧:看到"目录不可写"时,不要只盯着 chmod,还要看文件所有者和 PHP-FPM 的运行用户是否一致。我用 nginx -V 或 ps aux | grep php-fpm 的方式确认运行用户,如果确实是 nginx,再检查目录的属主是否也是 nginx。
数据库配置这一步,填我们之前创建的 forum 数据库和 forum_user 账号。数据库地址填 localhost 就行,因为 MariaDB 和 Nginx 在同一台机器上,用 Unix Socket 连接比 TCP 更快,Discuz! 会自动适配。
管理员账号设置这一步,我建议设置一个复杂的管理员密码,不要用 admin/admin123 这种默认组合。同时把管理员邮箱填成常用邮箱,后续找回密码要用。
安装完成后,务必删除或重命名 install 目录,这是论坛部署后最重要的一步安全操作。Discuz! 的安装脚本如果一直保留在服务器上,任何人都可以通过访问 install/index.php 重新安装,原有数据会被清空。
bash复制# 删除安装目录
rm -rf /data/wwwroot/forum/install
3.4 SELinux 策略对论坛系统的影响
RHEL9.3 和 CentOS 7 最大的区别之一就是 SELinux 默认强制启用。我在部署过程中无数次和它搏斗,必须单独拿出一节来好好讲讲。
SELinux 有三个模式:enforcing(强制)、permissive(宽容)、disabled(关闭)。查看当前模式用 sestatus。如果论坛页面能打开但图片和 CSS 加载不出来,或者后台提示无法写入文件,很可能是 SELinux 在拦截。
RHEL9 的 SELinux 针对 httpd 进程(Nginx 和 PHP-FPM 都属于这个域)有一套专门的布尔值(boolean),常用的几个:
bash复制# 允许 httpd 进程连接数据库(PHP-FPM 要连 MariaDB 必须开)
setsebool -P httpd_can_network_connect_db on
# 允许 httpd 访问 nfs 文件系统(如果你的站点目录挂载了 NFS)
setsebool -P httpd_use_nfs on
# 允许 httpd 执行 CGI
setsebool -P httpd_enable_cgi on
关键就是这个 httpd_can_network_connect_db,如果不开启,PHP-FPM 连接 MariaDB 时会被 SELinux 直接拒绝,数据库配置那一步就会卡住。装了 php-fpm 之后系统通常会默认开启这个布尔值,但我实际测试中偶尔会遇到没开的情况,所以还是手动执行一遍最稳妥。
SELinux 的另一个坑是针对文件类型的。SELinux 不只是看文件权限,还看文件的安全上下文(type)。如果 /data/wwwroot/forum 下的文件类型不对,比如是 default_t 而不是 httpd_sys_content_t,Nginx 就无法读取。
bash复制# 查看文件类型
ls -Z /data/wwwroot/forum
# 如果类型不是 httpd_sys_content_t,需要修正
semanage fcontext -a -t httpd_sys_content_t "/data/wwwroot/forum(/.*)?"
restorecon -Rv /data/wwwroot/forum
semanage 这个命令属于 policycoreutils-python-utils 包,如果没有,需要先安装。restorecon 是把文件的安全上下文恢复为策略中定义的默认值。
在这里我给一个建议:如果你想彻底绕开 SELinux 的麻烦,可以在 /etc/selinux/config 里把 SELINUX 改成 disabled,然后重启。但这是开发环境或者对内测试环境的做法,生产环境不要这样。我见过很多真实案例,SELinux 被关闭后一旦遇到 web 服务被入侵,攻击者就能直接读系统文件,破坏面大得多。
4. 常见问题与排查技巧实录
4.1 安装过程典型报错与解决方案
这一节把我实际遇到的和群友经常问的问题整理成速查表,按出现频率排序:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 浏览器访问 IP 出现 "File not found" | PHP-FPM 的 SCRIPT_FILENAME 参数错误 | 在 Nginx 配置里显式指定 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name |
| 数据库连接失败 | SELinux 拦截或数据库账号权限不对 | 开启 httpd_can_network_connect_db;检查 GRANT 权限 |
| 安装向导提示目录不可写 | PHP-FPM 运行用户与目录所有者不一致 | 统一为 nginx:nginx,检查 data/config 目录权限 |
| 页面能打开但 CSS/图片丢失 | Nginx 静态文件 location 配置冲突 | 检查 location 规则的匹配优先级,确保静态文件请求不会被 rewrrite 到 index.php |
| Discuz 后台打不开,提示 404 | 伪静态规则配置错误 | 检查 try_files 和 @rewrite 配置,或者暂时关闭伪静态 |
| 帖子发不出来,提示请求失败 | PHP 的 upload_max_filesize 或 post_max_size 太小 | 修改 php.ini:post_max_size=20M,upload_max_filesize=20M |
| 验证码不显示 | php-gd 扩展未安装 | dnf install -y php-gd 并重启 php-fpm |
| 内存占用过高,服务器卡死 | PHP-FPM 的 pm.max_children 设置过大 | 调整 pm 参数,减少进程数;开启 opcache 提升性能 |
其中 "File not found" 是最经典的 Nginx + PHP-FPM 配置问题。排错思路是:先确认 Nginx 配置文件里 root 指向的目录是否存在且权限正确,再确认 SCRIPT_FILENAME 参数。我提供了一个快速测试命令,用 curl 去拉一个 PHP 文件看返回头:
bash复制curl -I http://localhost/index.php
如果返回 200,说明 PHP 执行正常;如果返回 404,可能是文件不存在;如果返回 500,一般是 PHP 语法错误或扩展缺失。
4.2 PHP-FPM 日志分析与性能定位
LNMP 环境出问题,很多时候看一眼日志就能定位。PHP-FPM 的错误日志默认在 /var/log/php-fpm/error.log,Nginx 的错误日志在 /var/log/nginx/error.log。
bash复制# 实时查看 PHP-FPM 日志
tail -f /var/log/php-fpm/error.log
# 实时查看 Nginx 错误日志
tail -f /var/log/nginx/error.log
我遇到过一次论坛首页加载要 5 秒以上的情况,不是网络问题,而是 PHP-FPM 进程全部处于 busy 状态。通过日志看到大量的 "PHP Warning: mysqli::connect(): (HY000/2002): Connection refused",排查后发现是 MariaDB 的 max_connections 达到上限,连接被拒绝。解决方案是调整 MariaDB 的配置,放开连接数,并且优化 Discuz 的数据库连接池参数。
另外分享一个性能排查的小手段:在 PHP-FPM 配置里开启慢日志,超过阈值就记录请求详情,方便定位是哪个脚本拖慢了速度。
bash复制# 编辑 /etc/php-fpm.d/www.conf
slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 5s
开启后,超过 5 秒没执行完的 PHP 请求会被记录到慢日志里,配合 strace 可以进一步分析卡在哪里。
4.3 数据库备份与恢复实操
论坛数据无价,备份必须养成习惯。我写了一个简单的 shell 脚本,每天凌晨自动备份论坛数据库和附件目录,保留最近 7 天的备份。
bash复制#!/bin/bash
# /usr/local/bin/backup_forum.sh
BACKUP_DIR=/data/backup/forum
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME=forum
DB_USER=forum_user
DB_PASS='数据库密码'
mkdir -p $BACKUP_DIR
# 备份数据库
mysqldump -u$DB_USER -p$DB_PASS --databases $DB_NAME --single-transaction --routines --triggers > $BACKUP_DIR/forum_$DATE.sql
# 备份附件目录(论坛的 data/attachment 目录)
tar -czf $BACKUP_DIR/attachment_$DATE.tar.gz /data/wwwroot/forum/data/attachment
# 删除 7 天前的备份
find $BACKUP_DIR -name "*.sql" -mtime +7 -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
echo "Backup completed at $DATE"
mysqldump 加 --single-transaction 参数很关键,它能在不锁表的情况下完成备份,避免备份期间论坛用户发帖受影响。然后配置 crontab 定时任务:
bash复制crontab -e
# 每天凌晨 3 点执行备份
0 3 * * * /bin/bash /usr/local/bin/backup_forum.sh > /dev/null 2>&1
恢复数据库时,如果论坛崩溃需要重建,直接执行:
bash复制mysql -u forum_user -p forum < forum_20240101_000000.sql
恢复附件目录:
bash复制tar -xzf attachment_20240101_000000.tar.gz -C /
这里的备份脚本有个小问题,数据库密码明文写在脚本里,有安全风险。更稳妥的做法是设置 MySQL 的 .my.cnf 文件,把连接信息放进去,脚本只调 mysqldump 不带密码参数。不过为了演示方便,上面用的是直观写法,大家自己用的时候建议改成 .my.cnf 方式。
4.4 安全加固清单与后续维护建议
论坛上线后,安全加固是必须做的工作。我梳理了一份清单,照着做基本能挡住大部分常见攻击:
第一,修改 SSH 默认端口并禁用 root 直接登录。这个虽然和论坛本身无关,但服务器如果被爆破,论坛数据也难保。
第二,定期更新系统补丁。
bash复制dnf update -y
第三,配置 Fail2ban 来防暴力破解 SSH 和登录接口。
bash复制dnf install -y fail2ban
systemctl start fail2ban
systemctl enable fail2ban
第四,Nginx 层面做一些请求限制,防止被刷。在 server 配置里加上限制请求频率:
nginx复制limit_req_zone $binary_remote_addr zone=forum_limit:10m rate=10r/s;
server {
location / {
limit_req zone=forum_limit burst=20;
}
}
第五,Discuz! 后台安全设置:开启登录验证码、限制前台注册、关闭不必要的插件和模板。后台地址默认在 /admin.php,建议改成一个复杂路径,降低被扫描器探测的概率。
第六,数据库账号权限定期审查,确保 forum_user 只对 forum 库有权限,不能被其他库读取。
第七,定期检查日志,看看有没有异常访问。
bash复制# 查看登录失败记录
grep "Failed password" /var/log/secure
# 查看 Nginx 访问日志中的异常 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
这些安全措施不需要一次性全部搞完,但数据库备份和系统更新这两条是底线,无论如何都不能省。
5. 实战心得与后续扩展方向
最后分享几条我个人在这次部署过程中的真实感受。
RHEL9.3 和旧版 CentOS 的差异比想象中大。dnf 虽然兼容 yum 的命令习惯,但模块流的概念刚接触时需要适应;SELinux 的布尔值设置如果不理解原理,很容易被各种权限问题折磨。我的建议是不要一上来就关闭 SELinux,而是通过 systemctl status 和 audit2why 去定位具体的拦截规则,这样既能解决问题,也保持系统的安全性。
关于 LNMP 的组件版本选择,我的经验是"够用就好,不要盲目追新"。RHEL9 自带的 MariaDB 10.5 和通过 Remi 装的 PHP 8.1,组合起来已经能很好地跑 Discuz! X。追求 PHP 8.3 或 MySQL 8.4 不是不行,但兼容性问题会成倍增加,特别是老旧的论坛插件可能根本不支持。
关于论坛系统的选型,Discuz! X 胜在功能全、资料多,但代码有些年头了,如果想要更现代的交互体验,可以关注 Flarum、NodeBB 这类新论坛,部署方式也完全不同。不过那是另一个话题了。
按我个人的测试,这套 LNMP 环境跑 Discuz! X,在 2 核 4G 的云服务器上,日常几百个在线用户完全没问题,主要瓶颈在数据库的并发连接数上。如果后续用户量增长,可以考虑上 Redis 做缓存、CDN 做静态资源加速,这些都是很成熟的扩展路径。
这篇博文从环境初始化写到安全加固,全程都是我在 RHEL9.3 上实际操作过的步骤和参数,希望能给准备入坑 LNMP 或 RHEL 系的兄弟提供一份靠谱的参考。如果部署过程中遇到上面没讲到的问题,欢迎在评论区留言,我会尽力解答。
