1. 项目概述
作为一名有着十年运维经验的工程师,我经常需要为不同业务搭建Web环境。今天要分享的是在RHEL9.3系统上部署LNMP环境并搭建Discuz论坛的完整过程。这个方案特别适合中小型社区网站,日均PV在5万以下的场景都能稳定运行。
为什么选择LNMP架构?相比传统的LAMP(Apache),Nginx在处理静态资源和高并发请求时效率更高,内存占用更少。而MariaDB作为MySQL的分支,完全兼容MySQL协议,在性能和安全方面还有额外优化。这个组合在资源有限的虚拟机环境中表现尤为出色。
2. 环境准备
2.1 硬件与软件需求
基础配置要求:
- 虚拟机配置:至少2核CPU/2GB内存/20GB磁盘空间
- 宿主机建议配置:i5以上CPU/8GB内存/100GB可用空间
软件版本选择考量:
- VMware Workstation Pro 17:相比免费版提供了更完善的快照管理和克隆功能
- RHEL9.3:选择这个版本是因为其长期支持周期到2032年,适合生产环境
- Discuz X3.5 UTF-8版:这是目前最新的稳定版,修复了X3.4的安全漏洞
提示:虽然可以使用CentOS Stream,但对于生产环境建议使用RHEL或Rocky Linux等更稳定的发行版
2.2 系统安装细节
分区方案设计原理:
- /boot: 400MB足够存放多个内核版本
- swap: 按照内存的2倍设置(内存<4GB时),但不超过8GB
- /: 剩余空间分配给根分区,采用xfs文件系统(RHEL9默认)
- /boot/efi: UEFI启动必需的分区
安全加固建议:
- 虽然实验中关闭了防火墙,但在生产环境应该:
bash复制firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
- SELinux可以设置为宽容模式而非完全关闭:
bash复制setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
3. LNMP环境部署
3.1 组件安装与配置
PHP优化配置:
安装完成后需要调整/etc/php.ini中的关键参数:
ini复制memory_limit = 128M
upload_max_filesize = 20M
post_max_size = 22M
max_execution_time = 120
Nginx性能调优:
编辑/etc/nginx/nginx.conf,在events区块添加:
nginx复制worker_connections 1024;
multi_accept on;
use epoll;
MariaDB安全设置:
安装后必须运行安全脚本:
bash复制mysql_secure_installation
会提示设置root密码、移除匿名用户、禁止root远程登录等
3.2 数据库配置详解
创建数据库时建议指定字符集:
sql复制CREATE DATABASE luntan CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
用户权限最佳实践:
不应该直接使用root账户连接应用,应该创建专用用户:
sql复制CREATE USER 'dzuser'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON luntan.* TO 'dzuser'@'localhost';
FLUSH PRIVILEGES;
4. Discuz论坛部署
4.1 文件权限管理
更安全的权限设置方案:
bash复制chown -R nginx:nginx /upload
find /upload -type d -exec chmod 755 {} \;
find /upload -type f -exec chmod 644 {} \;
chmod 777 /upload/config /upload/data /upload/uc_client/data /upload/uc_server/data
4.2 Nginx虚拟主机配置
推荐使用独立的server块配置,而不是直接修改nginx.conf:
nginx复制server {
listen 80;
server_name forum.example.com;
root /upload;
index index.php;
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;
}
}
5. 安装后优化
5.1 性能调优
OPcache配置:
在/etc/php.d/10-opcache.ini中添加:
ini复制opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
MySQL缓冲池设置:
编辑/etc/my.cnf.d/mariadb-server.cnf:
ini复制[mysqld]
innodb_buffer_pool_size = 256M
query_cache_size = 32M
5.2 安全加固
-
修改后台路径:
将/admin.php重命名为自定义名称如/mysecretadmin.php -
安装安全插件:
- 腾讯云验证码插件
- 登录失败限制插件
-
定期备份策略:
bash复制# 数据库备份
mysqldump -u root -p luntan > /backup/dz_$(date +%F).sql
# 文件备份
tar czf /backup/dzfiles_$(date +%F).tar.gz /upload
6. 常见问题排查
6.1 安装问题
502 Bad Gateway错误:
- 检查PHP-FPM是否运行:
bash复制systemctl status php-fpm
- 确认socket文件路径是否匹配:
bash复制ls -l /run/php-fpm/www.sock
数据库连接失败:
- 检查MariaDB绑定地址:
ini复制# /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
bind-address = 0.0.0.0
- 检查用户权限:
sql复制SHOW GRANTS FOR 'dzuser'@'localhost';
6.2 性能问题
论坛响应缓慢:
- 检查Nginx错误日志:
bash复制tail -f /var/log/nginx/error.log
- 分析MySQL慢查询:
sql复制SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
7. 运维监控方案
7.1 基础监控配置
系统资源监控:
安装并配置Netdata:
bash复制bash <(curl -Ss https://my-netdata.io/kickstart.sh)
日志集中管理:
配置ELK Stack:
- 安装Filebeat收集Nginx日志
- 配置Logstash解析规则
- 在Kibana创建监控仪表盘
7.2 自动化维护
使用cron定时任务:
bash复制# 每天凌晨3点清理临时文件
0 3 * * * find /upload/data/tmp -type f -mtime +7 -delete
# 每周日1点自动备份
0 1 * * 0 /root/scripts/backup_dz.sh
编写维护脚本示例:
bash复制#!/bin/bash
# 论坛维护脚本
DB_USER="dzuser"
DB_PASS="password"
BACKUP_DIR="/backup"
# 1. 备份数据库
mysqldump -u$DB_USER -p$DB_PASS luntan > $BACKUP_DIR/dz_$(date +%F).sql
# 2. 检查磁盘空间
df -h > $BACKUP_DIR/disk_usage_$(date +%F).log
# 3. 重启服务
systemctl restart nginx php-fpm mariadb
在实际运维中,我发现很多问题都源于权限设置不当和服务配置错误。建议在每次修改配置后,先使用nginx -t测试配置语法,再重启服务。对于生产环境,最好先在测试服务器验证所有变更。