1. 项目概述
在RHEL9系统上搭建LNMP环境(Linux+Nginx+MariaDB+PHP)并部署Discuz论坛,是很多Linux初学者和网站管理员需要掌握的基础技能。作为一名有多年Linux系统管理经验的运维工程师,我经常需要为不同规模的社区或企业搭建类似的论坛平台。相比传统的LAMP架构,LNMP以其更高的并发性能和更低的内存占用,成为当前中小型网站的主流选择。
Discuz作为国内最流行的开源论坛系统之一,凭借其丰富的插件生态和稳定的性能,至今仍被众多社区网站采用。本次搭建过程不仅适用于学习RHCSA认证的学员,对于需要快速部署论坛的运维人员也具有实用参考价值。下面我将结合自己多次搭建LNMP环境的经验,详细解析每个关键步骤的注意事项和优化技巧。
2. 环境准备与系统配置
2.1 系统初始化设置
使用RHEL9系统作为基础环境时,建议通过官方ISO镜像进行最小化安装。我通常选择"Minimal Install"模式,只安装最基本的软件包,这样可以减少不必要的服务占用系统资源。如果已有现成的RHEL9环境,可以通过快照恢复到干净状态开始实验。
主机名修改是容易被忽视但很重要的一步:
bash复制hostnamectl set-hostname discuz-server
这不仅能提高管理效率,在后续配置SSL证书时也能避免混淆。修改后需要退出当前会话重新登录才能生效。
注意:生产环境中不建议完全关闭SELinux,而是应该根据服务需求配置适当的安全策略。但在学习环境中,可以临时设置为permissive模式:
bash复制setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
2.2 配置本地Yum源
在没有互联网连接或需要稳定软件版本的环境中,配置本地Yum源是最可靠的方式。以下是详细步骤:
- 首先挂载RHEL9安装镜像:
bash复制mount -o loop /path/to/rhel9.iso /mnt
- 创建repo配置文件:
bash复制cat > /etc/yum.repos.d/local.repo <<EOF
[local-base]
name=Local Base
baseurl=file:///mnt/BaseOS
enabled=1
gpgcheck=0
[local-appstream]
name=Local AppStream
baseurl=file:///mnt/AppStream
enabled=1
gpgcheck=0
EOF
- 清理并重建缓存:
bash复制yum clean all
yum makecache
经验分享:如果同时需要第三方软件包,可以配置EPEL源。但要注意EPEL与基础源的优先级,避免依赖冲突。建议安装yum-plugin-priorities并设置合理的优先级数值。
3. LNMP环境安装与配置
3.1 Nginx安装与优化
Nginx作为前端Web服务器,其配置直接影响论坛的访问性能。安装最新稳定版:
bash复制yum install -y nginx
关键配置位于/etc/nginx/nginx.conf,建议进行以下优化:
- 调整worker进程数(通常设置为CPU核心数):
nginx复制worker_processes auto;
- 配置高效的事件模型:
nginx复制events {
worker_connections 1024;
use epoll;
multi_accept on;
}
- 启用Gzip压缩减少传输量:
nginx复制gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml;
启动Nginx并设置开机自启:
bash复制systemctl enable --now nginx
3.2 MariaDB数据库部署
MariaDB是MySQL的替代品,完全兼容MySQL协议。安装时建议选择较新的10.5+版本:
bash复制yum install -y mariadb-server mariadb
初始化数据库安全设置:
bash复制mysql_secure_installation
创建专用数据库和用户:
sql复制CREATE DATABASE discuz DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON discuz.* TO 'discuzuser'@'localhost' IDENTIFIED BY 'StrongPassword123!';
FLUSH PRIVILEGES;
安全提示:生产环境务必使用复杂密码,并限制用户权限为最小必需。定期备份数据库是必须养成的习惯。
3.3 PHP环境调优
Discuz X3.5需要PHP 7.3+环境。安装必要扩展:
bash复制yum install -y php php-fpm php-mysqlnd php-gd php-mbstring php-xml
配置PHP-FPM(/etc/php-fpm.d/www.conf):
ini复制user = nginx
group = nginx
listen = /run/php-fpm/www.sock
listen.owner = nginx
listen.group = nginx
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
调整PHP核心参数(/etc/php.ini):
ini复制memory_limit = 256M
upload_max_filesize = 20M
post_max_size = 22M
max_execution_time = 300
date.timezone = Asia/Shanghai
4. Discuz论坛部署实战
4.1 文件准备与权限设置
从官方Gitee仓库下载最新版Discuz X3.5:
bash复制wget https://gitee.com/Discuz/DiscuzX/attach_files/2044572/download -O Discuz_X3.5_SC_UTF8.zip
解压并部署到Web目录:
bash复制unzip Discuz_X3.5_SC_UTF8.zip
mv upload /usr/share/nginx/html/discuz
chown -R nginx:nginx /usr/share/nginx/html/discuz
find /usr/share/nginx/html/discuz -type d -exec chmod 755 {} \;
find /usr/share/nginx/html/discuz -type f -exec chmod 644 {} \;
重要提示:不要盲目设置777权限,这会导致严重的安全风险。正确的做法是根据进程运行用户设置最小必需权限。
4.2 Nginx虚拟主机配置
创建专用配置文件/etc/nginx/conf.d/discuz.conf:
nginx复制server {
listen 80;
server_name your-domain.com;
root /usr/share/nginx/html/discuz;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
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 ~ /\.ht {
deny all;
}
}
测试配置并重载:
bash复制nginx -t
systemctl reload nginx
5. 安装向导与后续优化
5.1 图形化安装过程
访问服务器IP或域名开始安装:
- 同意许可协议后,检查环境是否符合要求
- 配置数据库连接:
- 数据库服务器:localhost
- 数据库名:discuz
- 用户名:discuzuser
- 密码:StrongPassword123!
- 设置管理员账号(务必使用强密码)
- 完成安装后删除install目录
5.2 性能与安全加固
- 配置OPcache加速PHP:
ini复制zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
- 添加基础防火墙规则:
bash复制firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
- 设置定期自动备份:
bash复制# 数据库备份
0 3 * * * mysqldump -u discuzuser -p'StrongPassword123!' discuz > /backup/discuz_$(date +\%F).sql
# 文件备份
0 4 * * * tar czf /backup/discuz_files_$(date +\%F).tar.gz /usr/share/nginx/html/discuz
6. 常见问题排查
6.1 502 Bad Gateway错误
可能原因及解决方案:
- PHP-FPM未运行:
bash复制systemctl status php-fpm
systemctl start php-fpm
- Socket文件权限问题:
bash复制chown nginx:nginx /run/php-fpm/www.sock
- Nginx与PHP-FPM配置不一致:
检查fastcgi_pass参数是否匹配实际socket路径
6.2 数据库连接失败
检查要点:
- MariaDB服务状态:
bash复制systemctl status mariadb
- 用户权限:
sql复制SHOW GRANTS FOR 'discuzuser'@'localhost';
- 防火墙设置:
bash复制firewall-cmd --list-all | grep mysql
6.3 文件上传限制
需要同时调整以下参数:
- PHP配置:
ini复制upload_max_filesize = 50M
post_max_size = 52M
- Nginx配置:
nginx复制client_max_body_size 50m;
修改后需要重启相关服务:
bash复制systemctl restart php-fpm nginx
在实际部署过程中,我发现很多问题都源于权限配置不当或服务之间版本不兼容。建议在正式上线前进行全面测试,包括压力测试和安全扫描。对于高流量站点,可以考虑增加Redis缓存、配置CDN等进一步优化措施。